SQL 查询入门:SELECT 语句的基本用法
发布时间: 2024-05-02 01:22:04 阅读量: 78 订阅数: 46
![SQL数据库实战合集](https://img-blog.csdnimg.cn/img_convert/45a53cd6e752f07a4abc2d6b984a751c.png)
# 1. SELECT语句简介**
SELECT语句是SQL中用于查询数据的基本语句。它允许我们从数据库中检索特定的数据行和列。SELECT语句的语法结构如下:
```sql
SELECT <列名>
FROM <数据源>
[WHERE <过滤条件>]
[ORDER BY <排序条件>]
```
其中:
* `<列名>`指定要检索的列。
* `<数据源>`指定要查询的数据表或视图。
* `<过滤条件>`用于过滤查询结果,仅返回满足条件的行。
* `<排序条件>`用于对查询结果进行排序。
# 2. SELECT语句的语法结构
### 2.1 SELECT子句
#### 2.1.1 选择列
SELECT子句用于指定要从数据源中检索的列。语法如下:
```sql
SELECT 列名1, 列名2, ..., 列名n
```
例如,以下查询语句将检索`customers`表中的`customer_id`和`customer_name`列:
```sql
SELECT customer_id, customer_name
FROM customers;
```
#### 2.1.2 使用别名
别名允许我们为列指定一个更简洁或更具描述性的名称。语法如下:
```sql
SELECT 列名 AS 别名
```
例如,以下查询语句将`customer_name`列重命名为`name`:
```sql
SELECT customer_name AS name
FROM customers;
```
### 2.2 FROM子句
#### 2.2.1 指定数据源
FROM子句用于指定要查询的数据源。数据源可以是表、视图或派生表。语法如下:
```sql
FROM 数据源
```
例如,以下查询语句从`customers`表中检索数据:
```sql
SELECT *
FROM customers;
```
#### 2.2.2 使用别名
与SELECT子句类似,FROM子句也可以使用别名来简化数据源名称。语法如下:
```sql
FROM 数据源 AS 别名
```
例如,以下查询语句将`customers`表重命名为`c`:
```sql
SELECT *
FROM customers AS c;
```
### 2.3 WHERE子句
#### 2.3.1 过滤条件
WHERE子句用于过滤数据源中的行,只返回满足指定条件的行。语法如下:
```sql
WHERE 条件
```
条件可以是比较运算符、逻辑运算符或函数调用的组合。例如,以下查询语句只检索`customer_id`为`1`的客户:
```sql
SELECT *
FROM customers
WHERE customer_id = 1;
```
#### 2.3.2 逻辑运算符
逻辑运算符用于组合多个条件,形成更复杂的过滤条件。以下是最常用的逻辑运算符:
| 运算符 | 描述 |
|---|---|
| AND | 两个条件都为真时返回真 |
| OR | 两个条件中有一个为真时返回真 |
| NOT | 条件为假时返回真 |
例如,以下查询语句检索`customer_id`为`1`或`customer_name`为`John`的客户:
```sql
SELECT *
FROM customers
WHERE customer_id = 1 OR customer_name = 'John';
```
### 2.4 ORDER BY子句
#### 2.4.1 排序顺序
ORDER BY子句用于对结果集中的行进行排序。语法如下:
```sql
ORDER BY 列名 [ASC | DESC]
```
默认情况下,ORDER BY子句按升序排序(ASC)。要按降序排序,请使用DESC关键字。例如,以下查询语句按`customer_name`列升序排序:
```sql
SELECT *
FROM customers
ORDER BY customer_name ASC;
```
#### 2.4.2 使用多个排序条件
ORDER BY子句可以指定多个排序条件。语法如下:
```sql
ORDER BY 列名1 [ASC | DESC], 列名2 [ASC | DESC], ..., 列名n [ASC | DESC]
```
例如,以下查询语句按`customer_name`列升序排序,再按`customer_id`列降序排序:
```sql
SELECT *
FROM customers
ORDER BY customer_name ASC, customer_id DESC;
```
# 3.1 查询单个列
SELECT语句最简单的用法是查询单个列。语法如下:
```sql
SELECT column_name
FROM table_name;
```
其中,`column_name`是要查询的列名,`table_name`是要查询的数据表名。
**示例:**查询`employees`表中的`first_name`列:
```sql
SELECT first_name
FROM employees;
```
执行该查询将返回`employees`表中所有员工的`first_name`列的值。
### 3.2 查询多个列
SELECT语句也可以查询多个列。语法如下:
```sql
SELECT column_name1, column_name2, ..., column_nameN
FROM table_name;
```
其中,`column_name1`、`column_name2`、...、`column_nameN`是要查询的列名,用逗号分隔。
**示例:**查询`employees`表中的`first_name`、`last_name`和`email`列:
```sql
SELECT first_name, last_name, email
FROM employees;
```
执行该查询将返回`employees`表中所有员工的`first_name`、`last_name`和`email`列的值。
### 3.3 使用别名简化结果
别名是一种给列或表起一个临时名称的方式。这在查询结果中简化列名或表名时很有用。语法如下:
```sql
SELECT column_name AS alias_name
FROM table_name;
```
其中,`column_name`是要查询的列名,`alias_name`是要使用的别名。
**示例:**查询`employees`表中的`first_name`列,并使用别名`fname`:
```sql
SELECT first_name AS fname
FROM employees;
```
执行该查询将返回`employees`表中所有员工的`first_name`列的值,并使用别名`fname`。
### 3.4 使用WHERE子句过滤结果
WHERE子句用于过滤查询结果,只返回满足指定条件的行。语法如下:
```sql
SELECT column_name
FROM table_name
WHERE condition;
```
其中,`condition`是要满足的条件。条件可以是比较运算符(如`=`, `>`, `<`)、逻辑运算符(如`AND`, `OR`, `NOT`)和函数的组合。
**示例:**查询`employees`表中工资大于10000美元的员工的`first_name`列:
```sql
SELECT first_name
FROM employees
WHERE salary > 10000;
```
执行该查询将返回`employees`表中所有工资大于10000美元的员工的`first_name`列的值。
### 3.5 使用ORDER BY子句排序结果
ORDER BY子句用于对查询结果进行排序。语法如下:
```sql
SELECT column_name
FROM table_name
ORDER BY column_name [ASC | DESC];
```
其中,`column_name`是要排序的列名,`ASC`表示升序排序,`DESC`表示降序排序。
**示例:**查询`employees`表中所有员工的`first_name`列,并按升序排序:
```sql
SELECT first_name
FROM employees
ORDER BY first_name ASC;
```
执行该查询将返回`employees`表中所有员工的`first_name`列的值,并按升序排列。
# 4. SELECT语句的进阶用法
### 4.1 使用聚合函数
聚合函数用于对数据进行汇总计算,例如求和、求平均值或计数。SELECT语句支持多种聚合函数,常见的有:
- **COUNT():**计算指定列中非空值的个数。
- **SUM():**计算指定列中所有值的总和。
- **AVG():**计算指定列中所有值的平均值。
**代码块:**
```sql
SELECT COUNT(id) FROM users; -- 计算用户表中 id 列的非空值个数
SELECT SUM(age) FROM users; -- 计算用户表中 age 列的所有值的总和
SELECT AVG(salary) FROM users; -- 计算用户表中 salary 列的所有值的平均值
```
**逻辑分析:**
* 第一行代码使用 COUNT() 函数计算 users 表中 id 列的非空值个数。
* 第二行代码使用 SUM() 函数计算 users 表中 age 列的所有值的总和。
* 第三行代码使用 AVG() 函数计算 users 表中 salary 列的所有值的平均值。
### 4.2 使用 GROUP BY 子句分组数据
GROUP BY 子句用于将数据按指定列进行分组,然后对每个组应用聚合函数。这可以帮助我们汇总和分析不同组中的数据。
**代码块:**
```sql
SELECT department, COUNT(id) AS num_employees
FROM users
GROUP BY department;
```
**逻辑分析:**
* 该代码将 users 表中的数据按 department 列分组。
* 然后,它使用 COUNT() 函数计算每个部门中 id 列的非空值个数。
* 结果是一个表,其中每一行代表一个部门,并显示该部门的员工人数。
### 4.3 使用 HAVING 子句过滤分组结果
HAVING 子句用于对分组后的数据进行进一步过滤。它类似于 WHERE 子句,但应用于分组后的数据。
**代码块:**
```sql
SELECT department, COUNT(id) AS num_employees
FROM users
GROUP BY department
HAVING COUNT(id) > 10;
```
**逻辑分析:**
* 该代码与上一示例类似,但增加了 HAVING 子句。
* HAVING 子句过滤掉员工人数少于 10 的部门。
* 结果是一个表,其中只显示员工人数超过 10 的部门。
### 4.4 使用子查询
子查询是嵌套在主查询中的一个内部查询。它允许我们在主查询中使用内部查询的结果。
**代码块:**
```sql
SELECT *
FROM users
WHERE id IN (
SELECT id
FROM orders
WHERE product_id = 10
);
```
**逻辑分析:**
* 该代码使用子查询来查找购买了产品 ID 为 10 的所有用户。
* 子查询的结果(一个 id 列表)作为主查询的 WHERE 子句中的条件。
* 主查询返回所有满足该条件的用户。
# 5. SELECT语句的优化技巧
**5.1 优化数据源选择**
在执行SELECT查询时,优化数据源选择至关重要。选择正确的表和连接可以显著提高查询性能。
* **使用正确的表:**仅选择包含所需数据的表。避免使用包含无关数据的表,因为这会增加查询时间。
* **优化连接:**如果查询需要连接多个表,请使用适当的连接类型(例如,INNER JOIN、LEFT JOIN)。选择正确的连接类型可以减少返回的数据量,从而提高性能。
**5.2 优化WHERE子句**
WHERE子句用于过滤查询结果。优化WHERE子句可以显著提高查询速度。
* **使用索引:**在WHERE子句中使用索引列可以快速查找数据。索引是数据库中对特定列创建的特殊数据结构,可以加快数据检索速度。
* **使用范围条件:**如果WHERE子句包含范围条件(例如,BETWEEN、>=、<=),请使用索引覆盖扫描。索引覆盖扫描可以一次从索引中检索所有所需数据,而无需访问基础表。
* **避免使用NOT IN和NOT EXISTS:**NOT IN和NOT EXISTS子句效率较低,因为它们需要扫描整个表。如果可能,请使用等效的子查询或LEFT JOIN。
**5.3 优化ORDER BY子句**
ORDER BY子句用于对查询结果进行排序。优化ORDER BY子句可以减少排序时间。
* **使用索引:**如果ORDER BY子句中使用的列已建立索引,则数据库可以使用索引排序,从而提高性能。
* **限制排序结果:**仅对所需数量的结果进行排序。使用LIMIT子句限制返回的行数,以避免对不必要的行进行排序。
* **避免使用ORDER BY *:**ORDER BY *会对所有列进行排序,这是不必要的,并且会降低性能。仅对所需的列进行排序。
**5.4 使用索引**
索引是数据库中对特定列创建的特殊数据结构,可以加快数据检索速度。使用索引可以显著提高SELECT查询的性能。
* **创建索引:**为经常用于WHERE子句和ORDER BY子句的列创建索引。
* **维护索引:**随着时间的推移,数据会发生变化,因此定期维护索引以保持其有效性非常重要。
* **使用覆盖索引:**覆盖索引包含查询所需的所有数据,从而无需访问基础表。覆盖索引可以极大地提高查询性能。
0
0