SQL高级
SQL TOP 子句
用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP子句是非常有用的。
注:并非所有的数据库系统都支持TOP子句。
语法:
SELECT TOP number|percent column_name(s) FROM table_name
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
MySQL语法:
SELECT column_name(s) FROM table_name LIMIT number
例:
SELECT * FROM Persons LIMIT 5
Oracle语法:
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
例:
SELECT * FROM Persons WHERE ROWNUM <= 5
实例-从表中选取头两条记录:
SELECT TOP 2 * FROM Persons
TOP PERCENT实例-从表中选取头50%的记录:
SELECT TOP 50 PERCENT * FROM Persons
SQL LIKE 操作符
用于在WHERE子句中搜索列中的指定模式。
语法:
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
实例-从表中选取居住在以“N”开始的城市里的人的记录:
SELECT * FROM Persons WHERE City LIKE 'N%'
提示:“%”可用于定义通配符(模式中缺少的字母)。
实例-从表中选取居住在以“g”结尾的城市里的人的记录:
SELECT * FROM Persons WHERE City LIKE '%g'
实例-从表中选取居住在包含“lon”的城市里的人的记录:
SELECT * FROM Persons WHERE City LIKE '%lon%'
实例-从表中选取居住在不包含“lon”的城市里的人的记录:
SELECT * FROM Persons WHERE City NOYT LIKE '%lon%'
SQL 通配符
在搜索数据库中的数据时,您可以使用 SQL 通配符,代替一个或多个字符。
SQL通配符必须于LIKE运算符一起使用。
通配符 | 描述 |
---|---|
% | 代表零个或多个字符 |
_ | 仅代表一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
使用%通配符
实例-从“Persons”表中选取居住在以“Ne”开始的城市里的人:
SELECT * FROM Persons WHERE City LIKE 'Ne%'
实例-从“Persons”表中选取居住在包含“lond”的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%lond%'
使用_通配符
实例-从“Persons”表中选取名字的第一个字符之后是“eorge”的人:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
实例-从“Persons”表中选取姓氏以“C”开头,然后是一个任意字符,然后是“r“,然后是一个任意字符,然后是“er“的人:
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
使用[charlist]通配符
实例-从“Persons”表中选居住的城市以“A”或者“L”或者“N”开头的人:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
实例-从“Persons”表中选取居住的城市不以“A”或者“L”或者“N”开头的人:
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
SQL IN 操作符
用于在WHERE子句中规定多个值。
语法:
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
实例-从表中选取姓氏为Adams和Carter的人:
SELECT * FROM Persons WHERE LastName IN ('Admas','Carter')
SQL BETWEEN 操作符
用在WHERE子句中,选取介于两个值之间的数据范围。
BETWEEN…AND会选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期。
语法:
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
实例-以字母顺序显示介于“Amads“(包括)和”Carter“(不包括)之间的人:
SELECT * FROM Persons WHERE LastName BETWEEN 'Amads' AND 'Carter'
**重要事项:**不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。
所以,请检查你的数据库是如何处理 BETWEEN…AND 操作符的!
实例-使用上面的例子显示范围之外的人,使用NOT操作符:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Amads' AND 'Carter'
SQL 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“的所有订单:
SELECT po.OrderID,p.LastName,p.FirstName
FROM Persons AS p,Prodeut_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 语句:
SELECT Product_Orders.OrderID,Persons.LastName,Persons.FirstName
FROM Persons,Prodeut_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
别名使查询程序更易阅读和书写。
实例-使用列名称别名
SELECT LastName AS Family,FirstName AS Name
FROM Persons
SQL 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。即使两个人的姓名完全相同,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” 列把上面的两个表联系了起来。
引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
使用JOIN
除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persond.LastName
不同的 SQL JOIN
除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
SQL 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 是相同的。
内连接(INNER JOIN)实例-列出所有人的订购:
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” 中没有匹配,就不会列出这些行。
SQL 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。
左连接(LEFT JOIN)实例-列出所有的人,以及他们的订购,如果有的话:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
SQL 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
**注释:**在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
右连接(RIGHT JOIN)实例-列出所有的订单,以及订购他们的人,如果有的话:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
SQL FULL JOIN 关键字
只要其中某个表存在匹配,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。
全连接(FULL JOIN)实例-列出所有的人,以及他们的订单,以及所有的订单,以及订购他们的人:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons