- 檢索數據
- 檢索單個列數據
- 檢索多個列數據
- 檢索所有列數據
- 檢索不同的值
- 使用
DISTINCT
關鍵字 - 不能部分使用DISTINCT,關鍵字用於所有列,不僅僅是跟在其後的列。
- 使用
- 限制結果
- 輸出指定的行數
SELECT name FROM user limit 5;
- 輸出指定的行數從哪一行開始
SELECT name FROM user limit 5 offset 5;
- 輸出指定的行數
- 使用註釋
- 在一行的開始使用
#
,這一整行都將作爲註釋。 - 多行註釋,
/**/
- 在一行的開始使用
- 排序檢索數據
- 爲了明確地排序用
SELECT
語句檢索出來的數據,可使用ORDER BY
子句。ORDER BY
子句取一個或多個列的名字,據此對輸出進行排序。
ORDER BY
子句的位置- 在指定一條
ORDER BY
子句的事後,應該確保它是SELECT
語句的最後一條子句。如果它不是最後一條子句,將會出現錯誤信息。
- 在指定一條
- 按多個列排序
- 要按多個列排序,簡單指定列名,列名之間使用逗號分隔。
- 按照列位置進行排序
- 除了能用列名指出排序順序外,
ORDER BY
還支持按照相對位置進行排序。 - 例子
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
- 這一技術的主要好處是不用重新輸入列名,但它也有缺點。不明確地給出列名可能會造成錯用列名排序。
- 除了能用列名指出排序順序外,
- 指定排序方向
- 降序排序
DESC
. - 升序
ASC
- 降序排序
- 爲了明確地排序用
- 過濾數據
- 使用
WHERE
子句- 只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱爲過濾條件。
- 警告:在同時使用
ORDER BY
和WHERE
子句,應該讓ORDER BY
位於WHERE
之後,否則將會產生錯誤。
WHERE
子句操作符- 檢查單個值
- 不匹配檢查
- 例子:
SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01'
和SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01'
。
- 例子:
- 範圍值檢測
- 要檢查某個範圍的值,可以使用
BETWEEN
操作符。
- 要檢查某個範圍的值,可以使用
- 空值檢查
- 確定值是否爲
NULL
,不能簡單地檢查是否=NULL
- 例子:
SELECT prod_name FROM Products WHERE prod_price IS NULL
- 確定值是否爲
- 警告:通過過濾選擇不包含指定值的所有行,你可能希望返回含
NULL
值的行。但是這做不到,因爲未知(unknown)有特殊的含義,數據庫不知道他們是否匹配,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。
- 使用
- 高級過濾數據
- 爲了進行更強的過濾控制,SQL允許給出多個
WHERE
子句。這些子句有兩種使用方式,即以AND
和OR
子句的方式使用。- 操作符(operator)用來聯接或改變
WHERE
子句中的子句的關鍵字,也稱爲邏輯運算符(logical operation)
- 操作符(operator)用來聯接或改變
AND
操作符- 要通過不止一個列進行過濾,可以使用
AND
操作符給WHERE
子句附加條件。 - 例子:
SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4;
- 要通過不止一個列進行過濾,可以使用
OR
操作符- 與
AND
操作符相反
- 與
- 求值順序
- 允許兩者結合以進行復雜、高級的過濾。
- SQL在處理OR操作符前,優先處理AND操作符。解決這個問題的方法是使用圓括號來進行明確分組。
- 任何時候使用具有
AND
和OR
操作符的WHERE
子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認求值順序。
IN
操作符IN
操作符用來指定條件範圍。
NOT
操作法NOT
操作符只有一格功能,否定其後所跟的任何條件。
- 爲了進行更強的過濾控制,SQL允許給出多個
- 用通配符進行 過濾
- like操作符
- %通配符
- 在搜索中,百分號表示任意字符出現任意次數
- 例子
- 找出所有詞
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 '%began bag%';
# 搜索模式’%began bag%'表示任何位置商包含文本began bag
的值,不論它之前或之後出現什麼字符。 - 通配符出現在搜索模式的中間:
SELECT prod_name FROM Products WHERE prod_name LIKE 'F%y';
# 有一種情況下把通配符放在中間是有用的,比如WHERE email LIKE b%forta.com
- 找出所有詞
- 注意NULL:子句
SELECT prod_name LIKE %
不會匹配產品名稱爲NULL
的行
- 下劃線(_)通配符
- 用途和
%
一樣,但它只匹配單個字符,而不是多個字符。 - 例子
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '__ inch teddy bear'
# 注意後面的空格
- 注意:
_
總是剛好匹配一格字符,不能多也不能少,與%匹配0個不一樣。
- 用途和
- 方括號([])通配符
- 方括號([])通配符用來指定一格字符集,它必須匹配指定位置的一個字符。
- %通配符
- 使用通配符技巧
- 不要過度使用通配符
- 在確實使用通配符時,也儘量不要把他們用在搜索模式開始處。
- 仔細注意通配符的位置
- like操作符
- 創建計算字段
- 計算字段
- 字段(field):基本上與列(column)意思相同,進程互相使用
- 拼接字段
- 拼接(concatenate):將值聯接到一起(將一個值附加到另一個值)構成單個值
- 例子:
SELECT vend_name + '(' + vend_country + ')' FROM Vendors ORDER BY vend_name
- 相同效果:
SELECT vend_name || '(' || vend_contry || ')' FROM Vendors ORDER BY vend_name;
- 使用別名
- SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用
AS
關鍵字賦予。 - 例子
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_contry) + ')' AS vend_title FROM Vendors ORDER BY vend_name;
- SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用
- 執行算數計算
- 例子:
SELECT prod_id, quantity, item_price, quantity * item_price AS expand_price FROM OrderItems WHERE order_num = 20008;
- 例子:
- 計算字段
- 使用數據處理函數
- 函數
- 可移植(portable):所編寫的代碼可以在多個系統上運行
- 使用函數
- 文本處理函數
- 例子:
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name;
- 例子:
- 日期和時間處理函數
- 應用程序一般不使用日期和時間的存儲格式。
- 例子:
SELECT order_num FROM Orders WHERE YEAR(order_date) = 2012;
- 數值處理函數
- 文本處理函數
- 函數
- 彙總數據
- 聚集函數
- 聚集函數(aggregate function)對某些運行的函數,計算並返回一格值。
- 例子:
AVG()
:返回某列的平均值COUNT()
: 計算某列的行數MAX()
:返回某列的最大值MIN()
: 返回某列的最小值SUM()
: 返回某列值值和
- AVG()函數:
AVG()
通過對錶中行數計算並計算其列值之和。- 例子:
SELECT AVG(prod_price) AS avg_price FROM Products;
AVG()
函數忽略值爲NULL的行
- COUNT 函數
COUNT()
函數進行計數。COUNT()
函數兩種使用方式- 使用
COUNT(*)
對錶中數目進行計算,不管表列中是否包含的是空值(NULL)還是非空值 - 使用
COUNT(column)
對特定列中具有值的行進行計算,忽略NULL值
- 使用
- MAX函數
- 返回指定列中的最大值
- 例子:
SELECT MAX(prod_price) AS max_price FROM Products;
- 對非數值數據使用
MAX()
,用於文本數據時,MAX()
返回按該列排序後的最後一行。
- MIN函數
- MIN函數與MAX函數功能相反
- 例子:
SELECT MIN(prod_price) AS min_price FROM Products
- 雖然MIN()函數一般用來找出最小的數值或日期,但在用於文本數據的時候,MIN()會返回該列排序後最前面的行。
- SUM函數
- SUM()函數用來返回指定列值的和(總計)。
- 例子:
SELECT SUM(quantity) AS items_ordered FROM OrderItems WHERE order_num = 2005;
- NULL值,SUM函數會自動忽略NULL的值
- 聚集不同值
DISTINCT
不能用於COUNT(*)
- 如果指定列名,則
DISTINCT
只能用於COUNT
。DISTINCT
不能用於COUNT(*)
。類似地,DISTINCT
必須使用列名,不能用於計算或表達式。
- 如果指定列名,則
- 組合聚集函數
- 例子
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
MAX(prod_price) AS price_avg
FROM Products
- 例子
- 聚集函數
- 分組數據
- 數據分組
- 例子:
SELECT COUNT(*) AS num_prods FROM Products WHERE vend_id = 'DLL01'
- 例子:
- 創建分組
- 分組是使用
SELECT
和GROUP BY
子句。 - 例子:
SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id
- 分組是使用
- 過濾分組
HAVING
非常類似於WHERE
。事實上,目前所有類型的WHERE
都可以用HAVING
來代替。唯一的差別,WHERE
過濾行,而HAVING
過濾分組。- 過濾分組例子:
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
- 分組和排序
GROUP BY
和ORDER BY
完成相同工作。ORDER BY
對產生的輸出排序,任意列都可以使用,但不一定需要。- 一般在使用
GROUP BY
子句時,應該也使用ORDER BY
子句。這是保證數據正確排序的唯一方法。千萬不要依賴GROUP BY
排序數據。 - 例子:
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
- SELECT子句順序
- 數據分組
- 使用子查詢
- 子查詢
- 查詢(query):任何SQL語句都是查詢。
- 使用子查詢過濾
- 例子
SELECT cust)id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Order
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RANGE01'));
- 例子
- 作爲計算字段使用子查詢
- 使用子查詢的另一個方法是創建計算字段。
- 例子
SELECT cust_name,
cust_state,
(SELECT Orders
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
- 子查詢
- 創建和操作表
- 創建表
- 表創建基礎
- 使用
CREATE TABLE
- 新表的名字
- 表列的名字和定義,逗號分隔
- 有的DBMS還要求表的位置
- 例子
- 創建
Products
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
prod_vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8, 2) NOT NULL,
prod_desc VARCHAR(1000) NULL
)
- 創建
- 注意:指定的表名必須不存在,否則將會報錯。
- 使用
- 使用NULL值
- 允許NULL值的列也允許在插入行時不給該列的值
- 不允許NULL值的列不接受沒有列值的行
- 每個表列要麼是NULL列,要麼是NOT NULL值。
- 例子
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_city CHAR(50) ,
vend_zip CHAR(10)
);
- 指定默認值
- SQL允許指定默認值,在插入行時如果不給出值,將會採用默認值。默認值在
CREATE TABLE
語句的列定義中用關鍵字DEFAULT
指定。 - 例子
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
);
- SQL允許指定默認值,在插入行時如果不給出值,將會採用默認值。默認值在
- 表創建基礎
- 更新表
- 更新表定義,可以使用
ALTER TABLE
語句。 - 例子
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
ALTER TABLE Vendors
DROP COLUMN vend_phone
- 小心使用
ALTER TABLE
- 使用
ALTER TABLE
要極爲小心,應該在進行該動前做完整的備份。(模式和數據的備份)。數據表的更改不能撤銷,如果增加了不需要的列,業務無法刪除他們。
- 使用
- 更新表定義,可以使用
- 刪除表
DROP TABLE CustCopy;
- 重新命名錶
- 不存在嚴格標準,MySQL使用
RENAME
語句。
- 不存在嚴格標準,MySQL使用
- 創建表
- 插入數據
- 數據插入
- 插入完整行
- 例子
INSERT INTO TABLE Customer
VALUES ('1004',
'Toy Land'
);
- 例子
- 插入部分行
- 插入檢索出數據
INSERT
一般用來給表插入具有指定列的值的行。INSERT
還存在另外一種形式,可以利於它將SELECT
語句的結果插入表中。這就是所謂的INSERT SELECT
.- 例子
INSER INTO Customers(
cust_id,
cust_contact)
SELECT cust_id,
cust_contact
FROM Custnew;
- 插入完整行
- 從一個表複製到另一個表
- 有一種數據插入不使用
INSERT
語句。要將表的內容複製到另一個全新的表,可以使用SELECT INTO
. - 例子:
SELECT *
INTO CustCopy
FROM Customer;
- 有一種數據插入不使用
- 數據插入
- 更新和刪除數據
- 更新數據使用
UPDATE
- 例子
UPDATE Customer
SET cust_email = '[email protected]'
WHERE cust_id = '11'
- 例子
- 刪除數據使用
DELETE
- 例子
DELETE FROM Customer
WHERE cust_id = '100';
- 如果要刪除所有的行,請使用
TRUNCATE TABLE;
語句
- 例子
- 跟新和刪除的指導原則
- 下面是很多SQL程序員使用
UPDATE
和DELETE
時所遵循的原則- 除非確實打算更新和刪除每一行,否則絕不要使用不帶
WHERE
子句的UPDATE
和DELETE
- 保證每個表都有主鍵,儘可能像
WHERE
那樣使用它。 - 在
UPDATE
或DELETE
語句使用WHERE
子句之前,應該先使用SELECT
進行測試,確保它過濾的是正確的記錄,以防止編寫的WHERE
子句不正確。
- 除非確實打算更新和刪除每一行,否則絕不要使用不帶
- 下面是很多SQL程序員使用
- 更新數據使用
- 視圖
- 視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用動態檢索數據的查詢。
- 例子
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';
- 例子
- 創建視圖
- 視圖用
CREATE VIEW
來創建視圖。只能用於創建不存在的視圖。刪除視圖使用DROP VIEW
,覆蓋更新視圖需要先刪除存在的視圖。 - 例子
-
CREATE VIEW ProductCustomer AS
SELECT custom_id, custom_contact, prod_id
FROM Customer, Orders, OrderItems
WHERE Customer.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
SELECT custom, cust_content
FROM ProductCustomer
WHERE prod_id = 'RGAN01';
-
- 視圖用
- 利用視圖簡化複雜的聯接
- 一個最常見的視圖作用是隱藏複雜的SQL,這通常涉及到聯結。
- 視圖大大簡化了複雜的SQL語句的使用。利用視圖,可一次性編寫基礎的SQL,然後根據多次使用。
- 創建不綁定特定數據的視圖是一個好方法。擴展視圖的範圍不僅使得它能被重用,而且可能很有用。這樣做不需要創建和維護多個類似視圖。
- 用視圖重新格式化檢索出的數據
- 視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用動態檢索數據的查詢。
- 聯結表
- 聯結
- SQL最強大的功能之一就是在 數據查詢的執行中聯結(join)表。聯結就是利用SQL 的
SELECT
能執行的最重要動作。
- SQL最強大的功能之一就是在 數據查詢的執行中聯結(join)表。聯結就是利用SQL 的
- 創建聯結
- 聯結表是SQL一個最重要、最強大的特性,有效地使用聯結需要對關係數據庫設計的基本瞭解。
- 聯結
- 創建高級聯結
- 使用表別名
- 例子
SELECT RTRIM(vend_name) + '(' + RTRIM(vend_price) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
- 例子
- 使用不同類型的聯結
- 使用帶聚集函數的聯結
- 使用聯結和聯結條件
- 使用表別名
mysql學習總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.