SQLServer-Day4
IN
操作符
允许我们在WHERE
子句中规定多个值
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, …)
原始的Persons表:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
例:寻找姓氏为Adams和Carter的人
1 | SELECT * |
结果:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
3 | Carter | Thomas | Changan Street | Beijing |
BETWEEN
操作符
在WHERE
子句中使用,作用是选取介于两个值之间的数据范围。
操作符BETWEEN ... AND
会选取介于两个值之间的数据范围。这些值可以是数据、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
原始的Persons表:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
4 | Gates | Bill | Xuanwumen 10 | Beijing |
例:寻找以字母顺序介于‘Adams’(包括)和‘Carter’(不包括)之间的人:
1 | SELECT * |
结果:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
**重要事项:**不同数据库对BETWEEN...AND
操作符的处理方式是有差异的。某些数据库会列出介于‘Adams’和‘Carter’的人,但不包括‘Adams’和‘Carter’;某些数据库会列出介于 ‘Adams’和‘Carter’之间并包括‘Adams’和‘Carter’的人;而另一些数据库会列出介于‘Adams’和‘Carter’之间的人,包括‘Adams’,但不包括‘Carter’
所以,需要检查自己的数据库是如何处理BETWEEN...AND
操作符的
例2:如果需要显示该范围之外的人,需要使用NOT
操作符:
1 | SELECT * |
Alias (别名)
可以为列名称和表名称指定别名(Alias)
表的SQL Alias语法
SELECT column_name(s)
FROM table_name
AS alias_name
列的SQL Alias语法
SELECT column_name AS alias_name
FROM table_name
例:使用表名称别名
假设我们有两个表分别是:“Persons” 和 “Product_Orders”。我们分别为它们指定别名 “p” 和 “po”。
现在,我们希望列出 “John Adams” 的所有定单。
1 | SELECT po.OrderID, p.LastName, p.FirstName |
如果不使用别名:
1 | SELECT Persons.OrderID, Product_Orders.LastName, Product_Orders.FirstName |
例:
Persons表:
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 | SELECT LastName AS Family, FirstName as Name |
结果:
Family | FirstName |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
注意:这里的列的名称也发生了改变!
JOIN
join
用于根据两个或多个表中的列之间的关系,从这些表中查询数据
Join和Key
有时,为了得到完整的结果,我们需要从两个或更多的表中获取数据,我们就需要执行join
数据库中的表可通过键值将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样说的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
例如,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
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 | SELECT Persons.LastName, Persons.FirstName, Orders.No |
结果:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
除了上面的方法,我们还可以使用关键字JOIN
来从两个表中获取数据
如果我们希望列出所有人的订购,可以这样写:
1 | SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo |
不同的SQL JOIN
除了上面使用的INNER JOIN
(内连接),还有其他的连接方式
JOIN
:如果表中至少有一个匹配,则返回LEFT JOIN
:即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN
:即使左表中没有匹配,也从右表中返回所有的行FULL JOIN
:只要其中一个表中存在匹配,就返回行
INNER JOIN 关键字
在表中至少存在一个匹配项时,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“中的行在“Orders”中没有匹配,则不会返回
LEFT JOIN关键字
LEFT JOIN
关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配
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表和Orders表中采用左连接,即:
1 | SELECT Persons.LastName, Persons.FirstName, Orders,OrderNo |
结果:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
RIGHT JOIN 关键字
RIGHT JOIN
关键字会在右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name = table_name2.column_name
还是上面那两张表
1 | SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo |
结果:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
RIGHT JOIN
关键字会从右表(Orders)那里返回所有的行,即使在左表(Persons)中没有匹配的行
FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN
关键字就回返回行
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name = table_name2.column_name
Persons表和Orders表同上
1 | SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo |
结果
LastName | FirstName | OrderNo | ||
---|---|---|---|---|
Adams | John | 22456 | ||
Adams | John | 24562 | ||
Carter | Thomas | 77895 | ||
Carter | Thomas | 44678 | ||
Bush | George | |||
34764 |
FLLL JOIN
关键字会从左表(Persons)和右表(Orders)那里返回所有的行。如果“Persons”中的行在表“Orders”中没有匹配,或者如果“Orders”中的行在表“Persons”中没有匹配,这些行同样会列出。