SELECT 语句
解释
select 语句用于冲表中选取数据。结果被储存在一个结果表(称为结果集)中
用法
-
select 列名称 from 表名称
-
select * from 表名称
举个栗子
如需获取名为 "LastName" 和 "FirstName" 的列的内容(从名为 "Persons" 的数据库表),请使用类似这样的 SELECT 语句:
SELECT LastName,FirstName FROM Persons
"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 |
结果:
LastName | FirstName |
---|---|
Adams | John |
Bush | George |
Carter | Thomas |
DISTINCT 语句
解释
distinct 用于返回唯一不同的值
用法
-
select distinct 列名称 from 表名称
举个栗子
从 "Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句
SELECT DISTINCT Company FROM Orders
"Orders"表:
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
结果:
Company |
---|
IBM |
W3School |
Apple |
WHERE 语句
解释
where 子句后面添加条件,可以筛选出符合条件的数据
语法
-
select 列表名 from 表名称 where 条件
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
IN | 指定针对某个列的多个可能值 |
EXISTS | 在子查询中匹配到符合条件的数据行 |
注:在某些版本中,<>
相当于!=
举个例子
选取住在BeiJing
的人,需要使用where子句
SELECT * FROM Persons WHERE City='Beijing'
"Persons" 表
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
TOP 语句
解释
top 子句用于规定要返回的记录的数目,对于拥有数千条记录的大型表来说,top子句式非常有用的,但是并非所有的数据库系统都支持top子句
top子句于limit是等价的
语法
-
select top 数字 列名 from 表名
-
select top 百分比 列名 from 表名
举个栗子
获取Persons表中的前三条数据
SELECT TOP 3 * FROM Persons 或者 SELECT * FROM Persons LIMIT 3
Persons 表:
Id | Name | Address | City |
---|---|---|---|
1 | Adams | Oxford Street | London |
2 | Bush | Fifth Avenue | New York |
3 | Carter | Changan Street | Beijing |
4 | Obama | Pennsylvania Avenue | Washington |
结果:
Id | Name | Address | City |
---|---|---|---|
1 | Adams | Oxford Stre | London |
2 | Bush | Fifth Avenue | New York |
3 | Carter | Changan Street | Beijing |
AND/OR 语句
解释
AND用于第一个条件和第二个条件都成立的情况
OR用于第一个条件和第二个条件成立一个的情况
语法
-
select 列名称 from where 条件一 and 条件二
-
select 列名称 from where 条件一 or 条件二
举个栗子
原表
LastName | FirstName | Address | City |
---|---|---|---|
Adams | John | Oxford Street | London |
Bush | George | Fifth Avenue | New York |
Carter | Thomas | Changan Street | Beijing |
Carter | William | Xuanwumen 10 | Beijing |
获取所有名为 "Thomas"并且姓为"Carter"的人
SELECT * FROM Persons WHERE LastName='Carter' AND FirstName='Thomas'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
获取所有名为 "Thomas"或姓为"Carter"的人
SELECT * FROM Persons WHERE LastName='Carter' OR FirstName='Thomas'
结果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Carter | William | Xuanwumen 10 | Beijing |
GROUP BY 语句
解释
通常与聚合函数相结合,根据一个或多个列对结果集进行分组
语法
-
select 列名,聚合函数(列名)from 表名 where 列名 运算符 值 group by 列名
举个栗子
我们拥有下面这个 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
查找每个客户的总金额
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
结果:
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
如果省略group by 会怎样?
SELECT Customer,SUM(OrderPrice) FROM Orders
结果如下
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
解释
该语句指定了两列(Customer 和SUM(OrderPrice))。“SUM(OrderPrice)”返回的一个单独的值(“OrderPrice”列的总和),而“Customer”返回6个值(每个值对应 "Orders" 表中的每一行)
HAVING 语句
解释
having主要分组后的数据进一步的过滤,找到符合分组条件的记录
语法
-
select column_name,aggregate_function(column_name)
from table_name
where column_name operator value
group by column_name
having aggregate_function(column_name) operator value
举个栗子
Orders 表
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
现在要找订单总金额少于2000的客户
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
结果
Customer | SUM(OrderPrice) |
---|---|
Carter | 1700 |
现在我们查找客户“Bush”或“Adams”拥有超过1500的订单总金额
SELECT Customer,SUM(OrderPrice) From Orders where Customer = 'Bush' or Customer = 'Adams' Group by Customer having sum(OrderPrice)>=1500 where Customer = 'Bush' or Customer = 'Adams'
结果
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Adams | 2000 |
ORDER BY 语句
解释
-
用于根据指定的列对结果集进行排序
-
默认按照升序对记录进行排序
语法
-
select 列表名 from 表名 order by 列表名 asc/desc
举个栗子
Orders表
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
以字母顺序显示公司名称
select * from Orders order by Company
结果
Company | OrderNumber |
---|---|
Apple | 4698 |
IBM | 3532 |
W3School | 6953 |
W3School | 2356 |
以字母逆序显示公司名称,相同的公司按照顺序号进行排序
select * from Orders order by Company desc,OrderNumber asc
结果
Company | OrderNumber |
---|---|
W3School | 2356 |
W3School | 6953 |
IBM | 3532 |
Apple | 4698 |
INSERT INTO 语句
解释
向表中插入数据记录
语法
-
insert into 表名称 values(值1,值2,...)
-
isnert into 表名称(列1,列2,...) values (值1,值2,...)
举个栗子
Persons 表
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
插入新的行
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
结果
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
插入新的行
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
结果
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Champs-Elysees |
UPDATE 语句
解释
更新表中的数据
语法
-
update 表名称 set 列名称 = 新值 where 列名称 = 某值
举个栗子
Person 表
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Champs-Elysees |
将 LastName 是“Wilson” 的人添加 “FirstName”
updata Person set FirstName = 'Fred' where LastName = 'Wilson'
结果
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Fred | Champs-Elysees |
更新 LastName 是“Wilson” 的人的住址,并添加城市
updata Person set Address = 'zhongshan 23',City = 'NanJing'
结果
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Fred | Zhongshan 23 | Nanjing |
DELETE 语句
解释
用于删除表中的行
语法
-
delete from 表名称 where 列名称 = 值
举个栗子
Person表
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Fred | Zhongshan 23 | Nanjing |
删除 “Fred Wilson”的信息
delete from Person where LastName = 'Wilson'
结果
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
删除所有行
DELETE FROM table_name
或者:
DELETE * FROM table_name
注意:这样的操作是不会删除表,表的结构、属性和索引都是完整的
LIKE 语句
解释
在where子句中用于指定模式来搜索数据,通常与%连用,被称为模糊查找
语法
-
select colum_name(s) from table_name where column_name like pattern
举个栗子
Pserson 表
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
找出“Person”表中住城市地址以“N”开头的人
select * from Person where City like 'N%'
结果
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
2 | Bush | George | Fifth Avenue | New York |
找出居住城市中包含“lon”的人
select * from Person where City like '%lon%'
结果
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
找出表中居住城市中不包含“lon”的人
select * from Person where City not like '%lon%'
结果
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
IN 语句
解释
in 运算符允许在where子句中指定多个值,可以理解为or条件的简写
语法
-
select column_name(s) from table_name where column_name in (value1,value2,...)
举个栗子
Person 表
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
获取表中LastName为“Adams”和“Carter”的人
select * from Person where LastName in ('ADams','Cater')
结果
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
3 | Carter | Thomas | Changan Street | Beijing |
BETWEEN AND 语句
解释
筛选出介于两个值之间的数据范围。这个值可以是数值、文本、日期等,区间范围为前闭后闭,前开后开,前闭后开都有可能,不同的数据库可能不同
语法
-
select column_name(s) from table_name where column_name between value1 and value2
举个栗子
Person 表
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"(不包括)之间的人
select * from Person where LastName between 'Adams' and 'Carter'
结果
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
可以与 not 进行连用
select * from Person where LastName not between 'Adams' and 'Carter'
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
3 | Carter | Thomas | Changan Street | Beijing |
4 | Gates | Bill | Xuanwumen 10 | Beijing |
UNION 语句
解释
组合两个或更多select语句的结果集
注意
-
union 中每个select 语句必须具有相同的列数
-
这些列也必须有相似的数据类型
语法
-
select column_name(s) from table_name1 union select column_name(s) from table_name2
-
select column_name(s) from table_name1 union all select column_name(s) from table_name2
举个栗子
Employees_China 表
E_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
Employees_Usa 表
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
找出所有在中和和在美国的不同员工(会去重)
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
结果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Gates, Bill |
找出所有在中和和在美国的不同员工(不会去重)
SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
结果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Carter, Thomas |
Gates, Bill |
JOIN 语句
解释
join 用于把来自两个或多个表的行结合起来,基于这些表之间的共享字段,
一般这些表有一个共同的键,这个键可以将这些表连接起来
一般有以下几种用法
-
JOIN: 如果表中有至少一个匹配,则返回行
-
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
-
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
-
FULL JOIN: 只要其中一个表中存在匹配,就返回行
语法
-
select A.Num_A, B.Num_B from A insert join B on A.Num_A=B.Num_B
-
select A.Num_A, B.Num_B from A left join B on A.Num_A=B.Num_B
-
select A.Num_A, B.Num_B from A full join B on A.Num_A=B.Num_B
举个栗子
Person 表
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 |
引用两个表
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER 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 |