SQL高级

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值