by Hugo 0453
内容来自W3School http://www.w3school.com.cn/sql/sql_in.asp
第二篇 SQL高级(一)--查询
2.1 Top子句
TOP 子句用于规定要返回的记录的数目。注意,并非所有的数据库系统都支持 TOP 子句。
SELECT TOP number|percent column_name(s)
FROM table_name
例子:
SELECT TOP 2 * FROM Persons SELECT TOP 50 PERCENT * FROM Persons
2.2 LIKE 操作符
用于在 WHERE 子句中搜索列中的指定模式。
例1: 从表中选取居住城市以 "N" 开始的人
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定义通配符(模式中缺少的字母)。
例2: 从表中选取居住城市以 "g" 结尾的人
SELECT * FROM Persons
WHERE City LIKE '%g'
例3: 从表中选取居住城市包含" lon "的人
SELECT * FROM Persons
WHERE City LIKE '%lon%'
例4: 从表中选取居住城市不包含" lon "的人
SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'
2.3 SQL 通配符
在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。SQL通配符必须与 LIKE 运算符一起使用
通配符 | 描述 |
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 |
例1: 从表中选取居住城市以 "A" 或 "L" 或 "N" 开始的人
SELECT * FROM Persons
WHERE City LIKE '[ALN]%'
例2 居住城市不以 "A" 或 "L" 或 "N" 开头的人
SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'
2.4 IN 操作符
允许我们在 WHERE 子句中规定多个值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
例: 从表中选取姓氏为 Adams 和 Carter 的人
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
2.5 Between 操作符
在 WHERE 子句中使用,操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期
例: 显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
例2:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
2.6 Alias(As:别名)
可以为列名称和表名称指定别名。优点,Alias使查询程序更易阅读和书写。
表的 SQL Alias 语法
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
列的 SQL Alias 语法
SELECT LastName AS Family, FirstName AS Name
FROM Persons
结果:
Family | Name |
Adams | John |
Bush | George |
Carter | Thomas |
2.7 Join
用于根据两个或多个表中的列之间的关系,从这些表中查询数据
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果,此时就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
2.7.1 Inner Join
在表中存在至少一个匹配时,INNERJOIN 关键字返回行。
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
例:列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。
"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 |
"Orders" 表:
Id_O | OrderNo | Id_P |
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
结果集:
LastName | FirstName | OrderNo |
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
2.7.2 Left Join左外连接
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
注释:在某些数据库中, LEFTJOIN 称为 LEFT OUTER JOIN。
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
例子:我们希望列出所有的人,以及他们的定购 - 如果有的话
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
结果集:
LastName | FirstName | OrderNo |
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
|
2.7.3 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
例子:列出所有的定单,以及定购它们的人 - 如果有的话
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
结果集:
LastName | FirstName | OrderNo |
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
|
| 34764 |
2.7.4 Full Join全连接
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
SELECT
column_name(s)
FROM
table_name1
FULL
JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
例子:列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。
结果集:
LastName | FirstName | OrderNo |
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
|
|
| 34764 |
2.8 Union / Union All
用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SELECT
column_name(s) FROM table_name1
UNION
SELECT
column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
SELECT column_name(s) FROM table_name1
UNIONALL
SELECT column_name(s) FROM table_name2
2.9 Select Into
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
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
实例 - 制作备份复件
下面的例子会制作 "Persons" 表的备份复件:
SELECT *
INTO Persons_backup
FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
实例 - 带有 WHERE 子句
通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:
SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
实例 - 被连接的表
下面的例子会创建一个名为 "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