MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

這一篇主要寫多表查詢 SQL

a表數據

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

b表數據

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

第一》 INNER JOIN : 關鍵字在表中存在至少一個匹配時返回行。

語法

SELECT 字段名(s) FROM 表1 INNER JOIN 表2 ON 表1.字段名=表2.字段名;

或:

SELECT 字段名(s) FROM table1 JOIN 表1ON 表1.字段名=表2.字段名;

注:NNER JOIN 與 JOIN 是相同的。

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

題目說明:查找方式是,表1中的字段的第一行去表2中一個一個查詢匹配,如果有匹配就返回行的數據,然後到表1中的字段第二行的去表2中同上查找匹配,.....直到查找完,如果表1中有重複的數據,查找到也是會重複匹配,如上圖就是a表中有兩個姓名為“小米”,所以返回b表有三行是姓名為“小米”是重複的。

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

藍色背景表示為查詢出來的數據

第二》LEFT JOIN :關鍵字從左表(表1)返回所有的行,即使右表(表2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。

語法:SELECT 字段名(s) FROM 表1 LEFT JOIN 表2 ON 表1.字段名=表2.字段名;

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

題目說明:鏈接a表是左表,b表是右表,查詢返回a表的所有行,返回a表所有行,即使b表沒有匹配,b表沒有匹配時為null;

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

藍色背景表示為查詢出來的數據

第三 》RIGHT JOIN : 關鍵字從右表(表2)返回所有的行,即使左表(表1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。

語法:SELECT 字段名(s) FROM 表1 RIGHT JOIN 表2 ON 表1.字段名=表2.字段名;

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

題目說明:鏈接a表是左表,b表是右表,查詢返回b表的所有行,返回b表所有行,即使a表沒有匹配,a表沒有匹配時為null

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

藍色背景表示為查詢出來的數據

第四 》在使用 join 時,on 和 where 條件的區別如下:

  • 1、 on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否為真,都會返回左邊表中的記錄。
  • 2、where 條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義,條件不為真的就全部過濾掉。

第五 》UNION 關鍵字 用於合併兩個或多個 SELECT 語句的結果集。(不含重複)

語法:SELECT 字段名(s) FROM 表1 UNION SELECT 字段名(s) FROM 表2;

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

題目說明:查詢a表與b表的姓名,沒有重複的值

第六》UNION ALL 關鍵字 用於合併兩個或多個 SELECT 語句的結果集。(含重複)

語法:SELECT 字段名(s) FROM 表1 UNION ALL SELECT 字段名(s) FROM 表2;

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

題目說明:三個表的結果集的整合,查詢

請注意UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。

第七 》IN 操作符

IN 操作符允許您在 WHERE 子句中規定多個值。

IN語法 :SELECT 字段名(s) FROM 表名WHERE 字段名 IN (value1,value2,...);

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

a表數據

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

/*IN的用法 查詢a表中姓名為"小米"和小學的行*/
SELECT * FROM a WHERE NAME IN ("小米","小學");

IN 與 = 的異同

  • 相同點:均在WHERE中使用作為篩選條件之一、均是等於的含義
  • 不同點:IN可以規定多個值,等於規定一個值

MySQL中的SQL語句的鏈表查詢,約束,表結構的說明

第八 >> 複製表結構以及數據等說明

/*複製表結構及數據*/
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


分享到:


相關文章: