【SQL基础语法入门】:从零基础到SQL语言大师
发布时间: 2024-07-24 06:45:51 阅读量: 31 订阅数: 33
![【SQL基础语法入门】:从零基础到SQL语言大师](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL3N6X21tYml6X3BuZy9Bb2xrWGZpYzlsZElaZHZDUmJzanlaMFJkNEQxaWFOU2lhVWI3eTZYY2Y3QmhvYTdoR0Vjbm5ZWW1OS0VIZlhITTFLMllDMHNHUGNKOUhINFAxMklLUTFRUS82NDA?x-oss-process=image/format,png)
# 1. SQL基础概念**
SQL(Structured Query Language,结构化查询语言)是一种用于与关系型数据库进行交互的编程语言。它允许用户创建、查询、更新和删除数据库中的数据。
SQL由一系列命令组成,这些命令可以分组为以下类别:
- 数据操作语言(DML):用于操作数据库中的数据,例如插入、更新和删除记录。
- 数据定义语言(DDL):用于定义和修改数据库结构,例如创建和删除表。
- 数据查询语言(DQL):用于从数据库中检索数据,例如使用SELECT语句。
# 2. SQL数据操作语言(DML)
### 2.1 SELECT语句:数据查询
#### 2.1.1 基本语法
```sql
SELECT column_name1, column_name2, ...
FROM table_name
WHERE condition;
```
**参数说明:**
* `column_name1`, `column_name2`, ...:要查询的列名,可以用 `*` 表示查询所有列。
* `table_name`:要查询的表名。
* `condition`:查询条件,用于筛选符合条件的行。
**逻辑分析:**
`SELECT` 语句用于从表中查询数据。它指定要查询的列和表,并使用 `WHERE` 子句对结果进行筛选。
#### 2.1.2 筛选条件
`WHERE` 子句用于指定查询条件,它支持各种比较运算符和逻辑运算符。
**比较运算符:**
* `=`:等于
* `!=`:不等于
* `>`:大于
* `<`:小于
* `>=`:大于等于
* `<=`:小于等于
**逻辑运算符:**
* `AND`:逻辑与,两个条件都满足才返回真。
* `OR`:逻辑或,两个条件中满足一个就返回真。
* `NOT`:逻辑非,对条件取反。
**示例:**
```sql
SELECT *
FROM customers
WHERE age > 30 AND gender = 'male';
```
**逻辑分析:**
该查询返回年龄大于 30 岁且性别为男性的所有客户信息。
#### 2.1.3 排序和分组
`SELECT` 语句还支持对结果进行排序和分组。
**排序:**
```sql
SELECT column_name
FROM table_name
ORDER BY column_name ASC/DESC;
```
**参数说明:**
* `column_name`:要排序的列名。
* `ASC`:升序排列(从小到大)。
* `DESC`:降序排列(从大到小)。
**分组:**
```sql
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;
```
**参数说明:**
* `column_name`:要分组的列名。
* `aggregate_function`:聚合函数,用于对分组后的数据进行汇总,如 `SUM()`, `COUNT()`, `AVG()`.
**示例:**
```sql
SELECT gender, COUNT(*) AS num_customers
FROM customers
GROUP BY gender;
```
**逻辑分析:**
该查询按性别对客户进行分组,并统计每组客户的数量。
# 3. 创建表
#### 3.1.1 基本语法
```sql
CREATE TABLE table_name (
column_name data_type [constraints],
...
);
```
**参数说明:**
* `table_name`: 要创建的表名。
* `column_name`: 列名。
* `data_type`: 列的数据类型。
* `constraints`: 列的约束条件,如 `NOT NULL`、`UNIQUE`、`PRIMARY KEY` 等。
**示例:**
```sql
CREATE TABLE employees (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
salary DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id)
);
```
#### 3.1.2 数据类型和约束
**数据类型:**
| 数据类型 | 描述 |
|---|---|
| INT | 整数 |
| VARCHAR(n) | 可变长度字符串,最大长度为 n |
| DECIMAL(p, s) | 定点数,精度为 p,小数位数为 s |
| DATE | 日期 |
| TIME | 时间 |
| DATETIME | 日期和时间 |
**约束条件:**
| 约束条件 | 描述 |
|---|---|
| NOT NULL | 列不能为 NULL |
| UNIQUE | 列中的值必须唯一 |
| PRIMARY KEY | 列是表的唯一标识符 |
| FOREIGN KEY | 列引用另一个表中的主键 |
**示例:**
```sql
CREATE TABLE orders (
id INT NOT NULL AUTO_INCREMENT,
customer_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES customers(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
在这个示例中,`orders` 表具有以下约束:
* `id` 列是主键,不能为 NULL,并且自动递增。
* `customer_id` 列引用 `customers` 表中的 `id` 列,表示订单所属的客户。
* `product_id` 列引用 `products` 表中的 `id` 列,表示订单中的产品。
# 4. SQL数据查询语言(DQL)
**4.1 JOIN操作:关联表**
**4.1.1 基本语法**
JOIN操作用于将两个或多个表中的数据基于公共列或表达式进行关联,从而扩展查询结果。基本语法如下:
```sql
SELECT 列名1, 列名2, ...
FROM 表名1
JOIN 表名2 ON 表名1.公共列 = 表名2.公共列
```
**4.1.2 不同类型的JOIN**
SQL支持多种类型的JOIN,包括:
* **INNER JOIN:**仅返回公共列匹配的行。
* **LEFT JOIN:**返回表名1中的所有行,即使表名2中没有匹配的行。
* **RIGHT JOIN:**返回表名2中的所有行,即使表名1中没有匹配的行。
* **FULL JOIN:**返回表名1和表名2中的所有行,无论是否存在匹配。
**4.2 子查询:嵌套查询**
**4.2.1 基本语法**
子查询是嵌套在另一个查询中的查询,它可以返回一个值或一组行,用于作为外部查询中的条件或表达式。基本语法如下:
```sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件 IN (SELECT 列名 FROM 子查询)
```
**4.2.2 相关子查询和非相关子查询**
子查询可以分为相关子查询和非相关子查询:
* **相关子查询:**内部查询引用外部查询中的列或变量,因此外部查询的结果会影响内部查询的结果。
* **非相关子查询:**内部查询不引用外部查询中的任何列或变量,因此外部查询的结果不会影响内部查询的结果。
**4.3 聚合函数:数据汇总**
**4.3.1 基本语法**
聚合函数用于对一组行执行计算并返回单个值,从而汇总数据。基本语法如下:
```sql
SELECT 聚合函数(列名) AS 别名
FROM 表名
GROUP BY 分组列
```
**4.3.2 常用聚合函数**
常用的聚合函数包括:
* **SUM:**求和
* **COUNT:**计数
* **AVG:**平均值
* **MIN:**最小值
* **MAX:**最大值
**示例:**
以下示例使用JOIN操作关联两个表,并使用聚合函数计算每个部门的员工总数:
```sql
SELECT d.部门名称, COUNT(e.员工编号) AS 员工总数
FROM 部门 d
JOIN 员工 e ON d.部门编号 = e.部门编号
GROUP BY d.部门名称
```
**代码逻辑解读:**
* `JOIN`操作将`部门`表和`员工`表基于`部门编号`列关联。
* `COUNT(e.员工编号)`聚合函数计算每个部门的员工总数。
* `GROUP BY d.部门名称`将结果按部门名称分组。
# 5. SQL高级特性**
**5.1 存储过程:可重用代码**
存储过程是一种预编译的SQL语句块,可以存储在数据库中并被多次调用。它允许用户封装复杂的SQL操作,从而提高代码的可重用性和可维护性。
**5.1.1 基本语法**
```sql
CREATE PROCEDURE procedure_name (
-- 参数列表
)
AS
BEGIN
-- SQL 语句
END;
```
**5.1.2 参数传递**
存储过程可以接受参数,这使得它们可以根据不同的输入值执行不同的操作。参数可以在存储过程创建时定义,如下所示:
```sql
CREATE PROCEDURE add_product (
IN product_id INT,
IN product_name VARCHAR(50),
IN product_price DECIMAL(10, 2)
)
AS
BEGIN
-- SQL 语句
END;
```
在调用存储过程时,需要提供实际的参数值,如下所示:
```sql
CALL add_product(10, 'Product X', 100.00);
```
**5.2 触发器:自动执行操作**
触发器是一种数据库对象,当满足特定条件时,它会自动执行一组SQL语句。触发器通常用于在对表进行插入、更新或删除操作时执行特定的操作。
**5.2.1 基本语法**
```sql
CREATE TRIGGER trigger_name
ON table_name
FOR INSERT | UPDATE | DELETE
AS
BEGIN
-- SQL 语句
END;
```
**5.2.2 触发器类型**
触发器可以是以下类型之一:
* **BEFORE触发器:**在操作执行之前执行。
* **AFTER触发器:**在操作执行之后执行。
* **INSTEAD OF触发器:**替换操作的默认行为。
**5.3 视图:虚拟表**
视图是一种虚拟表,它从一个或多个表中派生数据。视图不存储实际数据,而是根据查询定义动态生成数据。这使得视图非常适合创建摘要表、汇总数据或提供对数据的不同视角。
**5.3.1 基本语法**
```sql
CREATE VIEW view_name AS
SELECT
-- 选择列
FROM
-- 表或视图
WHERE
-- 筛选条件
```
**5.3.2 视图的创建和使用**
视图可以在需要时创建,并且可以像普通表一样使用。例如,以下查询使用视图来查找所有价格大于 100 美元的商品:
```sql
SELECT
*
FROM
product_view
WHERE
product_price > 100;
```
0
0