1. 程式人生 > >資料庫庫基礎05——單表查詢

資料庫庫基礎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;

MySQLMariaDBPostgreSQL 或者 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 捷徑


MySQLMariaDB支援簡化版的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排序