資料庫庫基礎05——單表查詢
資料庫庫基礎05——單表查詢
一、簡單SELECT 查詢
語法:select [distinct]* |列名,列名 from 表[where 條件]
在處理 SQL 語句時,其中所有空格都被忽略。
SQL 語句不區分大小寫 ,為了可讀性更強建議區分
多條 SQL 語句必須以分號(; )分隔。 (有的資料庫也可以不加,但是加上沒壞處)
1、檢索單個列 SELECT prod_name FROM products;
2、檢索多個列 SELECT prod_id, prod_name, prod_price FROM products;
3、檢索所有列 SELECT * FROM products;
4、檢索不同的值(去重) SELECT DISTINCT vend_id FROM products;
5、限制查詢行數
SQL Server 和 Access 使用TOP 關鍵字:
SELECT TOP 5 prod_name FROM Products;
DB2,很可能習慣使用下面這一 DBMS 特定的 SQL 語句 :
SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;
Oracle,需要基於 ROWNUM
SELECT prod_name FROM Products WHERE ROWNUM <=5;
MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT子句 :
SELECT prod_name FROM Products LIMIT 5;
limit: 限制條數,如果是要查詢指定區間的資料,比如從第2行(不包括2)開始數後面5行
SELECT * from products LIMIT 5 OFFSET 2;
表示,3,4,5,6,7 這5行的資料
提示:MySQL 和 MariaDB 捷徑
MySQL和 MariaDB支援簡化版的LIMIT 4 OFFSET 3語句,即LIMIT 3,4。
使用這個語法,逗號之前的值對應 OFFSET,逗號之後的值對應 LIMIT。
6、註釋
行內註釋:註釋使用-- (兩個連字元)嵌在行內。 – 之後的文字就是註釋 ;
單行註釋:#
多行:/* */
二、單條件查詢 (where關鍵字)
操作符 | 說明 | 操作符 | 說明 |
---|---|---|---|
= | 等於 | > | 大於 |
<> | 不等於 | >= | 大於等於 |
!= | 不等於 | !> | 不大於 |
< | 小於 | BETWEEN | 在指定的兩個值之間 |
< | 小於等於 | IS NULL | 為NULL值 |
!< | 不小於 | EXISTS | 是否存在滿足 特定條件的記錄 |
注意:並非所有 DBMS 都支援這些操作符
如果將值與字串型別的列進行比較,就需要限定引號。用來與數值列進行比較的值不用引號。
字串、時間用單引號,數值不需要引號
還有:ALL 、SOME、ANY 區別如下:
All:對所有資料都滿足條件,整個條件才成立 ,例如:5000大於所有返回的薪水
Any:只要有一條資料滿足條件,整個條件成立,例如,5000大於薪水中的3000,10000,7000
Some的作用和Any一樣 。Some是 Any的別名select * from products where prod_price < All(—條件—)
例子:
1、(單個值比較)列出所有價格小於 10 美元的產品 :
SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;
2、(不匹配)列出所有不是供應商 DLL01 製造的產品 :
SELECT vend_id,prod_name FROM products WHERE vend_id != 'DLL01';
或
SELECT vend_id,prod_name FROM products WHERE vend_id <> 'DLL01';
3、(Between)檢索價格在 5 美元和 10美元之間的所有產品
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
4、(空值檢查 is null)查詢所有沒有電子郵件地址的資料
SELECT cust_name FROM customers where cust_email IS NULL;
三、多條件查詢
1、AND和OR
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' AND vend_id = 'BRS01';
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
注意: and 和or 同時用,and的優先順序高於,or;;所以:任何時候使用具有 AND 和 OR 操作符的 WHERE 子句,都應該使用圓括號明確地分組操作符。
例如:比較下面兩種是不一樣的
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
2、IN 操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;
**3、NOT 操作符 **
WHERE 子句中的 NOT 操作符有且只有一個功能,那就是否定其後所跟的任何條件。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id NOT IN ( 'DLL01', 'BRS01' )
ORDER BY prod_name;
四、萬用字元查詢——LIKE操作符(術語叫謂詞)
只能用於文字欄位(字串) ;區分大小寫
1、百分號(%)萬用字元 :%表示任何字元出現任意次數 ,如查詢所有以商品名以Fish開頭的。。
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%';
還可以%abc%
表示條件包含abc字串,a%c
表示條件以a開頭c結尾,中間可以是任何資料
WHERE prod_name LIKE '%'不會匹配產品名稱為 NULL 的行
2、下劃線(_)萬用字元 :只匹配單個字元,而不是多個字元
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '_ inch teddy bear';
只能匹配prod_name為 8 inch teddy bear ,因為下劃線只能匹配一個字元,不能多也不能少,如果是__兩個下劃線就會匹配:12 inch teddy bear 和18 inch teddy bear
3、方括號([ ])萬用字元 (只有微軟的 Access 和 SQL Server 支援集合。 )
方括號([])萬用字元用來指定一個字符集,它必須匹配指定位置(萬用字元的位置)的一個字元 。
關於萬用字元的使用:
- 不要過度使用萬用字元。如果其他操作符能達到相同的目的,應該使用其他操作符。
- 在確實需要使用萬用字元時,也儘量不要把它們用在搜尋模式的開始處。把萬用字元置於開始處,搜尋起來是最慢的。
- 仔細注意萬用字元的位置。如果放錯地方,可能不會返回想要的資料。
五、建立計算欄位
1、拼接欄位
concatenate 將值聯結到一起(將一個值附加到另一個值)構成單個值
根據你所使用的 DBMS,此操作符可用加號(+)或兩個豎槓(||)表示。在 MySQL 和 MariaDB 中,必須使用
特殊的函式。
Access 和 SQL Server 使用**+號**。
DB2、 Oracle、 PostgreSQL、 SQLite 和Open Office Base 使用**||**。
例如:
SELECT vend_name + ' (' + vend_country + ')' FROM Vendors ORDER BY vend_name;
SELECT vend_name || ' (' || vend_country || ')' FROM Vendors ORDER BY vend_name;
但是這樣會有空格,需要用**RTRIM ()**去掉多餘空格,修改為如下:
SELECT RTRIM(vend_name)+ ' (' + RTRIM(vend_country)+ ')' FROM Vendors ORDER BY vend_name;
SELECT RTRIM(vend_name)|| ' (' || RTRIM(vend_country)|| ')' FROM Vendors ORDER BY vend_name;
MySQL 或 MariaDB :使用**Concat()**函式,內容逗號隔開:如下
SELECT Concat(vend_name, ' (', vend_country, ')') FROM Vendors ORDER BY vend_name;
說明:TRIM 函式
大多數 DBMS 都支援 RTRIM()(正如剛才所見,它去掉字串右邊的空格)、LTRIM()(去掉字串左邊的空格)以及
TRIM()(去掉字串左右兩邊的空格)。
2、使用別名
別名(alias)是一個欄位或值的替換名。別名用 AS 關鍵字賦予。 別名有時也稱為匯出列(derived column)
上面的sql可以改為如下:
-- Sql Server
SELECT RTRIM(vend_name)+ ' (' + RTRIM(vend_country)+ ')' AS vend_title FROM Vendors ORDER BY vend_name;
-- Oracle
SELECT RTRIM(vend_name)|| ' (' || RTRIM(vend_country)|| ')' AS vend_title FROM Vendors ORDER BY vend_name;
-- MySql 和MariaDB
SELECT Concat(vend_name, ' (', vend_country, ')') AS vend_title FROM Vendors ORDER BY vend_name;
這樣查出的資料就可以被使用了,vend_title就是生成的計算欄位,作為查詢結果的別名被外部使用
提示:別名的其他用途
別名還有其他用途。常見的用途包括在實際的表列名包含不合法的字元(如空格)時重新命名它,在原來的名字含混或容易誤解時擴充它。
別名最常見的使用是將多個單詞的列名重新命名為一個單詞的名字。即:最好重新命名並且可讀
**3、執行算術計算 **
例如:查詢貨物表的數量,單價,並且計算總價
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num=20008;
還支援其他操作符:
操作符 | 說明 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
SELECT語句如果省略FROM字句可以進行簡單測試如: SELECT 3 * 2;將返回 6, SELECT Trim(’ abc ');
將返回 abc
六、排序檢索資料
1、ORDER BY :
在指定一條 ORDER BY 子句時,應該保證它是 SELECT 語句中最後一條子句
如:SELECT prod_name FROM Products ORDER BY prod_name;
2、指定排序方向(asc 和desc,預設升序asc 可省略)
SELECT prod_name FROM Products ORDER BY prod_name;--升序
SELECT prod_name FROM Products ORDER BY prod_name DESC;--降序
3、按多個列排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price,prod_name;
/*先按照價格排序,然後再按照商品名排序,第二個條件是在第一個條件的基礎上排序的,不會改變prod_price的順序,除非在商品價格相同的情況,prod_name才起作用*/
--換句話說,比如先按姓排序,再按照名字排序
4、按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
--查詢結果和上面3相同,其實就是先按照第2列prod_price排序,再按照第3列prod_name排序