0%

SQLServer-Day4

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
2
3
SELECT * 
FROM Persons
WHERE LastName IN ('Adams', 'Carter')

结果:

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
2
3
4
SELECT *
FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

结果:

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
2
3
4
SELECT * 
FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'

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
2
3
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons, Product_Orders
WHERE p.LastName = 'Adams' AND p.FirstName = 'John'

如果不使用别名:

1
2
3
SELECT Persons.OrderID, Product_Orders.LastName, Product_Orders.FirstName
FROM Persons, Product_Orders
WHERE Product_Orders.LastName = 'Adams' AND Product_Orders.FirstName = 'John'

例:

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
2
SELECT LastName AS Family, FirstName as Name
FROM Persons

结果:

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
2
3
SELECT Persons.LastName, Persons.FirstName, Orders.No
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P

结果:

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

除了上面的方法,我们还可以使用关键字JOIN来从两个表中获取数据

如果我们希望列出所有人的订购,可以这样写:

1
2
3
4
5
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

不同的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 JOINJOIN是相同的

如果在”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
2
3
4
5
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
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
2
3
4
5
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
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
2
3
4
5
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
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George
34764

FLLL JOIN关键字会从左表(Persons)和右表(Orders)那里返回所有的行。如果“Persons”中的行在表“Orders”中没有匹配,或者如果“Orders”中的行在表“Persons”中没有匹配,这些行同样会列出。