這一篇主要寫多表查詢 SQL
a表數據
b表數據
第一》 INNER JOIN : 關鍵字在表中存在至少一個匹配時返回行。
語法:
SELECT 字段名(s) FROM 表1 INNER JOIN 表2 ON 表1.字段名=表2.字段名;
或:
SELECT 字段名(s) FROM table1 JOIN 表1ON 表1.字段名=表2.字段名;
注:NNER JOIN 與 JOIN 是相同的。
題目說明:查找方式是,表1中的字段的第一行去表2中一個一個查詢匹配,如果有匹配就返回行的數據,然後到表1中的字段第二行的去表2中同上查找匹配,.....直到查找完,如果表1中有重複的數據,查找到也是會重複匹配,如上圖就是a表中有兩個姓名為“小米”,所以返回b表有三行是姓名為“小米”是重複的。
藍色背景表示為查詢出來的數據
第二》LEFT JOIN :關鍵字從左表(表1)返回所有的行,即使右表(表2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
語法:SELECT 字段名(s) FROM 表1 LEFT JOIN 表2 ON 表1.字段名=表2.字段名;
題目說明:鏈接a表是左表,b表是右表,查詢返回a表的所有行,返回a表所有行,即使b表沒有匹配,b表沒有匹配時為null;
藍色背景表示為查詢出來的數據
第三 》RIGHT JOIN : 關鍵字從右表(表2)返回所有的行,即使左表(表1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。
語法:SELECT 字段名(s) FROM 表1 RIGHT JOIN 表2 ON 表1.字段名=表2.字段名;
題目說明:鏈接a表是左表,b表是右表,查詢返回b表的所有行,返回b表所有行,即使a表沒有匹配,a表沒有匹配時為null
藍色背景表示為查詢出來的數據
第四 》在使用 join 時,on 和 where 條件的區別如下:
- 1、 on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否為真,都會返回左邊表中的記錄。
- 2、where 條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義,條件不為真的就全部過濾掉。
第五 》UNION 關鍵字 用於合併兩個或多個 SELECT 語句的結果集。(不含重複)
語法:SELECT 字段名(s) FROM 表1 UNION SELECT 字段名(s) FROM 表2;
題目說明:查詢a表與b表的姓名,沒有重複的值
第六》UNION ALL 關鍵字 用於合併兩個或多個 SELECT 語句的結果集。(含重複)
語法:SELECT 字段名(s) FROM 表1 UNION ALL SELECT 字段名(s) FROM 表2;
題目說明:三個表的結果集的整合,查詢
請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。
第七 》IN 操作符
IN 操作符允許您在 WHERE 子句中規定多個值。
IN語法 :SELECT 字段名(s) FROM 表名WHERE 字段名 IN (value1,value2,...);
/*IN的用法 查詢a表中姓名為"小米"和小學的行*/ SELECT * FROM a WHERE NAME IN ("小米","小學");
IN 與 = 的異同
- 相同點:均在WHERE中使用作為篩選條件之一、均是等於的含義
- 不同點:IN可以規定多個值,等於規定一個值
第八 >> 複製表結構以及數據等說明
/*複製表結構及數據*/ CREATE TABLE d SELECT * FROM b;
/*複製表結構,不復制數據*/ CREATE TABLE f SELECT * FROM b WHERE 1=2;
/*複製b表的數據到f表,兩張表結構一樣的*/ INSERT INTO f SELECT * FROM b;
/*複製b表的數據到f表,兩張表結構不一樣的*/ INSERT INTO f(NAME,passsword,address) SELECT user_name,user_password,age FROM userinfo;
/*創建臨時表*/ CREATE TEMPORARY TABLE g SELECT * FROM b;
/*查詢臨時臨時表*/ SELECT * FROM g;
/*動手刪除臨時表或者關閉當前會話時,自動銷燬臨時表*/ DROP TABLE g;
/*顯示數據庫中的全部數據表SHOW TABLES是無法顯示臨時表*/ SHOW TABLES
第九 約束
/*約束 創建表*/ CREATE TABLE Persons ( ID INT NOT NULL, LastName VARCHAR(50) NOT NULL, FirstName VARCHAR(50) NOT NULL, Age INT );
/*把Persons表中的age字段改為不能空*/ ALTER TABLE Persons MODIFY age INT NOT NULL;
/*把Persons 表中的age字段改為空*/ ALTER TABLE persons MODIFY age INT NULL;
/*把id設置為主鍵*/ ALTER TABLE Persons ADD PRIMARY KEY(ID);
/*刪除已有的主鍵*/ ALTER TABLE Persons DROP PRIMARY KEY;
/*外鍵*/ "Orders" 表創建時在 "P_Id" 列上創建 FOREIGN KEY 約束:
CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, PRIMARY KEY (O_Id), FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) )
總結:
INNER JOIN
left JOIN
Rlght JOIN
UNION ALL
UNION