SQL的高階教程(一)
1、select top, limit, rownum 子句
select top子句
select top子句用於規定要返回的記錄的數目。select top子句對於擁有數千條記錄的大型表來說,是非常有用的。
註釋:並非所有的資料庫系統都支援 SELECT TOP 子句。
SQL Server / MS Access 語法
SELECT TOP number|percent column_name(s) FROM table_name;
MySQL 和 Oracle 中的 SQL select top 是等價的
Mysql語法例項:返回前五條資料SELECT column_name(s) FROM table_name LIMIT number;
SELECT * FROM Persons LIMIT 5;
Oracle語法
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;
例項SELECT * FROM Persons WHERE ROWNUM <=5;
演示資料庫
在本教程中,我們將使用 RUNOOB 樣本資料庫。
下面是選自 "Websites" 表的資料:
mysql> SELECT * FROM Websites;+----+---------------+---------------------------+-------+---------+下面的 SQL 語句從 "Websites" 表中選取頭兩條記錄:| id | name | url | alexa | country |+----+---------------+---------------------------+-------+---------+|1|Google| https://www.google.cm/ | 1 | USA ||2|淘寶| https://www.taobao.com/ | 13 | CN ||3|菜鳥教程| http://www.runoob.com/ | 5000 | USA ||4|微博| http://weibo.com/ | 20 | CN ||5|Facebook| https://www.facebook.com/ | 3 | USA ||7| stackoverflow | http://stackoverflow.com/ | 0 | IND |+----+---------------+---------------------------+-------+---------+
SELECT * FROM Websites LIMIT 2;
SELECT TOP PERCENT 例項
在 Microsoft SQL Server 中還可以使用百分比作為引數。
下面的 SQL 語句從 "Customers" 表中選取前面 50% 的記錄:
SELECT TOP 50 PERCENT * FROM Websites;
LIKE 操作符
like 操作符用於在 WHERE 子句中搜索列中的指定模式。語法
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
演示資料庫
在本教程中,我們將使用 RUNOOB 樣本資料庫。
下面是選自 "Websites" 表的資料:
+----+--------------+---------------------------+-------+---------+| id | name | url | alexa | country |+----+--------------+---------------------------+-------+---------+|1|Google| https://www.google.cm/ | 1 | USA ||2|淘寶| https://www.taobao.com/ | 13 | CN ||3|菜鳥教程| http://www.runoob.com/ | 4689 | CN ||4|微博| http://weibo.com/ | 20 | CN ||5|Facebook| https://www.facebook.com/ | 3 | USA ||7| stackoverflow| http://stackoverflow.com/ | 0 | IND |+----+---------------+---------------------------+-------+---------+下面的 SQL 語句選取 name 以字母 "G" 開始的所有客戶:
SELECT * FROM Websites WHERE name LIKE 'G%';
提示:"%" 符號用於在模式的前後定義萬用字元(預設字母)。您將在下一章中學習更多有關萬用字元的知識。
下面的 SQL 語句選取 name 以字母 "k" 結尾的所有客戶:
SELECT * FROM Websites WHERE name LIKE '%k';
下面的 SQL 語句選取 name 包含模式 "oo" 的所有客戶:SELECT * FROM Websites WHERE name LIKE '%oo%';
通過使用 NOT 關鍵字,您可以選取不匹配模式的記錄。
下面的 SQL 語句選取 name 不包含模式 "oo" 的所有客戶:
SELECT * FROM Websites WHERE name NOT LIKE '%oo%';
萬用字元
萬用字元可用於替代字串中的任何其他字元。在 SQL 中,萬用字元與 SQL LIKE 操作符一起使用。
SQL 萬用字元用於搜尋表中的資料。
在 SQL 中,可使用一下萬用字元:
萬用字元 | 描述 |
---|---|
% | 替代 0 個或多個字元 |
_ | 替代一個字元 |
[charlist] | 字元列中的任何單一字元 |
[^charlist] 或 [!charlist] |
不在字元列中的任何單一字元 |
演示資料庫
在本教程中,我們將使用 RUNOOB 樣本資料庫。
下面是選自 "Websites" 表的資料:
+----+--------------+---------------------------+-------+---------+| id | name | url | alexa | country |+----+--------------+---------------------------+-------+---------+|1|Google| https://www.google.cm/ | 1 | USA ||2|淘寶| https://www.taobao.com/ | 13 | CN ||3|菜鳥教程| http://www.runoob.com/ | 4689 | CN ||4|微博| http://weibo.com/ | 20 | CN ||5|Facebook| https://www.facebook.com/ | 3 | USA ||7| stackoverflow | http://stackoverflow.com/ | 0 | IND |+----+---------------+---------------------------+-------+---------+
使用 % 萬用字元
下面的 SQL 語句選取 url 以字母 "https" 開始的所有網站:SELECT * FROM Websites
WHERE url LIKE 'https%';
下面的 SQL 語句選取 url 包含模式 "oo" 的所有網站:SELECT * FROM Websites
WHERE url LIKE '%oo%';
使用 _ 萬用字元
下面的 SQL 語句選取 name 以一個任意字元開始,然後是 "oogle" 的所有客戶:SELECT * FROM Websites
WHERE name LIKE '_oogle';
下面的 SQL 語句選取 name 以 "G" 開始,然後是一個任意字元,然後是 "o",然後是一個任意字元,然後是 "le" 的所有網站:SELECT * FROM Websites
WHERE name LIKE 'G_o_le';
使用 [charlist] 萬用字元
MySQL 中使用 REGEXP 或 NOT REGEXP 運算子 (或 RLIKE 和 NOT RLIKE) 來操作正則表示式。
下面的 SQL 語句選取 name 以 "G"、"F" 或 "s" 開始的所有網站:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
下面的 SQL 語句選取 name 以 A 到 H 字母開頭的網站:SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';
下面的 SQL 語句選取 name 不以 A 到 H 字母開頭的網站:SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';
IN 操作符
in操作符允許您在 WHERE 子句中規定多個值。語法
SELECT column_name(s) FROM table_name
WHERE column_name IN (value1,value2,...);
演示資料庫
在本教程中,我們將使用 RUNOOB 樣本資料庫。
下面是選自 "Websites" 表的資料:
+----+--------------+---------------------------+-------+---------+| id | name | url | alexa | country |+----+--------------+---------------------------+-------+---------+|1|Google| https://www.google.cm/ | 1 | USA ||2|淘寶| https://www.taobao.com/ | 13 | CN ||3|菜鳥教程| http://www.runoob.com/ | 4689 | CN ||4|微博| http://weibo.com/ | 20 | CN ||5|Facebook| https://www.facebook.com/ | 3 | USA ||7| stackoverflow | http://stackoverflow.com/ | 0 | IND |+----+---------------+---------------------------+-------+---------+下面的 SQL 語句選取 name 為 "Google" 或 "菜鳥教程" 的所有網站:
SELECT * FROM Websites
WHERE name IN ('Google','菜鳥教程');
BETWEEN 操作符
between 操作符用於選取介於兩個值之間的資料範圍內的值。這些值可以是數值、文字或者日期。語法
SELECT column_name(s) FROM table_name
WHERE column_name BETWEEN value1 AND value2;
演示資料庫
在本教程中,我們將使用 RUNOOB 樣本資料庫。
下面是選自 "Websites" 表的資料:
+----+--------------+---------------------------+-------+---------+| id | name | url | alexa | country |+----+--------------+---------------------------+-------+---------+|1|Google| https://www.google.cm/ | 1 | USA ||2|淘寶| https://www.taobao.com/ | 13 | CN ||3|菜鳥教程| http://www.runoob.com/ | 4689 | CN ||4|微博| http://weibo.com/ | 20 | CN ||5|Facebook| https://www.facebook.com/ | 3 | USA ||7| stackoverflow| http://stackoverflow.com/ | 0 | IND |+----+---------------+---------------------------+-------+---------+下面的 SQL 語句選取 alexa 介於 1 和 20 之間的所有網站:
SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;
NOT BETWEEN 操作符例項
如需顯示不在上面例項範圍內的網站,請使用 NOT BETWEEN:SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;
帶有 IN 的 BETWEEN 操作符例項
下面的 SQL 語句選取alexa介於 1 和 20 之間但 country 不為 USA 和 IND 的所有網站:
SELECT * FROM Websites
WHERE (alexa BETWEEN 1 AND 20)
AND NOT country IN ('USA', 'IND');
帶有文字值的 BETWEEN 操作符例項
下面的 SQL 語句選取 name 以介於 'A' 和 'H' 之間字母開始的所有網站:
SELECT * FROM Websites
WHERE name BETWEEN 'A' AND 'H';
帶有文字值的 NOT BETWEEN 操作符例項
下面的 SQL 語句選取 name 不介於 'A' 和 'H' 之間字母開始的所有網站:
SELECT * FROM Websites
WHERE name NOT BETWEEN 'A' AND 'H';
帶有日期值的 BETWEEN 操作符例項
下面的 SQL 語句選取 date 介於 '2016-05-10' 和 '2016-05-14' 之間的所有訪問記錄SELECT * FROM access_log
WHERE date BETWEEN '2016-05-10' AND '2016-05-14';
請注意,在不同的資料庫中,BETWEEN 操作符會產生不同的結果!
在某些資料庫中,BETWEEN 選取介於兩個值之間但不包括兩個測試值的欄位。
在某些資料庫中,BETWEEN 選取介於兩個值之間且包括兩個測試值的欄位。
在某些資料庫中,BETWEEN 選取介於兩個值之間且包括第一個測試值但不包括最後一個測試值的欄位。
因此,請檢查您的資料庫是如何處理 BETWEEN 操作符!