SQL必知必會筆記(上)

一、基本概念

數據庫、表、列、行、主鍵、外鍵、關鍵字

二、檢索

1.檢索列

SELECT prod_name(id)(*)

FROM Products;

2.檢索不同值

SELECT DISTINCT vend_id

FROM Products;

三、排序

1.單列

ORDER BY prod_name;

--此句必須位於末尾

2.多列

ORDER BY prod_price, prod_name; --按列名

ORDER BY 2, 3; --按列位置

3.指定排序方向

ORDER BY prod_price DESC, prod_name; --僅前者降序

四、過濾數據

1.where 子句

WHERE prod_price = 3;

操作符 =//<>/>=/…

2.範圍值檢查

WHERE prod_price BETWEEN 5 AND 10;

3.空值檢查

WHERE prod_price IS NULL;

五、高級數據過濾

1.組合WHERE子句

AND操作符 OR操作符

WHERE vend_id = 'DLL01' AND prod_price <= 4;

WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

求值順序

用(圓括號)明確對操作符分組,保證順序理想

2.IN操作符

WHERE vend_id IN ( 'DLL01', 'BRS01' );

3.NOT操作符

WHERE NOT vend_id = 'DLL01' ; --相當於<>

六、用通配符進行過濾

1,LIKE

LIKE是謂詞而不是操作符

百分號%,星號*,表示任何字符出現任意次數

WHERE prod\_name LIKE 'Fish%';

WHERE prod\_name LIKE '%bean bag%';

下劃線_,匹配單個字符

WHERE prod_name LIKE '_inch teddy bear';

方括號[],匹配指定位置的一個字符

WHERE cust_contact LIKE '[JM]%'

LIKE '[^JM]%' or LIKE '[!JM]%'(否定)

2、技巧

儘量不要把它們用在搜索模式的開始處

不要過度使用

七、創建計算字段

1,計算字段

計算字段是運行時在SELECT語句內創建的。

2,拼接字段

SELECT vend_name + '(' + vend_country + ')'

FROM Vendors

ORDER BY vend_name;

去掉空格

TRIM()  LTRIM()  RTRIM()

去掉右邊的空格

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'

別名,是一個字段或值的替換名,用AS關鍵字賦予

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')' AS vend_title

3,執行算數計算(+ - * /)

SELECT prod_id, quantity, item_price,

      quantity*item_price AS expanded_price

八、使用函數處理數據

1,函數

與SQL 語句不一樣,SQL 函數不是可移植的。

2,使用函數

文本處理函數

返回字符串旁邊的字符 LEFT() RIGHT()

返回字符串的長度 LENGTH() or LEN()

轉換字符串大小寫LOWER() UPPER()

對字符串進行發音比較的轉換 SOUNDEX()

日期和時間處理函數

WHERE DATEPART(yy, order_date) = 2018;(SQL Server)

WHERE YEAR(order_date) = 2018;(MySQL)

WHERE DATEPART('yyyy', order_date) = 2012;(Access)

數值處理函數

返回絕對值 ABS()

返回正餘弦 SIN() COS()

返回平方/指數 SQRT() EXP()

九、彙總數據

1,聚集函數

返回單列平均值 AVG()

SELECT AVG(prod_price) AS avg_price

FROM Products

WHERE vend_id = 'DLL01'

返回列的行數 COUNT()

包括NULL COUNT(*)

具有特定值 COUNT(column)

返回數的最值 MAX() MIN()

用於文本數據時,MAX()MIN()返回按該列排序後的最後一行/最前面的行

返回和 SUM()

SELECT SUM(quantity) AS items_ordered

FROM Order_num = 2005;

2.聚集不同值

SELECT AVG(DISTINCT prod_price) AS avg_price

FROM Products

注:DISTINCT不能用於Access,不能用於COUNT(*),用於求最值無意義

3.組合聚集函數

SELECT COUNT(*) AS num_items,

      MIN(prod_price) AS price_min,

      MAX(prod_price) AS price_max,

      AVG(prod_price) AS price_avg

FROM Products;

十、分組數據

1,創建分組

SELECT vend_id, COUNT(*) AS num_prods

FROM Products

GROUP BY vend_id;

按vend_id排序並分組數據,對每個vend_id而不是整個表計算num_prods

GROUP BY 子句必須出現在WHERE 子句之後,ORDER BY 子句之前。

2,過濾分組

HAVING 支持所有WHERE 操作符

SELECT cust_id, COUNT(*) AS orders

FROM Orders

GROUP BY cust_id

HAVING COUNT(*) >= 2;

HAVING子句過濾COUNT(*) >= 2(兩個以上訂單)的那些分組

注:使用HAVING時應該結合GROUP BY子句,而WHERE子句用於標準的行級過濾

3,分組與排序

ORDER BY

一般在使用GROUP BY 子句時,應該也給出ORDER BY 子句。以保證數據排序正確。

SELECT order_num, COUNT(*) AS items

FROM OrderItems

GROUP BY order_num

HAVING COUNT(*) >= 3

ORDER BY items, order_num;

Access 不允許按別名排序,可用實際的計算或字段位置替換

即ORDER BY COUNT(*), order_num 或ORDER BY 2, order_num

4.SELECT子句及其順序

子 句 |說 明 |是否必須使用

SELECT |要返回的列或表達式 |是

FROM |從中檢索數據的表 |僅在從表選擇數據時使用

WHERE |行級過濾 | 否

GROUP BY |分組說明 | 僅在按組計算聚集時使用

HAVING |組級過濾 | 否

ORDER BY |輸出排序順序 | 否

十一、使用子查詢

1.利用子查詢進行過濾

SELECT cust_id

FROM Orders

WHERE order_num IN(SELECT order_num

                  FROM OrderItems

                  WHERE prod_id = 'RGAN01');

子查詢總是由內向外處理。

2.作爲計算字段使用子查詢

從Customers表中檢索顧客列表;

對於檢索出的每個顧客,統計其在Orders表中的訂單數目。

SELECT cust_name,

      cust_state,

      (SELECT COUNT(*)

      FROM Orders

      WHERE Orders.cust_id = Customers.cust_id) AS orders

FROM Customers

ORDER BY cust_name;

注:如果在SELECT語句中操作多個表,就應使用完全限定列名來避免歧義。

十二、聯結表

1.關係表

分解信息,按類寫表,互相關聯,節省空間,方便管理

2.創建聯結

SELECT vend_name, prod_name, prod_price

FROM Vendors, Products

WHERE Vendors.vend_id = Products.vend_id;

使用完全限定列名

保證所有聯結都有WHERE子句

SELECT vend_name, prod_name, prod_price

FROM Vendors INNER JOIN Products

  ON Vendors.vend_id = Products.vend_id;

以上語法爲等值聯結(內聯結)

3.用聯結優化子查詢

SELECT cust_name, cust_contact

FROM Customers, Orders, OrderItems

WHERE Customers.cust_id = Orders.cust_id

  AND OrderItems.order_num = Orders.order_num

  AND prod_id = 'RGAN01';

前兩個關聯聯結中的表,後一個過濾產品RGAN01的數據。

十三、高級聯結

1.使用表別名

縮短SQL語句,允許在一條SELECT語句中多次使用相同的表。

SELECT cust_name, cust_contact

FROM Customers AS C, Orders AS O, OrderItems AS OI

WHERE C.cust_id = O.cust_id

  AND OI.order_num = O.order_num

  AND prod_id = 'RGAN01';

表別名只在查詢執行中使用,與列別名不一樣,表別名不返回到客戶端

2.使用不同類型的聯結

1)自聯結(self-join)

SELECT c1.cust_id, c1.cust_name, c1.cust_contact

FROM Customers AS c1, Customers AS c2

WHERE c1.cust_name = c2.cust_name

  AND c2.cust_contact = 'Jim Jones';

自聯結通常作爲外部語句,用來替代從相同表中檢索數據的使用子查詢語句。

2)自然聯結(natural join)

自然聯結要求你只能選擇那些唯一的列,一般通過對一個表使用通配符(SELECT *),而對其他表的列使用明確的子集來完成。

事實上,我們迄今爲止建立的每個內聯結都是自然聯結。

3)外聯結(outer join)

聯結包含了那些在相關表中沒有關聯行的行。

SELECT Customers.cust_id, Orders.order_num

FROM Customers LEFT OUTER JOIN Orders

  ON Customers.cust_id = Orders.cust_id;

外聯結必須指明左、右

LEFT OUTER JOIN是從FROM子句左邊的表中選擇所有行

4)全聯結(full outer join)

檢索兩個表中的所有行並關聯那些可以關聯的行

3.使用帶聚集函數的聯結

檢索所有顧客及每個顧客所下的訂單數。

SELECT Customers.cust_id,

    COUNT(Orders.order_num) AS num_ord

FROM Customers INNER JOIN Orders

  ON Customers.cust_id = Orders.cust_id

GROUP BY Customers.cust_id;

4.使用聯結和聯結條件

應該總是提供聯結條件,否則會得出笛卡爾積

十四、組合查詢

1.使用情境

在一個查詢中從不同的表返回結構數據;

對一個表執行多個查詢,按一個查詢返回數據。

2.創建組合查詢

2.1 使用UNION

在各條SELECT語句之間放上關鍵字UNION就行。

2.2 UNION規則

UNION中的每個查詢必須包含相同的列、表達式或聚集函數。

列數據類型不一定完全相同,但必須兼容。

2.3 包含或取消重複的行

UNION從查詢結果集中自動去除了重複的行。

想返回所有的匹配行可使用UNION ALL。

2.4 對組合查詢結果排序

只能使用一條ORDER BY子句,且必須位於最後一句SELECT語句之後

SELECT cust_name, cust_contact, cust_email

FROM Customers

WHERE cust_state IN ('IL','IN','MI')

UNION

SELECT cust_name, cust_contact, cust_email

FROM Customers

WHERE cust_name = 'Fun4All'

ORDER BY cust_name, cust_contact;

使用UNION可極大地簡化負責的WHERE子句,簡化從多個表中檢索數據的工作。

十五、插入數據(INSERT)

1.數據插入

三種方式:插入完整的行,插入行的一部分,插入某些查詢的結果

1.1插入完整的行

INSERT INTO Customers(cust_id,cust_name,cust_email)

    VALUES('10086','Toy Land',NULL);

給出明確列,可以保證在表結構發生變化時語句仍有效。

1.2插入部分行

INSERT INTO Customers(cust_id,cust_name)

    VALUES('10086','Toy Land');

省略某些列必須滿足的條件:

定義爲允許NULL值,或表定義中給出默認值。

1.3插入檢索出的數據

INSERT SELECT語句,可以插入SELECT返回的多行

注:數據庫不關心SELECT返回的列名,它使用的是列的位置。

2.從一個表複製到另一個表

用SELECT INTO導出數據

SELECT \*

INTO CustCopy

FROM Customers;

MySQL語法如下

CREATE TABLE CustCopy AS

SELECT \* FROM Customers;

注:不論從多少個表中檢索數據,數據都只能插入到一個表中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章