基礎知識
1、select distinct 語句(用於返回唯一 不同的值)
使用場景說明:有時候表中的某些列的值不是唯一的(重複數據過多,但恰恰我們不需要那些重複的數據)時,便可使用DISTINCT 語句過濾掉重複的值。
使用語法:SELECT DISTINCT 列名稱 FROM 表名稱;
2、AND & OR 運算
使用場景說明:一般與where 子句 配合使用 表示多個條件聯合查詢,可以把多個條件結合起來,如果第一個和第二個條件都成立,那麼使用 and 結合,如果第一個條件和第二個條件只需要一個成立則使用 or 將條件連接。
使用實例:
1、使用 AND 來顯示所有姓爲 "Carter" 並且名爲 "Thomas" 的人;
SELECT * FROM Persons WHERE FirstName='Thomas' AND
LastName='Carter'
查出結果集就是滿足兩個條件的數據。
2、使用 OR 來顯示所有姓爲 "Carter" 或者名爲 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas'
OR
lastname='Carter'
查出的結果集就是兩個條件 只要滿足任何一個的結果集。
3、Order by 語句
根據指定的列隊結果集進行排序,默認按照升序排列。
排列方式分爲 Order by asc (升序) 和 Order by desc (降序)。這裏需要進一步說明的是如果排序的條件相同的數據不止一條的話,結果集還是會根據升序優先的原則展示數據(null 爲優先顯示數據);
基礎語法: select * from tableName where tableOrder> '10000' and tableOrder<'20000' Order by tableOrder desc
所查結果集爲 tableName 表中 tableOrder 的值介於 10000---20000之間的數據,並按照降序排列。
4、TOP 語句
使用場景:數據量過大的話,使用top 語句查詢表頭多少筆數據。
不同的數據庫系統 TOP 語句略有差異,這裏不做展示。
5、LIKE 操作符(模糊查詢)
like 操作符用於where 子句中搜索列中的制定模式。
基本語法:(實例描述 查找居住在以N開頭的名字的城市的人)
SELECT * FROM Persons WHERE City LIKE 'N%'
注意 like ‘%N’(以N開頭) 與 like '%N%' (名稱中含N) 和 like 'N%'(以 N字符結尾的)
6、SQL 的通配符
sql 通配符必須配合like操作符同時使用,可以在數據庫查詢的時候可以替代一個或多個字符,通配符有四種;
通配符 | 描述 |
---|---|
% | 替代一個或多個字符 |
_ | 僅替代一個字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist] 或者 [!charlist] |
不在字符列 |
依據下張Person表 對以上幾種操作符詳細說明;
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
1、%操作符
現在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裏的人:
SELECT * FROM Persons WHERE City LIKE 'Ne%'
結果集:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
2 | Bush | George | Fifth Avenue | New York |
2、_操作符
現在,我們希望從上面的 "Persons" 表中選取名字的第一個字符之後是 "eorge" 的人:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
結果集:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
2 | Bush | George | Fifth Avenue | New York |
接下來,我們希望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字符,然後是 "r",然後是任意 字 符,然後是 "er":
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
結果集:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
3 | Carter | Thomas | Changan Street | Beijing |
3、[ ]操作符
現在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
結果集:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
4、[! ] 操作符
現在,我們希望從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人:
LECT * FROM Persons WHERE City LIKE '[!ALN]%'
結果集:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
3 | Carter | Thomas | Changan Street | Beijing |
7、between 操作符
between ... and 操作符在where子句中使用,介於選取兩個值之間範圍的數據。
基本語法:select * from tableName where columName between value1 and value2
重要事項:不同的數據庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些數據庫會列出介於 "value1" 和 "value2" 之間的人,但不包括 "value1" 和 "value2" ;某些數據庫會列出介於 "value1" 和 "value2" 之間幷包括 "value1" 和 "value2" 的數據;而另一些數據庫會列出介於 "value1" 和 "value2" 之間的數據,包括 "value1" ,但不包括 "value2" 。所以,請檢查你的數據庫是如何處理 BETWEEN....AND 操作符的!
8、JOIN 語法
join 語法用於根據兩張或者多張表之間的關聯關係,查詢這些表中的相關數據。
數據庫中的表可通過主鍵將表與表關聯起來, 主鍵時表中的一個列,主鍵的值在一個表中是唯一的,這樣就可以把表與表通 過主鍵關聯起來做捆綁查詢。
請看 "Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
請注意,"Id_P" 列是 Persons 表中的的主鍵。這意味着沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P 也可以區分他們。
接下來請看 "Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
請注意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用於引用 "Persons" 表中的人,而無需使用他 們的確切姓名。請留意,"Id_P" 列把上面的兩個表聯繫了起來
下邊引用兩個表,查詢查詢誰訂購了產品,並且訂購了多少。
方式1:普通SQL
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE
Persons.Id_P = Orders.Id_P
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
方式2: inner join
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons
INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
astName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
注:inner join 在表中存在至少有一個匹配(即用來關聯的這個一個字段是有值)的時候返回該行,否則不出現該條記錄。
同樣的查詢還有:
- JOIN: 如果表中有至少一個匹配,則返回行
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就返回行
9、LEFT Join On(左連接,某些數據庫也將其稱爲左外連接)
Left Join 會從左表哪裏返回所有的行,即使在右表中沒有匹配的行。
語法:SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
實例:下表
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
業務需求:列出Persons 表中所有歐訂單的人,並根據LastName進行降序排列。
sql 語句:Select Persons.lastName Persons.firstName,Order.OrderNo from Persons left Join Orders On Persons.ID_p=Orders.ID_p Order By Persons.lastName 。
查詢結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
10、Right Join (右連接 也稱右外連接)
Right Join 會根據右表返回所有的行,即使在左表中沒有匹配的行。
語法:SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
實例:下表
Persons 表
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
Orders 表
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
業務需求:列出所有的訂單 和他的所有人 並根據Persons表中的LastName 字段進行降序排列 。
sql 語句:Select Persons.LastName,Persons.FristName,Orders.OrderNo from Persons Right Join Orders On Persons.Id_p = Orders.Id_p ORDER BY Persons.LastName;
查詢結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
11、Full Join On關鍵字
只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行。
基礎語法:SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
實體:下表
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
業務需求:列出所有的人,以及他們的定單,以及所有的定單,以及定購它們的人。
SQL 語句:SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName
查詢結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George | |
34764 |
full join on 關鍵字會從左表(Persons)和右表(Orders)那裏返回所有的行。如果 "Persons" 中的行在表 "Orders" 中沒有 匹配,或者如果 "Orders" 中的行在表 "Persons" 中沒有匹配,這些行同樣會列出。
12、平均數函數 AVG()
AVG()函數返回數值列。null 值不包括計算中。
基礎語法: Select SVG(column_name) from table_name;
SVG()實例 :下表Orders表
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
需求:計算 "OrderPrice" 字段的平均值。
SQL 語句 :Select AVG(OrderPrice) AS orderAvgrage from orders;
查詢結果集:
OrderAverage |
---|
950 |
拓展實例:找到 OrderPrice 值高於 OrderPrice 平均值的客戶。
SQL 語句 :SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
查詢結果集:
Customer |
---|
Bush |
Carter |
Adams |
13、查詢總數 Count();
函數返回指定列的值的數目(null 值不計入在內)
說明:COUNT(column_name) 與COUNT(*)
COUNT(column_name) 返回列 column_name (值爲null 的不計算在內)。
COUNT(*) 返回數據庫表中的總資料數目。
基礎語法:SELECT COUNT(column_name) FROM table_name;
COUNT()語法實例一:
COUNT(*) 函數返回表中的記錄數
SQL 語句:SELECT COUNT(*) FROM table_name
COUNT()語法實例二:
COUNT(DISTINCT column_name) 函數返回指定列的不同值的數目:
SQL 語句:SELECT COUNT(DISTINCT column_name) FROM table_name
14、First() 函數 與Last() 函數
FIRST() 函數返回指定的字段中第一個記錄的值。
Last() 函數返回指定的字段中最後一個記錄的值。
基礎語法:Select first(column_name) from tableName;
基礎語法:Select last(column_name) from tableName;
實例:如下表Orders
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
需求一:查找 "OrderPrice" 列的第一個值。
SQL 語句:SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
查詢結果集:
FirstOrderPrice |
---|
1000 |
需求二:查找“OrderPrice” 列的最後一個值。
SQL 語句:SELECT Last(OrderPrice) AS FirstOrderPrice FROM Orders
查詢結果集:
LastOrderPrice |
---|
100 |
15、Max()函數與Min()函數、sum ()函數
MAX 函數返回一列中的最大值。NULL 值不包括在計算中。
MIN 函數返回一列中的最小值。NULL 值不包括在計算中。
SUM 函數返回數值列的總數(總額) 通常與Gourp By 配合使用。
基礎語法:SELECT MAX(column_name) /MIN(column_name) FROM table_name;
實例:下表Orders
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
需求一:查找OrderPrice 列下最大值;
SQL 語句:SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders;
LargestOrderPrice |
---|
2000 |
需求二:查找OrderPrice 列下最小值;
SQL 語句:SELECT MIN(OrderPrice) AS LargestOrderPrice FROM Orders;
SmallestOrderPrice |
---|
100 |
需求三:查找 "OrderPrice" 字段的總數。
SQL 語句:SELECT SUM(OrderPrice) AS OrderTotal FROM Orders;
OrderTotal |
---|
5700 |
16、SQL 快速參考
語句 | 語法 |
---|---|
AND / OR | SELECT column_name(s) FROM table_name WHERE condition AND|OR condition |
ALTER TABLE (add column) | ALTER TABLE table_name ADD column_name datatype |
ALTER TABLE (drop column) | ALTER TABLE table_name DROP COLUMN column_name |
AS (alias for column) | SELECT column_name AS column_alias FROM table_name |
AS (alias for table) | SELECT column_name FROM table_name AS table_alias |
BETWEEN | SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 |
CREATE DATABASE | CREATE DATABASE database_name |
CREATE INDEX | CREATE INDEX index_name ON table_name (column_name) |
CREATE TABLE | CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, ....... ) |
CREATE UNIQUE INDEX | CREATE UNIQUE INDEX index_name ON table_name (column_name) |
CREATE VIEW | CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition |
DELETE FROM | DELETE FROM table_name (Note: Deletes the entire table!!) or DELETE FROM table_name |
DROP DATABASE | DROP DATABASE database_name |
DROP INDEX | DROP INDEX table_name.index_name |
DROP TABLE | DROP TABLE table_name |
GROUP BY | SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 |
HAVING | SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 HAVING SUM(column_name2) condition value |
IN | SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..) |
INSERT INTO | INSERT INTO table_name VALUES (value1, value2,....) or INSERT INTO table_name |
LIKE | SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern |
ORDER BY | SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC] |
SELECT | SELECT column_name(s) FROM table_name |
SELECT * | SELECT * FROM table_name |
SELECT DISTINCT | SELECT DISTINCT column_name(s) FROM table_name |
SELECT INTO (used to create backup copies of tables) |
SELECT * INTO new_table_name FROM original_table_name or SELECT column_name(s) |
TRUNCATE TABLE (deletes only the data inside the table) |
TRUNCATE TABLE table_name |
UPDATE | UPDATE table_name SET column_name=new_value [, column_name=new_value] WHERE column_name=some_value |
WHERE | SELECT column_name(s) FROM table_name WHERE condition |