1. 程式人生 > 其它 >SQL基礎-第2章 查詢基礎

SQL基礎-第2章 查詢基礎

2-1 SELECT語句基礎

列的查詢

<!--基本的SELECT語句-->
SELECT <列名>,…… FROM <表名>;

<!--從Product表中輸出3列-->
SELECT product_id, product_name, purchase_price FROM Product;

查詢出表中所有的列

<!--查詢全部的列-->
SELECT * FROM <表名>;

星號( *)代表全部列的意思。

為列設定別名

設定中文別名

SELECT product_id AS "商品編號",
product_name AS "商品名稱",
purchase_price AS "進貨單價"
FROM Product;

常數的查詢

SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
product_id, product_name
FROM Product;

從結果中刪除重複行

<!--在SELECT語句中使用DISTINCT可以刪除重複行-->
SELECT DISTINCT product_type
FROM Product;

DISTINCT 關鍵字只能用在第一個列名之前

根據WHERE語句來選擇記錄

<!--SELECT語句中的WHERE子句-->
SELECT <列名>, ……
FROM <表名>
WHERE <條件表示式>;
<!--用來選取product_type列為'衣服'的記錄的SELECT語句-->
SELECT product_name, product_type
FROM Product
WHERE product_type = '衣服';

WHERE子句要緊跟在FROM子句之後

註釋的書寫方法

1行註釋的使用示例

-- 本SELECT語句會從結果中刪除重複行。
SELECT DISTINCT product_id, purchase_price
FROM Product;

多行註釋的使用示例

/* 本SELECT語句,
會從結果中刪除重複行。 */
SELECT DISTINCT product_id, purchase_price
FROM Product;

2-2

算術運算子

-- SQL語句中也可以使用運算表示式
SELECT product_name, sale_price,
sale_price * 2 AS "sale_price_x2"
FROM Product;

SELECT子句中可以使用常數或者表示式。

需要注意NULL

所有包含 NULL 的計算,結果肯定是 NULL
只有 NULL 除以 0 時不會發生錯誤,並且結果還是 NULL。

比較運算子

-- 選取出sale_price列為500的記錄
SELECT product_name, product_type
FROM Product
WHERE sale_price = 500;
運算子 含義
= 和~相等
<> 和~不相等
>= 大於等於~
> 大於~
<= 小於等於~
< 小於~
-- 選取出銷售單價大於等於1000日元的記錄
SELECT product_name, product_type, sale_price
FROM Product
WHERE sale_price >= 1000;
-- 選取出登記日期在2009年9月27日之前的記錄
SELECT product_name, product_type, regist_date
FROM Product
WHERE regist_date < '2009-09-27';
-- WHERE子句的條件表示式中也可以使用計算表示式
SELECT product_name, sale_price, purchase_price
FROM Product
WHERE sale_price - purchase_price >= 500;

對字串使用不等號時的注意事項

-- 建立Chars表並插入資料
-- DDL :建立表
CREATE TABLE Chars(
chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));

-- DML :插入資料
START TRANSACTION; 
INSERT INTO Chars VALUES ('1');
INSERT INTO Chars VALUES ('2');
INSERT INTO Chars VALUES ('3');
INSERT INTO Chars VALUES ('10');
INSERT INTO Chars VALUES ('11');
INSERT INTO Chars VALUES ('222');
COMMIT;

-- 選取出大於'2'的資料的SELECT語句
SELECT chr
FROM Chars
WHERE chr > '2';

不能對NULL使用比較運算子

-- 選取進貨單價為2800日元的記錄
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price = 2800;

-- 選取出進貨單價不是2800日元的記錄
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price <> 2800;

-- 選取NULL的記錄
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IS NULL;

-- 選取不為NULL的記錄
SELECT product_name, purchase_price
FROM Product
WHERE purchase_price IS NOT NULL;

2-3 邏輯運算子

NOT運算子

-- 選取出銷售單價大於等於1000日元的記錄
SELECT product_name, product_type, sale_price
FROM Product
WHERE sale_price >= 1000;

-- 查詢條件中新增NOT運算子
SELECT product_name, product_type, sale_price
FROM Product
WHERE NOT sale_price >= 1000;

-- WHERE子句的查詢條件和查詢條件是等價的
SELECT product_name, product_type
FROM Product
WHERE sale_price < 1000;

AND運算子和OR運算子

  • AND 運算子在其兩側的查詢條件都成立時整個查詢條件才成立,其意思相當於“並且”。
  • OR 運算子在其兩側的查詢條件有一個成立時整個查詢條件都成立,其意思相當於“或者”
-- 在WHERE子句的查詢條件中使用AND運算子
SELECT product_name, purchase_price
FROM Product
WHERE product_type = '廚房用具'
AND sale_price >= 3000;

-- 在WHERE子句的查詢條件中使用OR運算子
SELECT product_name, purchase_price
FROM Product
WHERE product_type = '廚房用具'
OR sale_price >= 3000;

通過括號強化處理

AND運算子的優先順序高於OR運算子。想要優先執行OR運算子時可以使用括號。

-- 將查詢條件原封不動地寫入條件表示式
SELECT product_name, product_type, regist_date
FROM Product
WHERE product_type = '辦公用品'
AND regist_date = '2009-09-11'
OR regist_date = '2009-09-20';

-- 通過使用括號讓OR運算子先於AND運算子執行
SELECT product_name, product_type, regist_date
FROM Product
WHERE product_type = '辦公用品'
AND ( regist_date = '2009-09-11'
OR regist_date = '2009-09-20');

邏輯運算子和真值

  • 使用 AND 運算子進行的邏輯運算稱為邏輯積
  • 使用 OR 運算子進行的邏輯運算稱為邏輯和

含有NULL時的真值

SQL 之外的語言也基本上只使用真和假這兩種真值。與通常的邏輯運算被稱為二值邏輯相對,只有 SQL 中的邏輯運算被稱為三值邏輯。 不確定(UNKNOWN)

練習題

  • 2.1 編寫一條 SQL 語句,從 Product(商品)表中選取出“登記日期( regist_date)在 2009 年 4 月 28 日之後”的商品。查詢結果要包含 product_name 和 regist_date 兩列。
SELECT product_name, regist_date FROM Product WHERE regist_date > '2009-04-28';
  • 2.2 請說出對 Product 表執行如下 3 條 SELECT 語句時的返回結果。
① 
SELECT *
FROM Product
WHERE purchase_price = NULL;

② 
SELECT *
FROM Product
WHERE purchase_price <> NULL;

③ 
SELECT *
FROM Product
WHERE product_name > NULL;

結果:
① ~ ③中的 SQL 語句都無法選取出任何一條記錄。

  • 2.3 程式碼清單 2-22(2-2 節)中的 SELECT 語句能夠從 Product 表中取出“銷售單價( sale_price)比進貨單價( purchase_price)高出 500日元以上”的商品。
    請寫出兩條可以得到相同結果的 SELECT 語句。執行結果如下所示。
SELECT product_name, sale_price, purchase_price FROM Product WHERE (sale_price - purchase_price) >= 500;
SELECT product_name, sale_price, purchase_price FROM Product WHERE NOT (sale_price - purchase_price) < 500;
  • 2.4 請寫出一條 SELECT 語句,從 Product 表中選取出滿足“銷售單價打九折之後利潤高於 100 日元的辦公用品和廚房用具”條件的記錄。
    查詢結果要包括 product_name 列、 product_type 列以及銷售單價打九折之後的利潤(別名設定為 profit)。
    提示:銷售單價打九折,可以通過 sale_price 列的值乘以 0.9 獲得,利潤可以通過該值減去 purchase_price 列的值獲得。
SELECT product_name, product_type, (sale_price * 0.9) AS profit 
FROM Product 
WHERE (sale_price * 0.9 - purchase_price) > 100
AND (product_type = '辦公用品' OR product_type = '廚房用具');