SQL经典教程 第二篇:高级(一)--查询

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值