目录
4.SQL SELECT INTO 实例-带有 WHERE 子句
一、SQL JOIN
1.JOIN 和 Key
SQL JOIN 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
注:数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
001 | Aam | Joh | Oxd Street | London |
002 | Buh | Grge | Fifth Aue | New York |
003 | Car | Tmas | Can Street | Beijing |
"Id_P" 列是 Persons 表中的的主键,没有两行能够拥有相同的 Id_P。因此当两个人的姓名完全相同时,用Id_P 区分。
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 003 |
2 | 44678 | 003 |
3 | 22456 | 001 |
4 | 24562 | 001 |
5 | 34764 | 005 |
"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用确切姓名。
注:"Id_P" 列把上面的两个表联系了起来。
通过引用两个表,从而获取数据:“谁订购了产品,并且他们订购了什么产品?”的SQL语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
结果集:
LastName | FirstName | OrderNo |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
2.使用 JOIN
列出所有人的定购,使用的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
3.不同的 SQL JOIN
除了上面的例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接:
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
二、SQL INNER JOIN 关键字
1.SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
2.INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注:INNER JOIN 与 JOIN 是相同的。
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
001 | Aam | Joh | Oxd Street | London |
002 | Buh | Grge | Fifth Aue | New York |
003 | Car | Tmas | Can Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 003 |
2 | 44678 | 003 |
3 | 22456 | 001 |
4 | 24562 | 001 |
5 | 34764 | 005 |
3.内连接(INNER JOIN)实例
列出所有人的定购,使用的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
注:INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。
三、SQL LEFT JOIN 关键字
1.SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
2.LEFT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
001 | Aam | Joh | Oxd Street | London |
002 | Buh | Grge | Fifth Aue | New York |
003 | Car | Tmas | Can Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 003 |
2 | 44678 | 003 |
3 | 22456 | 001 |
4 | 24562 | 001 |
5 | 34764 | 005 |
3.左连接(LEFT JOIN)实例
列出所有的人,以及他们的定购(如果有的话),使用的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
Buh | Grge |
注:LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
四、SQL RIGHT JOIN 关键字
1.SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
2.RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
001 | Aam | Joh | Oxd Street | London |
002 | Buh | Grge | Fifth Aue | New York |
003 | Car | Tmas | Can Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 003 |
2 | 44678 | 003 |
3 | 22456 | 001 |
4 | 24562 | 001 |
5 | 34764 | 005 |
3.右连接(RIGHT JOIN)实例
列出所有的定单,以及定购它们的人(如果有的话),使用的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName | FirstName | OrderNo |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
34764 |
注:RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
五、SQL FULL JOIN 关键字
1.SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
2.FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。
"Persons" 表:
Id_P | LastName | FirstName | Address | City |
001 | Aam | Joh | Oxd Street | London |
002 | Buh | Grge | Fifth Aue | New York |
003 | Car | Tmas | Can Street | Beijing |
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 003 |
2 | 44678 | 003 |
3 | 22456 | 001 |
4 | 24562 | 001 |
5 | 34764 | 005 |
3.全连接(FULL JOIN)实例
列出所有的人和他们的定单,以及所有的定单和定购它们的人,使用的 SELECT 语句:
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 |
Aam | Joh | 22456 |
Aam | Joh | 24562 |
Car | Tmas | 77895 |
Car | Tmas | 44678 |
Buh | Grge | |
34764 |
注:FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
六、SQL UNION 和 UNION ALL 操作符
1.SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注:UNION 内部的 SELECT 语句必须拥有相同数量的列,并且列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
2.SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注:UNION 操作符默认选取不同的值。如果允许重复的值,使用 UNION ALL。
3.SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
注:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
Employees_China:
E_ID | E_Name |
001 | Li, Hua |
002 | Wang, Wei |
003 | Car, Tmas |
004 | Sun, Ming |
Employees_USA:
E_ID | E_Name |
001 | Aam, Joh |
002 | Buh, Grge |
003 | Car, Tmas |
004 | Gates, Bill |
4.UNION 命令实例
列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
结果集:
E_Name |
Li, Hua |
Wang, Wei |
Car, Tmas |
Sun, Ming |
Aam, Joh |
Buh, Grge |
Gates, Bill |
注:这个命令无法列出在中国和美国的所有雇员。有两个名字相同的雇员,只有一个人被列出来了。UNION 命令只会选取不同的值。
5.UNION ALL
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2
6.UNION ALL 命令实例
列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
结果
E_Name |
Li, Hua |
Wang, Wei |
Car, Tmas |
Sun, Ming |
Aam, Joh |
Buh, Grge |
Car, Tmas |
Gates, Bill |
七、SQL SELECT INTO 语句
1.SELECT INTO 语句
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
2.SQL SELECT INTO 语法
把所有的列插入新表:
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
只把希望的列插入新表:
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
3.SQL SELECT INTO 实例-制作备份复件
制作 "Persons" 表的备份复件:
SELECT *
INTO Persons_backup
FROM Persons
IN 子句可用于向另一个数据库中拷贝表:
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
在 SELECT 语句后列出这些域,以达到拷贝的目的:
SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
4.SQL SELECT INTO 实例-带有 WHERE 子句
从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建一个带有两个列的名为 "Persons_backup" 的表:
SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
5.SQL SELECT INTO 实例-被连接的表
创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从“Persons”和“Orders”两个表中取得的信息:
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
注:从一个以上的表中选取数据也是可以做到的。