1、select查询语句
一、简介
SQL SELECT 语句
SELECT 语句用于从表中选取数据。
结果被存储在一个结果表中(称为结果集)。
1. SQL SELECT 语法
SELECT 列名称 FROM 表名称
以及:
SELECT * FROM 表名称
- 注释:SQL 语句对大小写不敏感。SELECT 等效于 select。
二、示例
- “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 |
1. 获取名为 “LastName” 和 “FirstName” 的列的内容(从名为 “Persons” 的数据库表)
SELECT LastName,FirstName FROM Persons
- 结果
| LastName | FirstName |
| — | — |
| Adams | John |
| Bush | George |
| Carter | Thomas |
1. 从 “Persons” 表中选取所有的列。
使用符号 * 取代列的名称,就像这样:
SELECT * FROM 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 |
2、distinct查询去重语句
一、简介
1. SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
1. 语法:
SELECT DISTINCT 列名称 FROM 表名称
二、示例
- "Orders"表:
| Company | OrderNumber |
| — | — |
| IBM | 3532 |
| W3School | 2356 |
| Apple | 4698 |
| W3School | 6953 |
1. 从 “Company” 列中选取所有的值,我们需要使用 SELECT 语句:
SELECT Company FROM Orders
- 结果
| Company |
| — |
| IBM |
| W3School |
| Apple |
| W3School |
1. 从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:
SELECT DISTINCT Company FROM Orders
- 结果:
| Company |
| — |
| IBM |
| W3School |
| Apple |
3、top返回指定记录数
一、简介
1. TOP 子句
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
1. 用法
SELECT column_name(s) FROM table_name LIMIT number
二、示例
- 原始的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 |
| 4 | Obama | Barack | Pennsylvania Avenue | Washington |
1. SQL TOP 实例
- 现在,我们希望从上面的 “Persons” 表中选取头两条记录。
- 我们可以使用下面的 SELECT 语句:
- SELECT TOP 2 * FROM Persons
- 结果:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
1. SQL TOP PERCENT 实例
- 现在,我们希望从上面的 “Persons” 表中选取 50% 的记录。
- 我们可以使用下面的 SELECT 语句:
- SELECT TOP 50 PERCENT * FROM Persons
- 结果:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
4、Alias别名
1. SQL Alias
- 表的 SQL Alias 语法
- SELECT column_name(s) FROM table_name AS alias_name
- 列的 SQL Alias 语法
- SELECT column_name AS alias_name FROM table_name
1. Alias 实例: 使用表名称别名
- 假设我们有两个表分别是:“Persons” 和 “Product_Orders”。我们分别为它们指定别名 “p” 和 “po”。
- 现在,我们希望列出 “John Adams” 的所有定单。
- 我们可以使用下面的 SELECT 语句:
- SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName=‘Adams’ AND p.FirstName=‘John’
- 不使用别名的 SELECT 语句:
- SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName FROM Persons, Product_Orders WHERE Persons.LastName=‘Adams’ AND Persons.FirstName=‘John’
- 从上面两条 SELECT 语句您可以看到,别名使查询程序更易阅读和书写。
1. Alias 实例: 使用一个列名别名
- 表 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 |
- SQL:
- SELECT LastName AS Family, FirstName AS Name FROM Persons
- 结果:
| Family | Name |
| — | — |
| Adams | John |
| Bush | George |
| Carter | Thomas |
5、where筛选子句
1. WHERE 子句
- 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
- 语法
- SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
- 下面的运算符可在 WHERE 子句中使用:
| 操作符 | 描述|
| — | — |
| = | 等于 |
| <> | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
1. where子句对行记录进行过滤
- 常用算数运算符:+,-,*, / 对应 加,减,乘,除
- 常用逻辑运算符:and (而且);or(或者);not (非)
- 常用比较运算符:
- = 等于;!=或<>不等于;>大于;<小于;>=大于等于;<=小于等于;
- is null为空值;is not null为非空值;
- in (值列表) 在值列表中;not in (值列表)不在值列表中;
- between 低值 and 高值 (包含低值和高值)在低值和高值之间;
- not between 低值 and 高值 (包含低值和高值)不在低值和高值范围内;
- like ‘通配符’按照通配符进行匹配;
- 常用通配符:% 匹配0个或任意多个字符;_ 匹配任意1个字符
- 运算符优先级
- 各类运算符之间存在优先级,不用死记,只记住括号( )的优先级最高即可
- **注释:**在某些版本的 SQL 中,操作符 <> 可以写为 !=。
1. 使用 WHERE 子句
- 如果只希望选取居住在城市 “Beijing” 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
- SELECT * FROM Persons WHERE City=‘Beijing’
- “Persons” 表
| **LastName** | **FirstName** | **Address** | **City** | **Year** |
| — | — | — | — | — |
| Adams | John | Oxford Street | London | 1970 |
| Bush | George | Fifth Avenue | New York | 1975 |
| Carter | Thomas | Changan Street | Beijing | 1980 |
| Gates | Bill | Xuanwumen 10 | Beijing | 1985 |
- 结果:
| **LastName** | **FirstName** | **Address** | **City** | **Year** |
| — | — | — | — | — |
| Carter | Thomas | Changan Street | Beijing | 1980 |
| Gates | Bill | Xuanwumen 10 | Beijing | 1985 |
1. 引号的使用
- 请注意,我们在例子中的条件值周围使用的是单引号。
- SQL 使用单引号来环绕**文本值**(大部分数据库系统也接受双引号)。如果是**数值**,请不要使用引号。
- 文本值:
- 这是正确的:
SELECT * FROM Persons WHERE FirstName=‘Bush’
- 这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
- 数值:
- 这是正确的:
SELECT * FROM Persons WHERE Year>1965
- 这是错误的:
SELECT * FROM Persons WHERE Year>‘1965’
6、and&or条件运算符
1. AND 和 OR 运算符
- AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
- 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
- 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
1. 原始的表 (用在例子中的):
| 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 |
2. AND 运算符实例
- 使用 AND 来显示所有姓为 “Carter” 并且名为 “Thomas” 的人:
- SELECT * FROM Persons WHERE FirstName=‘Thomas’ AND LastName=‘Carter’
- 结果:
| **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — |
| Carter | Thomas | Changan Street | Beijing |
1. OR 运算符实例
- 使用 OR 来显示所有姓为 “Carter” 或者名为 “Thomas” 的人:
- SELECT * FROM Persons WHERE firstname=‘Thomas’ OR lastname=‘Carter’
- 结果:
| **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — |
| Carter | Thomas | Changan Street | Beijing |
| Carter | William | Xuanwumen 10 | Beijing |
1. **结合 AND 和 OR 运算符**
- 我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):
- SELECT * FROM Persons WHERE (FirstName=‘Thomas’ OR FirstName=‘William’) AND LastName=‘Carter’
- 结果:
| **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — |
| Carter | Thomas | Changan Street | Beijing |
| Carter | William | Xuanwumen 10 | Beijing |
7、like操作符
1. LIKE 操作符
- LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
- SQL LIKE 操作符语法
- SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
1. 原始的表 (用在例子中的):
- 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 |
1. LIKE 操作符实例
- 例子 1
- 现在,我们希望从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
- 我们可以使用下面的 SELECT 语句:
- SELECT * FROM Persons
WHERE City LIKE ‘N%’
- 提示:“%” 可用于定义通配符(模式中缺少的字母)。
- 结果集:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 2 | Bush | George | Fifth Avenue | New York |
- 例子 2
- 接下来,我们希望从 “Persons” 表中选取居住在以 “g” 结尾的城市里的人:
- 我们可以使用下面的 SELECT 语句:
- SELECT * FROM Persons
WHERE City LIKE ‘%g’
- 结果集:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 3 | Carter | Thomas | Changan Street | Beijing |
- 例子 3
- 接下来,我们希望从 “Persons” 表中选取居住在包含 “lon” 的城市里的人:
- 我们可以使用下面的 SELECT 语句:
- SELECT * FROM Persons WHERE City LIKE ‘%lon%’
- 结果集:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
- 例子 4
- 通过使用 NOT 关键字,我们可以从 “Persons” 表中选取居住在**不包含** “lon” 的城市里的人:
- 我们可以使用下面的 SELECT 语句:
- SELECT * FROM Persons WHERE City NOT LIKE ‘%lon%’
- 结果集:
| **Id** | **LastName** | **FirstName** | **Address** | **City** |
| — | — | — | — | — |
| 2 | Bush | George | Fifth Avenue | New York |
| 3 | Carter | Thomas | Changan Street | Beijing |
8、通配符
一、简介
1. SQL 通配符
在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一起使用。
1. 在 SQL 中,可使用以下通配符:
| 通配符 | 描述 |
| — | — |
| % | 替代一个或多个字符 |
| _ | 仅替代一个字符 |
| [charlist] | 字符列中的任何单一字符 |
| [^charlist]
或者
[!charlist] | 不在字符列中的任何单一字符 |
二、示例
- 原始的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 |
1. 使用 % 通配符
从上面的 “Persons” 表中选取居住在以 “Ne” 开始的城市里的人:
```
SELECT * FROM Person WHERE City LIKE 'Ne%'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 2 | Bush | George | Fifth Avenue | New York |
1. 从 “Persons” 表中选取居住在包含 “lond” 的城市里的人:
```
SELECT * FROM Persons WHERE City LIKE '%lond%'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
1. 使用 _ 通配符
从上面的 “Persons” 表中选取名字的第一个字符之后是 “eorge” 的人:
```
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 2 | Bush | George | Fifth Avenue | New York |
1. 从 “Persons” 表中选取的这条记录的姓氏以 “C” 开头,然后是一个任意字符,然后是 “r”,然后是任意字符,然后是 “er”
```
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 3 | Carter | Thomas | Changan Street | Beijing |
1. **使用 [charlist] 通配符**
从上面的 “Persons” 表中选取居住的城市以 “A” 或 “L” 或 “N” 开头的人:
```
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
1. 从上面的 “Persons” 表中选取居住的城市**不以** “A” 或 “L” 或 “N” 开头的人:
```
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 3 | Carter | Thomas | Changan Street | Beijing |
9、in操作符
一、简介
1. IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
1. SQL IN 语法
```
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
```
二、示例
- 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 |
1. 从上表中选取姓氏为 Adams 和 Carter 的人:
我们可以使用下面的 SELECT 语句:
```
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
| 3 | Carter | Thomas | Changan Street | Beijing |
10、between范围
一、简介
1. BETWEEN 操作符
操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
1. SQL BETWEEN 语法
```
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
```
二、示例
1. 原始的表
- 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 |
| 4 | Gates | Bill | Xuanwumen 10 | Beijing |
1. **BETWEEN 操作符实例**
- 如需以字母顺序显示介于 “Adams”(包括)和 “Carter”(不包括)之间的人,请使用下面的 SQL:
```
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
- 重要事项:不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。
- 所以,请检查你的数据库是如何处理 BETWEEN…AND 操作符的!
1. 实例 2
- 如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
```
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
```
- 结果集:
| Id | LastName | FirstName | Address | City |
| — | — | — | — | — |
| 3 | Carter | Thomas | Changan Street | Beijing |
| 4 | Gates | Bill | Xuanwumen 10 | Beijing |
11、group by分组
一、简介
1. 合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
2. GROUP BY 语句**
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
1. SQL GROUP BY 语法
```
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
```
二、示例
- 下面这个 “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 |
1. 查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
```
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 |
那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。“SUM(OrderPrice)” 返回一个单独的值(“OrderPrice” 列的总计),而 “Customer” 返回 6 个值(每个值对应 “Orders” 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
1. GROUP BY 一个以上的列
我们也可以对一个以上的列应用 GROUP BY 语句,就像这样:
```
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
```
12、having分组后过滤
一、简介
1. **HAVING 子句**
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
1. SQL 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 |
1. 查找订单总金额少于 2000 的客户。
```
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
```
- 结果集类似:
| Customer | SUM(OrderPrice) |
| — | — |
| Carter | 1700 |
1. 查找客户 “Bush” 或 “Adams” 拥有超过 1500 的订单总金额。
```
SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Customer HAVING SUM(OrderPrice)>1500
```
- 结果集:
| Customer | SUM(OrderPrice) |
| — | — |
| Bush | 2000 |
| Adams | 2000 |
13、order by排序
一、简介
1. **ORDER BY 语句**
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
二、示例
1. 原始的表 (用在例子中的):
- Orders 表:
| Company | OrderNumber |
| — | — |
| IBM | 3532 |
| W3School | 2356 |
| Apple | 4698 |
| W3School | 6953 |
1. 实例 1
以字母顺序显示公司名称:
`SELECT Company, OrderNumber FROM Orders ORDER BY Company`
- 结果:
| Company | OrderNumber |
| — | — |
| Apple | 4698 |
| IBM | 3532 |
| W3School | 6953 |
| W3School | 2356 |
1. 实例 2
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
- 结果:
| Company | OrderNumber |
| — | — |
| Apple | 4698 |
| IBM | 3532 |
| W3School | 2356 |
| W3School | 6953 |
1. 实例 3
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
- 结果:
| Company | OrderNumber |
| — | — |
| W3School | 6953 |
| W3School | 2356 |
| IBM | 3532 |
| Apple | 4698 |
1. 实例 4
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
- 结果:
| Company | OrderNumber |
| — | — |
| W3School | 2356 |
| W3School | 6953 |
| IBM | 3532 |
| Apple | 4698 |
- **注意:**在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。