1. 程式人生 > >SQL必知必會1

SQL必知必會1

1.瞭解SQL
1.1資料庫 基礎
1.1.1資料庫database
儲存有組織的資料的容器,通常是一個檔案或者一組檔案 
DBMS資料庫管理系統,即我們常說的資料庫管理軟體,資料庫是DBMS建立和操縱的容器。

1.1.2表table
某種特定型別資料的結構化清單(儲存在表中的資料是同一種類型的資料或清單) 
模式(schema):用來描述資料庫中特定的表,也可以用來描述整個資料庫和其中標的關係。

1.1.3列和資料型別
列(column): 
資料型別(datatype):所允許的資料的型別,每個表列都有相應的資料型別,它限制(或允許)該列中儲存的資料。

1.1.4行row
表中的一個記錄

1.1.5主鍵primary key
表中的每一行都應該有一列(或幾列)可以唯一標識自己。唯一標識表中每行的這個列(或這幾列)稱為主鍵。 
主鍵用來更新或者刪除表中特定行。 
表中任何列都能作為主鍵,要滿足一下條件: 
1.任意兩行都不具有相同的主鍵值 
2.每一行都必須具有一個主鍵值(主鍵列不允許為NULL) 
3.主鍵列中的值不允許修改或者更新 
4.主鍵不能重用(如果某行從表中刪除,其主鍵不能賦給以後的新行)

2.檢索資料
2.1SELECT語句
關鍵字(keyword):作為SQL組成部分的保留字。關鍵字不能作為表或列的名字。

2.2檢索單個列
SELECT prod_name FROM products; 
每個語句以;結束。 
SQL不區分大小寫,但是為了區別,對關鍵字用大寫,表名列名用大寫。 
不區分空格,多個語句可以寫在一行。但分開寫更好。

2.3檢索多個列
SELECT prod_id,prod_name,prod_price FROM products; 
列名之間加逗號,但是列名的最後一個不加。

2.4檢索所有列
SELECT * FROM products;

2.5檢索不同的值
SELECT vend_id FROM products; 
去重: 
SELECT DISTINCT vend_id FROM products; 
DISTINCT作用於其後的所有列

2.6限制結果
返回某一行或者一定數量的行 
SQL Server 和Access中: 
SELECT TOP 5 prod_name FROM products;

DB2: 
SELECT prod_name FROM products FETCH FIRST 5 ROWS ONLY;

2.7註釋
行內註釋: 
SELECT prod_name FROM products; –這是一條註釋

#這是一條註釋
SELECT prod_name FROM products;
1
2
多行註釋:

/*SELECT prod_id,prod_name,prod_price 
FROM products;*/
SELECT prod_name FROM products;
1
2
3
3.排序檢索資料
3.1排序 ORDER BY
SELECT prod_name FROM products; 
子句(clause):SQL語句由子句組成,有些必需,有些可選。一個字子句由一個關鍵字加上所提供的資料組成。

SELECT prod_name 
FROM products
ORDER BY prod_name;
1
2
3
ORDER BY 應該是SELECT中最後一條子句

3.2按多個列排序
SELECT prod_id,prod_price,prod_name
FROM  products
ORDER BY prod_price,prod_name;
1
2
3
當prod_price值相同時,才會按prod_name排序,否則將不會按prod_name進行排序。

3.3按列位置排序
SELECT prod_id,prod_price,prod_name
FROM  products
ORDER BY 2,3;
1
2
3
3.4指定排序方向
預設為升序排列A~Z,降序指定DESC

SELECT prod_id,prod_price,prod_name
FROM  products
ORDER BY prod_price DESC;
1
2
3
DESC只指定位於其前面的一個列名 
如想對多個列進行降序排列,對每個列後加DESC. 
一般認為a與A相同,若想改變,需找資料庫管理員

4過濾資料
4.1WHERE子句
過濾條件:只檢索所需資料

SELECT prod_price,prod_name
FROM  products
WHERE prod_price=3.49;
1
2
3
返回prod_price為3.49的行,該行包含兩個列。 
ORDER BY 語句應該位於WHERE之後

4.2WHERE子句操作符
= 等於 < >不等於 !=不等於 < <= !< > >= !> BETWEEN 
IS NULL 為NULL值

4.2.1檢查單個值
SELECT prod_price,prod_name
FROM  products
WHERE prod_price<10;
1
2
3
4.2.2不匹配查詢
SELECT vend_id,prod_name
FROM  products
WHERE vend_id <> ' DLL01 ';
1
2
3
單引號用來限定字串

4.2.3範圍值檢測
SELECT prod_price,prod_name
FROM  products
WHERE prod_price  BETWEEN 5 AND 10;
1
2
3
4.2.4空值檢查
SELECT prod_price,prod_name
FROM  products
WHERE prod_price IS NULL;
1
2
3
5.高階資料過濾
5.1組合WHERE子句
操作符(operator):用來聯結或改變WHERE子句中的關鍵字,也稱為邏輯操作符(logical operator)

5.1.1AND 操作符(交)
SELECT prod_id,prod_price,prod_name
FROM  products
WHERE vend_id =' DLL01 ' AND prod_price IS NULL;
1
2
3
5.1.2OR操作符(並)
SELECT prod_price,prod_name
FROM  products
WHERE vend_id =' DLL01 '  OR  prod_price IS NULL;
1
2
3
5.1.3求值順序
SELECT prod_price,prod_name
FROM  products
WHERE vend_id =' DLL01 '  OR vend_id =' BRS01 '  AND prod_price >=10;
1
2
3
BRS01製造的價格為10美元以上的所有產品,以及DLL01製造的所有產品。 
AND的優先順序高於OR

SELECT prod_price,prod_name
FROM  products
WHERE (vend_id =' DLL01 '  OR vend_id =' BRS01 ')  AND prod_price >=10;
1
2
3
()的優先順序最高

5.2IN操作符
用來指定條件範圍,範圍中的每個條件都可以進行匹配。IN取一組有逗號分隔,括在()中的合法值。

SELECT prod_price,prod_name
FROM  products
WHERE vend_id  IN  (' DLL01 '  , ' BRS01 ')  
ORDER BY prod_name;
--檢索DLL01和BRS01製造的所有產品
1
2
3
4
5
IN簡化了OR語法,且IN可以包含其他SELECT語句

5.3NOT操作符
WHERE子句中用來否定其後條件的關鍵字,NOT總是與其他操作符一起使用

SELECT prod_name
FROM  products
WHERE NOT vend_id =' DLL01 '     --相當於WHERE  vend_id <>' DLL01 ' 
ORDER BY prod_name;
1
2
3
4
6.用萬用字元進行過濾
6.1LIKE操作符
萬用字元(wildcard):用來匹配值的一部分的特殊字元 
搜尋模式(search pattern)由字面值,萬用字元或兩者組合的搜尋條件 
萬用字元搜尋只能用於文字欄位(字串),非文字資料型別不能用萬用字元搜尋 
為在搜尋子句中使用萬用字元,必須使用LIKE操作符

6.1.1%萬用字元
%表示任何字元出現任意次數。

SELECT prod_id,prod_name
FROM  products
WHERE  prod_name LIKE 'fish%' ;  --找出所有以fish開頭的產品
1
2
3
區分大小寫,Fish就不匹配

SELECT prod_id,prod_name
FROM  products
WHERE  prod_name LIKE '%fish%' ;--中間為fish的產品

SELECT prod_id,prod_name
FROM  products
WHERE  prod_name LIKE 'f%h' ;     --以f開頭,h結尾的產品
WHERE  prod_name LIKE 'f%h%' ;   --以f開頭,空格結尾的產品
--查詢電子郵件 WHERE  email LIKE 'b%@forta.com' ;
1
2
3
4
5
6
7
8
9
%還能匹配0個字元,但不能匹配NULL

6.1.2下劃線(_)萬用字元
同%一樣,但只匹配單個字元

SELECT prod_id,prod_name
FROM  products
WHERE  prod_name LIKE '__ inch teddy bear' ;
1
2
3
6.1.3方括號([])萬用字元
用來指定一個字符集,必須匹配指定位置(萬用字元位置)的一個字元

SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[JM]%'  --找出名字以J或M開頭的聯絡人
ORDER BY cust_contact;
1
2
3
4
否定形式

SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[^JM]%'  --找出名字不是以J或M開頭的聯絡人
                                                       --相當於WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
1
2
3
4
5
不用過多使用萬用字元,相同作用下有限使用萬用字元

7.建立計算欄位
7.1計算欄位
通過檢索出轉換,計算或格式化過的資料,而非直接檢索。 
欄位(field) 
在SQL語句中 可以完成的許多轉換和格式化工作都可以直接在客戶端應用程式內完成。

7.2拼接欄位
拼接(concatenate):將值連線到一起(一個值附加到另一個值上)構成單個值。 
vendors表包含供應商名和地址資訊。假如要生成一個供應商報表,需要在格式化的名稱(位置)中列出供應商的位置。此報表需要一個值,而表中資料儲存在兩個列vend_name和vend_country中。 
操作符為(+)或者(||)

SELECT vend_name + ‘(‘+vend_country+’)’
FROM vendors
ORDER BY vend_name;
1
2
3
在MySQL或MariaDB中

SELECT contact(vend_name ,‘(‘,vend_country,’)’)
FROM vendors
ORDER BY vend_name;
1
2
3
由於資料庫中一般填充為列寬的文字值,拼接後會產生空格,用RTIRIM()去除空格

SELECT RTIRIM(vend_name) + ‘(‘+RTIRIM(vend_country)+’)’
FROM vendors
ORDER BY vend_name;
1
2
3
–RTIRIM()去掉字串右邊空格 
–LTRIM()去掉左邊空格 
–TRIM()去掉左右空格

使用別名 AS

SELECT RIRIM(vend_name) + ‘(‘+RIRIM(vend_country)+’)’
               AS  vend_title
FROM vendors
ORDER BY vend_name;
1
2
3
4
7.3執行算術計算
對檢索出的資料進行算術計算

SELECT prod_id,quality,item_price
FROM orderitems
WHERE order_num=20008;


SELECT prod_id,
               quality,
               item_price,
               quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num=20008;
1
2
3
4
5
6
7
8
9
10
11
測試計算:

SELECT 3*2;
SELECT now();
SELECT trim('abc')
1
2
3
8.使用函式處理資料
每一個DBMS都有特定的函式,只有少數幾個函式被主要的DBMS等同支援,與SQL語句一樣,SQL函式是不可移植的

8.2大多數DBMS支援以下函式
1.處理文字字串 
2.對資料進行運算操作 
3.處理日期和時間值並從這些值中提取特定成分的日期和時間函式 
4.返回DBMS正使用的特殊資訊的系統函式

8.2.1文字處理函式
SELECT vend_name,UPPER(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;
--UPPER將文字轉換為大寫
1
2
3
4
LEFT() 返回字串左邊的字元 
LENGTH() 
LOWER() 
LTRIM() 
RIGHT() 返回字串右邊的字元 
RTRIM() 
SOUNDEX() 近似發音匹配 
UPPER()

--SOUNDEX()
SELECT cust_name,cust_contact
FROM customers
WHERE cust_name='Michael Green';

SELECT cust_name,cust_contact
FROM customers
WHERE SOUNDEX(cust_name)=SOUNDEX('Michael Green');
1
2
3
4
5
6
7
8
8.2.2日期和時間處理函式
SELECT order_num
FROM orders
WHERE DATEPART (yy,order_date)=2012;

SELECT order_num
FROM orders
WHERE DATEPART ('yyyy',order_date)=2012;
DATEPART()中有兩個引數,包括返回的成分和從中返回成分的日期。
1
2
3
4
5
6
7
8
8.2.3數值處理函式
ABS() 
COS() 
EXP() 返回一個數的指數值 
PI() 返回圓周率 
SIN() 
SQRT() 
TAN()

9.彙總資料
9.1聚集資料
1.確定表中行數(滿足某個條件或者某個特定值的函式) 
2.獲得表中某些行的和 
3.找出表列(或特定的行)的最大值,最小值,平均值 
聚集函式(aggregate founction) 
AVG() 
COUNT() 
MAX() 
MIN() 
SUM()

9.1.1AVG()函式
返回所有列的平均值或特定行列的平均值

SELECT AVG(prod_price) AS avg_price
FROM products;

SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id='DLL01';
--AVG()只能用於單個列,且忽略NULL的行
1
2
3
4
5
6
7
9.1.2COUNT()函式
確定表中行的數目或符合特定條件的行的數目 
1.COUNT(*)對錶中行的數目進行計數。無論列中包含的是空值還是非空值 
2.COUNT(column)對特定列中具有值的行計數,忽略NULL值

SELECT COUNT(*) AS num_cust
FROM customers;
--對所有行進行計數

SELECT COUNT(cust_email) AS num_cust
FROM customers;
--只對具有電子郵件地址的客戶計數
1
2
3
4
5
6
7
9.1.3MAX()函式
返回列中的最大值

SELECT MAX(prod_price) AS max_price
FROM products;
--對於文字類資料,返回按該列排序後的最後一行,忽略列值為NULL的行
1
2
3
9.1.4MIN()函式
與MAX()選相反

9.1.5SUM()函式
返回指定列值的和

SELECT SUM(quantity) AS item_ordered
FROM orderitems
WHERE order_num=20005;

SELECT SUM(item_price*quantity) AS item_ordered
FROM orderitems
WHERE order_num=20005;
--返回物品價錢之和
1
2
3
4
5
6
7
8
9.2聚集不同值
1.對所有行執行計算,指定ALL引數或不指定引數 
2.只包含不同的值,指定DISTINCT引數,去除了列中相同的數值

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id='DLL01';
1
2
3
9.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
2
3
4
5
10.分組資料
GROUP子句和HAVING子句

10.1資料分組
將資料分為多個邏輯組,對每個組進行聚集計算

10.2建立分組
利用GROUP BY 子句建立

SELECT vend_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
1
2
3
一些規定: 
1.GROUP BY 子句中列出的每一列都必須是檢索列或有效的表示式。如果在SELECT中使用表示式,則必須在GROUP BY 子句中指定相同的表示式,不能使用別名。 
2.除聚集函式語句外,SELECT語句中的每一列都必須在GROUP BY 子句中給出。 
3.具有NULL值的行,則NULL將作為一個分組返回,若列中有多行NULL值,它們將分為一組 
4.GROUP BY子句必須出現在WHERE子句之後,ORDER BY 子句之前。

10.3過濾分組
WHERE過濾指定的是行而不是分組。SQL中用HAVING進行過濾分組。實際上,所有的WHERE都可以被HAVING替換。

SELECT cust_id,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >=2;
--過濾了兩個以上訂單的那些分組

SELECT cust_id,COUNT(*) AS orders
FROM orders
WHERE prod_price>=4
GROUP BY cust_id
HAVING COUNT(*) >=2;
--列出具有兩個以上產品且價格大於等於4的供應商
1
2
3
4
5
6
7
8
9
10
11
12
使用HAVING時必須結合GROUP BY 子句

10.4分組和排序
SELECT order_num,COUNT(*) AS items
FROM orderitems
GROUP BY order_num
HAVING COUNT(*)>=3;
--檢索包含三個或更多物品 的訂單號和訂購物品的數目。

SELECT order_num,COUNT(*) AS items
FROM orderitems
GROUP BY order_num
HAVING COUNT(*)>=3
ORDER BY items,order_num;
--先過濾分組,再排序
--------------------- 
作者:xjh163 
來源:CSDN 
原文:https://blog.csdn.net/xjh163/article/details/79393243 
版權宣告:本文為博主原創文章,轉載請附上博文連結!