SQL世界之命令语句Ⅲ

目录

[一、SQL JOIN](#一、SQL JOIN)

[1.JOIN 和 Key](#1.JOIN 和 Key)

[2.使用 JOIN](#2.使用 JOIN)

[3.不同的 SQL JOIN](#3.不同的 SQL JOIN)

[二、SQL INNER JOIN 关键字](#二、SQL INNER JOIN 关键字)

[1.SQL INNER JOIN 关键字](#1.SQL INNER JOIN 关键字)

[2.INNER JOIN 关键字语法](#2.INNER JOIN 关键字语法)

[3.内连接(INNER JOIN)实例](#3.内连接(INNER JOIN)实例)

[三、SQL LEFT JOIN 关键字](#三、SQL LEFT JOIN 关键字)

[1.SQL LEFT JOIN 关键字](#1.SQL LEFT JOIN 关键字)

[2.LEFT JOIN 关键字语法](#2.LEFT JOIN 关键字语法)

[3.左连接(LEFT JOIN)实例](#3.左连接(LEFT JOIN)实例)

[四、SQL RIGHT JOIN 关键字](#四、SQL RIGHT JOIN 关键字)

[1.SQL RIGHT JOIN 关键字](#1.SQL RIGHT JOIN 关键字)

[2.RIGHT JOIN 关键字语法](#2.RIGHT JOIN 关键字语法)

[3.右连接(RIGHT JOIN)实例](#3.右连接(RIGHT JOIN)实例)

[五、SQL FULL JOIN 关键字](#五、SQL FULL JOIN 关键字)

[1.SQL FULL JOIN 关键字](#1.SQL FULL JOIN 关键字)

[2.FULL JOIN 关键字语法](#2.FULL JOIN 关键字语法)

[3.全连接(FULL JOIN)实例](#3.全连接(FULL JOIN)实例)

[六、SQL UNION 和 UNION ALL 操作符](#六、SQL UNION 和 UNION ALL 操作符)

[1.SQL UNION 操作符](#1.SQL UNION 操作符)

[2.SQL UNION 语法](#2.SQL UNION 语法)

[3.SQL UNION ALL 语法](#3.SQL UNION ALL 语法)

[4.UNION 命令实例](#4.UNION 命令实例)

[5.UNION ALL](#5.UNION ALL)

[6.UNION ALL 命令实例](#6.UNION ALL 命令实例)

[七、SQL SELECT INTO 语句](#七、SQL SELECT INTO 语句)

[1.SELECT INTO 语句](#1.SELECT INTO 语句)

[2.SQL SELECT INTO 语法](#2.SQL SELECT INTO 语法)

[3.SQL SELECT INTO 实例-制作备份复件](#3.SQL SELECT INTO 实例-制作备份复件)

[4.SQL SELECT INTO 实例-带有 WHERE 子句](#4.SQL SELECT INTO 实例-带有 WHERE 子句)

[5.SQL SELECT INTO 实例-被连接的表](#5.SQL SELECT INTO 实例-被连接的表)


一、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

注:从一个以上的表中选取数据也是可以做到的。

相关推荐
做网站建设制作设计小程序推广5 小时前
南昌网站建设让你的企业网站更具竞争力
经验分享
slomay6 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
vvvae12347 小时前
分布式数据库
数据库
做网站建设制作设计小程序推广7 小时前
海南网站建设提升网站用户体验实用技巧
经验分享
雪域迷影7 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹8 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人8 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky8 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa8 小时前
【MySQL 06】表的增删查改
数据库·mysql
m0_689618289 小时前
水凝胶发生器,不对称设计妙,医电应用前景广
笔记