「SQL」修訂間的差異
跳至導覽
跳至搜尋
(→Join關係) |
小 (removed Category:SQL using HotCat) |
||
行 213: | 行 213: | ||
− | |||
[[Category:資料分頁]] | [[Category:資料分頁]] |
於 2018年4月7日 (六) 15:23 的修訂
SQL(Structured Query Language),參照:『維基百科~SQL』
SQL的版本
- 標準
- 參照:『維基百科~SQL-92』
- 參照:『維基百科~SQL:1999』
- 參照:『維基百科~SQL:2003』
- 參照:『維基百科~SQL:2008』
- 參照:『維基百科~SQL:2011』
- 主要分支版本
- T-SQL,參照:『維基百科~Transact-SQL』
- PL/SQL,參照:『維基百科~PL/SQL』
- SQL/PSM,參照:『維基百科~SQL/PSM』
SQL基本語法
查詢(Select)
- 參照:『維基百科~Select_(SQL)』
- 基本模式
SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ORDER BY [排序欄位] [ASC/DESC]
- 相同欄位的多個查詢結果串接(也可使用不同來源的資料表)
SELECT [欄位1, 欄位2, ...] FROM [資料表1] WHERE [篩選條件1] UNION SELECT [欄位1, 欄位2, ...] FROM [資料表2] WHERE [篩選條件2]
插入(Insert)
- 參照:『維基百科~Insert_(SQL)』
- 基本模式
INSERT INTO [資料表] ([欄位1, 欄位2, ...]) VALUES ([欄位值1, 欄位值2, ...])
- 插入多筆資料(SQL Server 2008以上, 或是MySQL等才支援)
INSERT INTO [資料表] VALUES ([欄位值1, 欄位值2, ...]) ,([欄位值1, 欄位值2, ...]) ,([欄位值1, 欄位值2, ...])
- 從另一個資料表取資料,插入到另一個資料表之中
INSERT INTO [資料表] ([欄位1, 欄位2, ...]) SELECT ([欄位1, 欄位2, ...]) FROM [來源資料表] WHERE [篩選條件]
更新(Update)
- 參照:『維基百科~Update_(SQL)』
- 基本模式
UPDATE [資料表] SET [欄位1 = 欄位值1, 欄位2 = 欄位值2 ...] WHERE [篩選條件]
- 從別的資料表中取出資料,更新到資料表
UPDATE [資料表] SET [欄位1=a.欄位1, 欄位2=a.欄位2 ....] FROM [來源資料表] AS a WHERE [篩選條件]
刪除(Delete)
- 參照:『維基百科~Delete_(SQL)』
- 基本模式
DELETE FROM [資料表] WHERE [篩選條件]
SQL分頁select
分頁前SQL
SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ORDER BY [排序欄位] [ASC/DESC]
MS-SQL
MS-SQL Type A
- 無排序,在關聯式查詢時,可能導致每次查詢同一分頁的資料時,出來的資料都不一樣。
SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [主要索引欄位] IN ( SELECT * FROM ( SELECT TOP [每頁長度*第幾頁] [主要索引欄位] FROM [資料表] WHERE [篩選條件] ) as [資料表别名1] WHERE [主要索引欄位] NOT IN ( SELECT TOP [每頁長度] [主要索引欄位] FROM [資料表] WHERE [篩選條件] ) )
MS-SQL Type B
- 有排序,又稱【夾擠式分頁查詢】。MS-SQL 2000以前,常見的分頁用語法。
SELECT * FROM ( SELECT TOP [每頁長度] * FROM ( SELECT TOP [每頁長度*第幾頁] [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ORDER BY [排序欄位] [DESC/ASC] ) as [資料表别名1] ORDER BY [排序欄位] [ASC/DESC] ) as [資料表别名2] ORDER BY [排序欄位] [DESC/ASC]
MS-SQL Type C
- MS-SQL 2005以後才有RANK()語法。需特別注意,當RANK()裡的排序條件只有1個欄位,且此欄位的值都一樣時,會導致RankNumber都會變成1,導致分頁失效,需在排序條件中加上一個有唯一值的欄位。
SELECT * FROM ( SELECT rank() over ( ORDER BY [排序欄位] [ASC/DESC] ) as RankNumber, * FROM ( SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ) as [資料表别名1] ) as [資料表别名2] WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁]
MS-SQL Type D
- MS-SQL 2000可用,但Select時,不可包含PK用的欄位。(需透過暫存資料表操作)
- 參考資料:(SQL)抽獎,亂數抽出10筆中獎資料並排名
SELECT IDENTITY(int,1,1) as RankNumber, [欄位1, 欄位2, ...] INTO [#暫存資料表名稱] FROM [資料表] ORDER BY [排序欄位] [ASC/DESC]; SELECT * FROM [#暫存資料表名稱] WHERE RankNumber between [每頁長度*(第幾頁-1)] and [每頁長度*第幾頁]; drop table [#暫存資料表名稱];
其他相關
- (以SQL預存程序實作SQL-Sever的北風資料庫的分頁範例)
MySQL
SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ORDER BY [排序欄位] [ASC/DESC] LIMIT [每頁長度] OFFSET [每頁長度*第幾頁]
Oracle
- 使用ROWNUM做分頁
SELECT * FROM ( SELECT [欄位1, 欄位2, ...] FROM [資料表] WHERE [篩選條件] ORDER BY [排序欄位] [ASC/DESC] ) WHERE ROWNUM >= [每頁長度*(第幾頁-1)+1] AND ROWNUM <= [每頁長度*第幾頁]
Join關係
- 圖檔出處:Facebook(MSDN 台灣)
相關
Connection Strings
SQL資料隱碼
FAQ
當Table或欄位的名稱衝到SQL預設的保留字時
- MS-SQL 或 MS-Access 使用 [與] 來將衝突的Table或欄位的名稱包起來。
- Oracle 或 IBM-DB2 或 PostgreSQL 使用雙引號字元 " 來將衝突的Table或欄位的名稱包起來。
- MySQL 使用反單引號字元 ` 來將衝突的Table或欄位的名稱包起來。
跨資料庫轉換
- 相關軟體