生成數(shù)據(jù)庫表和數(shù)據(jù)的SQL文件
第1課:了解SQL
1、數(shù)據(jù)庫基礎
- 數(shù)據(jù)庫(database):保存有組織的數(shù)據(jù)的容器
數(shù)據(jù)庫軟件也稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS)单雾;
表(table):某種特定類型數(shù)據(jù)的結構化清單
列:表中的一個字段袋马。所有表都是由一個或多個列組成
數(shù)據(jù)類型:限定可存儲在列中的數(shù)據(jù)的種類
行:表中的一條記錄
主鍵:一列(或一組列)把篓,其值能夠唯一標識表中每一行
應該總是定義主鍵制恍,主鍵滿足的條件:
- 任意兩行都不具有相同的主鍵值
- 每一行都必須具有一個主鍵(主鍵不允許為NULL)
- 主鍵列中的值不允許修改或更新
- 主鍵值不能重用(如果某行被刪除已球,它的主鍵不能賦給以后的新行)
1.2、什么是SQL
- SQL:Structured Query Language(結構化查詢語言)
SQL的優(yōu)點:
- 幾乎所有重要的DBMS都支持SQL盼理;
- SQL簡單易學谈山;
- SQL可以進行非常復雜和高級的數(shù)據(jù)庫操作;
第2課:檢索數(shù)據(jù)
SELECT語句
SELECT語句用于從一個或多個表中檢索信息
關鍵字不能用作表或列的名字;
檢索單個列:
SELECT prod_name FROM products;
從products表中檢索名為prod_name的列宏怔,
FROM
關鍵字指出從那個表中檢索數(shù)據(jù)奏路。
多條SQL語句必須以分號(即";")分割
SQL語句不區(qū)分大小寫,一般情況下臊诊,為了易于閱讀和維護鸽粉,對關鍵字使用大寫,而對列名和表名使用小寫抓艳;
檢索多個列
SELECT prod_id, prod_name, prod_price FROM products;
多個列之間使用逗號分隔
檢索所有列
SELECT * FROM products;
一般而言除非確實需要表中的每一列触机,否則最好不要使用通配符,使用通配符通常會降低檢索和應用程序的性能玷或;
檢索不同的值
SELECT DISTINCT vend_id FROM products;
- DISTINCT關鍵字指示數(shù)據(jù)庫返回不同的值儡首;
- DISTINCT關鍵字作用于所有的列,不僅僅是緊跟其后的那一列偏友;
限制結果
如果查詢的數(shù)據(jù)有很多蔬胯,只想返回一定的行數(shù),則可以根據(jù)不同的DBMS的關鍵字來實現(xiàn)
- SQL Server和Access:
SELECT TOP 5 prod_name FROM products;
- DB2:
SELECT prod_name FROM products FETCH FIRST 5 ROWS ONLY;
- Oracle:
SELECT prod_name FROM products WHERE ROWNUM <= 5;
- MySQL / MariaDB / PostgreSQL / SQLite:
SELEC prod_name FROM products LIMIT 5;
為了得到后面的5行位他,可以使用OFFSET關鍵字:
SELECT prod_name FROM products LIMIT 5 OFFSET 5;
指示DBMS從OFFSET指定的第5行起行起笔宿,查詢LIMIT后的 5 行數(shù)據(jù);
SQL注釋
使用注釋的原因:
- 隨著SQL語句的變長棱诱,復雜性增加,需要添加一些描述性的文字涝动,以便于以后自己和其他人參考迈勋;
- 在文件開頭添加一些個人的聯(lián)系方式、程序描述以及一些說明醋粟;
- 暫時停止不需要執(zhí)行的SQL代碼靡菇;
-
雙連字符注釋
SELECT prod_name ?? -- 這是一條注釋
FROM products;
兩個連字符之后的便是注釋的內(nèi)容
-
另一種注釋:
# 這是一條注釋 # 這是一條注釋
-
多行注釋
/* SELECT prod_name, vend_id FROM products LIMIT 5 OFFSET 10; */
第3課:排序檢索數(shù)據(jù)
排序順序
子句:SQL由子句構成米愿,一個子句通常由一個關鍵字加上所提供的數(shù)據(jù)組成厦凤。
ORDER BY 子句可以對檢索出的數(shù)據(jù)進行排序
SELECT prod_name
FROM products
ORDER BY prod_name;
ORDER BY 子句的位置總是在SELECT語句的最后一條,否則會報錯育苟。
按多個列排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;
按排列的位置排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY 2, 3;
指定排序方向
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;
DESC是降序排列(DESCENDING)较鼓,默認是升序排列ASC(ASCENDING);
DESC關鍵字只能應用到直接位于其前的列名,如果想對多個列進行降序排列博烂,必須對每一列指定DESC關鍵字香椎;
第4課:過濾數(shù)據(jù)
只檢索所需數(shù)據(jù)需要指定搜索條件(search criteria),搜索條件也稱為過濾條件(filter condition)禽篱;
使用WHERE子句
SELECT prod_name, prod_price
FROM products
WHERE prod_price = 3.49;
WHERE子句操作符
操作符 | 說?明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
BETWEEN | 在指定的兩個值之間 |
IS NULL | 為NULL值 |
并非所有的DBMS都支持以上所有的操作符畜伐,如
<>
就不是所有的DBMS支持;
實例
查詢單個值
查詢小于價格小于10的商品
SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10
ORDER BY prod_price DESC, prod_name;
限定查詢
SELECT vend_id, prod_name
FROM products
WHERE vend_id != 'DLL01';
范圍查詢
SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 3 AND 10;
兩個值之間需要
AND
關鍵字隔開
NULL值查詢
SELECT cust_name
FROM customer
WHERE cust_email IS NULL;
第5課:高級數(shù)據(jù)過濾
5.1躺率、組合WHERE子句
SQL允許給出多個WHERE子句玛界,這些子句以 AND 子句或 OR 子句的方式組合:
-
AND操作符:AND指示DBMS檢索只滿足所有給定所有條件的行。
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 'DLL01' AND prod_price <= 4 ORDER BY prod_name DESC;
-
OR操作符:用來表示檢索匹配任一給定條件的行悼吱。
SELECT prod_name, prod_price FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' ORDER BY prod_price DESC;
求值順序
AND 操作符的優(yōu)先級高于 OR 慎框,所以在同時使用時建議加上圓括號加以區(qū)別;
實例一:
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10
ORDER BY prod_price DESC;
實例二:
SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10
ORDER BY prod_price DESC;
IN 操作符
IN操作符用來指定的范圍舆绎,范圍中的每個條件都可以匹配鲤脏。
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_id;
使用 IN 操作符的優(yōu)點:
- 在有很多合法選項時,IN操作符的語法更清楚吕朵,更直觀猎醇;
- 在與AND和OR等其他操作符組合使用時,求值順序更容易管理努溃;
- IN 操作符一般比一組OR操作符執(zhí)行的更快硫嘶;
- IN 操作符的最大優(yōu)點是可以包含SELECT語句,能夠更動態(tài)的建立WHERE子句梧税;
NOT操作符
NOT操作符用來否定其后跟的條件沦疾;
實例:
SELECT prod_id, prod_name
FROM products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_id;C
以上實例等同于:
SELECT prod_id, prod_name
FROM products
WHERE vend_id != 'DLL01'
ORDER BY prod_id;
第6課:用通配符進行過濾
LIKE操作符
通配符(wildcard):用來匹配值的一部分的特殊字符
為在搜索子句中使用通配符,必須使用LIKE操作符第队。LIKE指示DBMS哮塞,后跟的搜索模式利用通配符而不是簡單的相等匹配進行比較。
通配符只能用于文本字段(字符串)
百分號(%)通配符
% 表示任何字符出現(xiàn)任意次數(shù)凳谦;
實例: 找出所有以Fish起頭的產(chǎn)品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'Fish%';
搜索時會區(qū)分大小寫忆畅;
使用多個%通配符:找出所有包含“bean bag”的產(chǎn)品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%bean bag%';
在搜索模式的中間:找出以F開頭,以y結尾的所有產(chǎn)品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'F%y';
在中間使用時搜索電子郵件很有用尸执,如:WHERE email LIKE 'b%@163.com';
%不會匹配NULL
下劃線(_)匹配符
下劃線通配符是用來匹配單個字符的
實例:匹配兩個
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '__ inch teddy bear';
匹配任意個:
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% inch teddy bear';
方括號([])通配符
方括號([])匹配符用來指定一個字符集家凯,它必須匹配指定位置(通配符的位置)的一個字符;
并不是所有的DBMS都支持創(chuàng)建集合的[]如失,只有微軟的Access和SQL Server支持绊诲。
SELECT cust_contact
FROM customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
對[]進行否定,[^JM]%
使用通配符的技巧:
- 不要過度使用通配符褪贵,如果能達到相同目的掂之,應該使用其他操作符;
- 在確實需要使用時,盡量不要把它們用在搜索模式的開始處板惑,因為那樣是搜索起來最慢的橄镜;
- 仔細注意通配符的位置;
....