揭秘SQL基础:数据类型、约束和操作的奥秘
发布时间: 2024-07-24 02:48:42 阅读量: 25 订阅数: 30
![揭秘SQL基础:数据类型、约束和操作的奥秘](https://learnsql.com/blog/unique-constraint-in-sql/1.png)
# 1. SQL基础入门
SQL(结构化查询语言)是一种用于与关系型数据库交互的编程语言。它允许用户创建、查询、修改和管理数据库中的数据。
**1.1 SQL的历史和演变**
SQL最初由IBM于20世纪70年代开发,称为SEQUEL(结构化英语查询语言)。经过多次修订和标准化,它已成为关系型数据库的标准语言。
**1.2 SQL的基本语法**
SQL语句通常包含以下元素:
* **关键字:**预定义的单词,用于指定操作(例如,SELECT、INSERT、UPDATE)。
* **标识符:**用于引用表、列和变量的名称。
* **运算符:**用于执行比较、算术和逻辑操作的符号(例如,=、>、AND)。
* **常量:**不改变的值(例如,数字、字符串)。
# 2. SQL数据类型与约束
### 2.1 数据类型概述
数据类型定义了数据库中存储数据的格式和大小。SQL支持多种数据类型,以满足不同数据存储需求。
#### 2.1.1 数值类型
数值类型用于存储数字值,包括整数、小数和货币值。常用的数值类型有:
- **INTEGER:**存储整数,范围为 -2^31 到 2^31-1。
- **SMALLINT:**存储小整数,范围为 -2^15 到 2^15-1。
- **TINYINT:**存储非常小的整数,范围为 -2^7 到 2^7-1。
- **FLOAT:**存储浮点数,精度为 6-7 位有效数字。
- **DOUBLE:**存储双精度浮点数,精度为 15-16 位有效数字。
#### 2.1.2 字符类型
字符类型用于存储文本数据,包括字母、数字和符号。常用的字符类型有:
- **CHAR(n):**存储固定长度的字符,其中 n 指定字符数。
- **VARCHAR(n):**存储可变长度的字符,其中 n 指定最大字符数。
- **TEXT:**存储大文本数据,长度不受限制。
#### 2.1.3 日期和时间类型
日期和时间类型用于存储日期和时间信息。常用的日期和时间类型有:
- **DATE:**存储日期,格式为 YYYY-MM-DD。
- **TIME:**存储时间,格式为 HH:MM:SS。
- **TIMESTAMP:**存储日期和时间,格式为 YYYY-MM-DD HH:MM:SS。
### 2.2 数据约束
数据约束用于确保数据库中的数据完整性和一致性。SQL支持多种数据约束,包括:
#### 2.2.1 主键约束
主键约束指定表中的一个或多个列作为唯一标识符。主键列的值必须唯一,并且不能为 NULL。
```sql
CREATE TABLE Customers (
customer_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (customer_id)
);
```
#### 2.2.2 外键约束
外键约束指定表中的一个或多个列与另一表中的主键列相关联。外键列的值必须与主表中的主键值匹配。
```sql
CREATE TABLE Orders (
order_id INT NOT NULL,
customer_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES Customers (customer_id)
);
```
#### 2.2.3 唯一性约束
唯一性约束指定表中的一个或多个列必须唯一。与主键约束不同,唯一性约束允许 NULL 值。
```sql
CREATE TABLE Products (
product_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
UNIQUE (name)
);
```
# 3.1 数据插入
#### 3.1.1 INSERT语句
INSERT语句用于将新行插入到表中。其基本语法如下:
```sql
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
```
其中:
* `table_name` 是要插入行的表名。
* `column1`, `column2`, ... 是要插入值的列名。
* `value1`, `value2`, ... 是要插入的值。
**示例:**
```sql
INSERT INTO employees (name, age, salary)
VALUES ('John Doe', 30, 50000);
```
此语句将向名为 `employees` 的表中插入一行,其中 `name` 列的值为 `John Doe`,`age` 列的值为 `30`,`salary` 列的值为 `50000`。
#### 3.1.2 批量插入
当需要向表中插入大量数据时,可以使用批量插入来提高效率。批量插入使用单个语句将多行数据插入到表中。
**示例:**
```sql
INSERT INTO employees (name, age, salary)
VALUES
('John Doe', 30, 50000),
('Jane Smith', 25, 40000),
('Bob Jones', 40, 60000);
```
此语句将向名为 `employees` 的表中插入三行数据。
# 4. SQL数据管理
### 4.1 表管理
#### 4.1.1 创建表
创建表是SQL数据管理中的一项基本操作,用于定义数据库中的数据结构。可以使用`CREATE TABLE`语句来创建表,其语法如下:
```sql
CREATE TABLE table_name (
column_name1 data_type1 [constraints],
column_name2 data_type2 [constraints],
...
);
```
其中:
* `table_name`是要创建的表的名称。
* `column_name`是要创建的列的名称。
* `data_type`是要创建的列的数据类型。
* `constraints`是可选的约束,用于定义列的属性,例如`NOT NULL`、`UNIQUE`或`PRIMARY KEY`。
**示例:**创建名为`employees`的表,其中包含`id`、`name`、`salary`和`department`列:
```sql
CREATE TABLE employees (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
salary DECIMAL(10, 2) NOT NULL,
department VARCHAR(255)
);
```
#### 4.1.2 修改表
修改表是指对现有表的结构进行更改。可以使用`ALTER TABLE`语句来修改表,其语法如下:
```sql
ALTER TABLE table_name
ALTER COLUMN column_name NEW_DATA_TYPE;
```
其中:
* `table_name`是要修改的表的名称。
* `column_name`是要修改的列的名称。
* `NEW_DATA_TYPE`是要更改的新数据类型。
**示例:**将`employees`表中的`salary`列的数据类型从`DECIMAL(10, 2)`更改为`INT`:
```sql
ALTER TABLE employees
ALTER COLUMN salary INT;
```
#### 4.1.3 删除表
删除表是指从数据库中永久删除表及其所有数据。可以使用`DROP TABLE`语句来删除表,其语法如下:
```sql
DROP TABLE table_name;
```
其中:
* `table_name`是要删除的表的名称。
**示例:**删除`employees`表:
```sql
DROP TABLE employees;
```
### 4.2 索引管理
#### 4.2.1 创建索引
索引是一种数据结构,用于加快对表的查询速度。索引通过在表中创建额外的列来实现,这些列存储了表中数据的特定值,例如主键或外键。
可以使用`CREATE INDEX`语句来创建索引,其语法如下:
```sql
CREATE INDEX index_name ON table_name (column_name);
```
其中:
* `index_name`是要创建的索引的名称。
* `table_name`是要创建索引的表的名称。
* `column_name`是要创建索引的列的名称。
**示例:**在`employees`表中创建名为`idx_name`的索引,该索引基于`name`列:
```sql
CREATE INDEX idx_name ON employees (name);
```
#### 4.2.2 删除索引
删除索引是指从数据库中永久删除索引。可以使用`DROP INDEX`语句来删除索引,其语法如下:
```sql
DROP INDEX index_name;
```
其中:
* `index_name`是要删除的索引的名称。
**示例:**删除`idx_name`索引:
```sql
DROP INDEX idx_name;
```
#### 4.2.3 索引优化
索引优化是指调整索引以提高查询性能。可以使用以下技术来优化索引:
* **选择正确的列:**索引应基于经常用于查询的列。
* **创建复合索引:**复合索引基于多个列创建,可以提高多列查询的性能。
* **维护索引:**定期重建或重新组织索引以确保其保持高效。
**示例:**优化`idx_name`索引以提高`name`和`salary`列上的查询性能:
```sql
CREATE INDEX idx_name ON employees (name, salary);
```
# 5.1 存储过程和函数
存储过程和函数是 SQL 中高级特性,它们允许将一组 SQL 语句封装成一个可重用的单元。这提供了以下好处:
* **可重用性:**存储过程和函数可以多次调用,无需重复编写相同的 SQL 语句。
* **模块化:**它们将复杂的 SQL 逻辑封装成独立的单元,使代码更易于维护和管理。
* **性能优化:**存储过程和函数可以预编译,从而提高执行速度。
### 5.1.1 创建存储过程
使用 `CREATE PROCEDURE` 语句创建存储过程。该语句的基本语法如下:
```sql
CREATE PROCEDURE procedure_name (
parameter_list
)
AS
BEGIN
-- 存储过程主体
END
```
**参数说明:**
* `procedure_name`:存储过程的名称。
* `parameter_list`:存储过程的参数列表,包括参数名称和数据类型。
* `BEGIN` 和 `END`:存储过程主体的开始和结束标志。
**示例:**
创建一个名为 `GetCustomerDetails` 的存储过程,该存储过程接受一个客户 ID 作为输入参数,并返回客户详细信息:
```sql
CREATE PROCEDURE GetCustomerDetails (
@customer_id int
)
AS
BEGIN
SELECT * FROM Customers WHERE customer_id = @customer_id;
END
```
### 5.1.2 创建函数
使用 `CREATE FUNCTION` 语句创建函数。该语句的基本语法如下:
```sql
CREATE FUNCTION function_name (
parameter_list
)
RETURNS return_type
AS
BEGIN
-- 函数主体
END
```
**参数说明:**
* `function_name`:函数的名称。
* `parameter_list`:函数的参数列表,包括参数名称和数据类型。
* `return_type`:函数返回的值的数据类型。
* `BEGIN` 和 `END`:函数主体的开始和结束标志。
**示例:**
创建一个名为 `GetCustomerName` 的函数,该函数接受一个客户 ID 作为输入参数,并返回客户姓名:
```sql
CREATE FUNCTION GetCustomerName (
@customer_id int
)
RETURNS nvarchar(50)
AS
BEGIN
SELECT customer_name FROM Customers WHERE customer_id = @customer_id;
END
```
### 5.1.3 使用存储过程和函数
存储过程和函数可以通过以下方式调用:
* **存储过程:**使用 `EXEC` 语句调用存储过程。
* **函数:**使用函数名称和参数列表调用函数。
**示例:**
调用 `GetCustomerDetails` 存储过程:
```sql
EXEC GetCustomerDetails 10;
```
调用 `GetCustomerName` 函数:
```sql
SELECT GetCustomerName(10);
```
存储过程和函数在复杂的 SQL 查询和操作中非常有用,它们可以简化代码,提高性能,并增强代码的可维护性。
# 6.1 数据分析
数据分析是利用SQL从数据中提取有价值信息的强大工具。SQL提供了各种函数和技术,使我们能够对数据进行聚合、分组和排序,以揭示模式、趋势和异常情况。
### 6.1.1 聚合函数
聚合函数对一组行执行计算,并返回一个汇总值。常用的聚合函数包括:
- `COUNT()`:计算行数
- `SUM()`:计算值的总和
- `AVG()`:计算值的平均值
- `MIN()`:返回最小值
- `MAX()`:返回最大值
**示例:**
```sql
SELECT COUNT(*) AS total_sales
FROM sales_data;
```
此查询返回销售数据表中销售总数。
### 6.1.2 分组查询
分组查询将数据按一个或多个列分组,并对每个组执行聚合函数。
**示例:**
```sql
SELECT product_category, SUM(sales) AS total_sales
FROM sales_data
GROUP BY product_category;
```
此查询按产品类别对销售数据进行分组,并计算每个类别的总销售额。
### 6.1.3 窗口函数
窗口函数对一组行执行计算,但与聚合函数不同,它们返回每个行的值。常用的窗口函数包括:
- `ROW_NUMBER()`:返回行的序号
- `RANK()`:返回行的排名
- `DENSE_RANK()`:返回行的排名,不考虑重复值
- `LAG()`:返回前一行指定偏移量的值
- `LEAD()`:返回后一行指定偏移量的值
**示例:**
```sql
SELECT product_name, ROW_NUMBER() OVER (ORDER BY sales DESC) AS sales_rank
FROM sales_data;
```
此查询按销售额降序对产品进行排名,并返回每个产品的销售排名。
0
0