SQL基础
SQL 学习笔记
SQL(Structured Query Language: 结构化查询语言)是用于管理关系数据库管理系统(RDBMS)的标准语言。它的功能包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
1. SQL 简介
SQL 是用于访问和处理数据库的标准编程语言。主要用于以下几种操作:
查询数据库中的数据
SELECT:用于从数据库中提取数据。你可以选择单个或多个列,并使用各种条件来过滤结果。
1
SELECT name, age FROM students WHERE age > 20;
这个查询将从
students
表中选取所有age
大于 20 的学生的name
和age
列。
插入新的数据记录
INSERT INTO:用于将新记录插入到数据库表中。你可以指定插入的列和值。
1
INSERT INTO students (name, age, grade) VALUES ('John Doe', 21, 'A');
这条语句将在
students
表中插入一个新记录,name
为 'John Doe',age
为 21,grade
为 'A'。
更新现有数据
UPDATE:用于修改表中的现有记录。可以指定要更新的列和值,以及需要更新的记录条件。
1
UPDATE students SET grade = 'B' WHERE name = 'John Doe';
这条语句将把
students
表中name
为 'John Doe' 的记录的grade
更新为 'B'。
删除数据记录
DELETE:用于删除表中的记录。可以指定要删除的记录条件。
1
DELETE FROM students WHERE age < 18;
这条语句将删除
students
表中所有age
小于 18 的记录。
创建新表和其他数据库对象
CREATE TABLE:用于创建新表。你可以指定表的名称和列的定义。
1
2
3
4
5
6CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
grade CHAR(1)
);这条语句将创建一个名为
students
的表,包含id
、name
、age
和grade
列。CREATE VIEW:用于创建视图。视图是基于 SQL 查询结果的虚拟表。
1
2CREATE VIEW high_achievers AS
SELECT name, age FROM students WHERE grade = 'A';这条语句将创建一个名为
high_achievers
的视图,包含students
表中所有grade
为 'A' 的name
和age
。CREATE INDEX:用于创建索引,以加快数据库表的搜索速度。
1
CREATE INDEX idx_name ON students (name);
这条语句将在
students
表的name
列上创建一个名为idx_name
的索引。
控制对数据库的访问
GRANT:用于授予用户对数据库对象的权限。
1
GRANT SELECT, INSERT ON students TO 'username';
这条语句将授予用户 'username' 对
students
表的SELECT
和INSERT
权限。REVOKE:用于撤销用户对数据库对象的权限。
1
REVOKE SELECT, INSERT ON students FROM 'username';
这条语句将撤销用户 'username' 对
students
表的SELECT
和INSERT
权限。
数据库模式创建和修改
CREATE DATABASE:用于创建新数据库。
1
CREATE DATABASE school;
这条语句将创建一个名为
school
的数据库。ALTER TABLE:用于修改现有表的结构,例如添加、删除或修改列。
1
ALTER TABLE students ADD COLUMN email VARCHAR(100);
这条语句将向
students
表中添加一个名为email
的新列。DROP TABLE:用于删除表。
1
DROP TABLE students;
这条语句将删除
students
表。DROP DATABASE:用于删除数据库。
1
DROP DATABASE school;
这条语句将删除
school
数据库。
在网站中使用 SQL
要创建一个显示数据库中数据的网站,需要:
- RDBMS 数据库程序(比如 MS Access、SQL Server、MySQL)
- 使用服务器端脚本语言,比如 PHP 或 ASP
- 使用 SQL 来获取您想要的数据
- 使用 HTML / CSS
2. SQL 语法
SQL 语法不区分大小写,但为了提高可读性,通常关键字使用大写,表名、列名使用小写。SQL 语句通常由以下几部分组成:
- 关键词:如
SELECT
、INSERT
、UPDATE
、DELETE
等,这些关键词指定了 SQL 语句的操作类型。 - 表名:操作涉及的表的名称。
- 列名:涉及的列的名称。
- 条件:用于过滤记录的条件。
基本语法格式
1 | SELECT column1, column2, ... |
示例解释
1 | SELECT name, age |
- SELECT:关键词,用于从表中选择数据。
- name, age:列名,表示我们要选择
students
表中的name
和age
列。 - FROM:关键词,指明数据来源的表。
- students:表名,表示我们要从
students
表中选择数据。 - WHERE:关键词,表示过滤条件。
- age > 20:条件,表示我们只选择
age
大于 20 的记录。
其他常用语法
SELECT 语句
选择所有列:
1
SELECT * FROM students;
这条语句将选择
students
表中的所有列。使用别名:
1
2SELECT name AS student_name, age AS student_age
FROM students;这条语句将
name
列重命名为student_name
,age
列重命名为student_age
。
INSERT INTO 语句
插入数据:
1
2INSERT INTO students (name, age, grade)
VALUES ('Jane Doe', 22, 'A');这条语句将在
students
表中插入一条新记录,name
为 'Jane Doe',age
为 22,grade
为 'A'。
UPDATE 语句
更新数据:
1
2
3UPDATE students
SET grade = 'B'
WHERE name = 'Jane Doe';这条语句将把
students
表中name
为 'Jane Doe' 的记录的grade
更新为 'B'。
DELETE 语句
删除数据:
1
2DELETE FROM students
WHERE age < 18;这条语句将删除
students
表中所有age
小于 18 的记录。
ORDER BY 语句
排序数据:
1
2
3SELECT name, age
FROM students
ORDER BY age DESC;这条语句将根据
age
列对students
表中的数据进行降序排序。
示例数据库
假设我们有一个名为 students
的表,结构如下:
1 | CREATE TABLE students ( |
插入一些数据:
1 | INSERT INTO students (id, name, age, grade) VALUES (1, 'Alice', 22, 'A'); |
3. SQL SELECT
SELECT
语句用于从数据库中查询数据,是 SQL
中最常用的语句之一。SELECT
语句允许你从一个或多个表中选择列,并可以使用各种条件和功能对结果进行过滤和处理。
基本语法
1 | SELECT column1, column2, ... |
示例
假设我们有一个名为 `
students` 的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
4 | David | 21 | A |
我们可以使用 SELECT
语句来查询这个表中的数据。
1 | SELECT name, age |
这个查询将返回 students
表中的 name
和
age
列的数据。
选择所有列
你可以使用 *
来选择表中的所有列。
1 | SELECT * |
这个查询将返回 students
表中的所有列和数据。
使用别名
你可以使用 AS
关键字为列起别名,以便使结果更具可读性。
1 | SELECT name AS student_name, age AS student_age |
这个查询将返回 students
表中的 name
和
age
列,但列名将被重命名为 student_name
和
student_age
。
过滤数据
你可以使用 WHERE
子句来过滤返回的数据。
1 | SELECT name, age |
这个查询将返回 students
表中所有 age
大于
20 的学生的 name
和 age
列。
排序数据
你可以使用 ORDER BY
子句来对结果进行排序。
1 | SELECT name, age |
这个查询将根据 age
列对 students
表中的数据进行降序排序。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,需要在网页上显示学生的信息。你可以使用以下步骤来实现:
创建数据库和表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15CREATE DATABASE school;
USE school;
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
grade CHAR(1)
);
INSERT INTO students (name, age, grade) VALUES
('Alice', 22, 'A'),
('Bob', 20, 'B'),
('Charlie', 23, 'C'),
('David', 21, 'A');这段 SQL 代码的作用是创建一个名为
school
的数据库,并在其中创建一个名为students
的表,然后向该表中插入一些示例数据。创建数据库
1
CREATE DATABASE school;
- CREATE DATABASE:这个命令用于创建一个新的数据库。
- school:这是新数据库的名称。
这条语句会在数据库服务器上创建一个名为
school
的新数据库。使用数据库
1
USE school;
- USE:这个命令用于选择要操作的数据库。
- school:这是要选择的数据库的名称。
这条语句告诉数据库服务器,接下来的所有操作都将针对
school
数据库进行。创建表
1
2
3
4
5
6CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
grade CHAR(1)
);- CREATE TABLE:这个命令用于创建一个新的表。
- students:这是新表的名称。
- id INT PRIMARY KEY AUTO_INCREMENT:定义了一个名为
id
的列,数据类型为整数(INT),是该表的主键(PRIMARY KEY),并且是自增的(AUTO_INCREMENT)。自增意味着每插入一条新记录,id
会自动增加。 - name VARCHAR(50):定义了一个名为
name
的列,数据类型为变长字符串(VARCHAR),最大长度为 50 个字符。 - age INT:定义了一个名为
age
的列,数据类型为整数(INT)。 - grade CHAR(1):定义了一个名为
grade
的列,数据类型为固定长度的字符串(CHAR),长度为 1 个字符。
这条语句会在
school
数据库中创建一个名为students
的表,表中包含id
、name
、age
和grade
四列。插入数据
1
2
3
4
5INSERT INTO students (name, age, grade) VALUES
('Alice', 22, 'A'),
('Bob', 20, 'B'),
('Charlie', 23, 'C'),
('David', 21, 'A');- INSERT INTO:这个命令用于向表中插入新记录。
- students (name, age,
grade):指定要插入数据的表和列。这表示我们要向
students
表的name
、age
和grade
列插入数据。 - VALUES:指定要插入的值。
- ('Alice', 22, 'A')、('Bob', 20,
'B')、('Charlie', 23, 'C')、('David',
21, 'A'):这些是插入到表中的四条记录,分别表示学生的
name
、age
和grade
。
这条语句会向
students
表中插入四条记录:- 姓名为 Alice,年龄为 22,成绩为 A。
- 姓名为 Bob,年龄为 20,成绩为 B。
- 姓名为 Charlie,年龄为 23,成绩为 C。
- 姓名为 David,年龄为 21,成绩为 A。
通过这些步骤,您创建了一个名为
school
的数据库,在其中创建了一个名为students
的表,并向该表中插入了一些学生数据。这是管理和操作数据库的基本步骤。、使用 PHP 和 MySQL 查询数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "school";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = "SELECT name, age, grade FROM students";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "姓名: " . $row["name"]. " - 年龄: " . $row["age"]. " - 成绩: " . $row["grade"]. "<br>";
}
} else {
echo "0 结果";
}
$conn->close();这段 PHP 代码是用来连接到 MySQL 数据库,并从名为
school
的数据库中的students
表中查询学生的姓名、年龄和成绩信息,并将结果输出到网页上。连接到数据库
1
2
3
4
5
6
7$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "school";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);- $servername:MySQL 服务器的主机名,通常为 "localhost"。
- $username:连接 MySQL 数据库的用户名。
- $password:连接 MySQL 数据库的密码。
- $dbname:要连接的数据库的名称。
这段代码使用
mysqli
类创建了一个新的 MySQL 连接对象$conn
,并尝试连接到指定的 MySQL 服务器和数据库。检测连接是否成功
1
2
3if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}这段代码检查连接是否成功。如果连接失败,
$conn->connect_error
将包含连接错误的描述信息,并通过die()
函数输出错误信息并终止脚本执行。执行 SQL 查询
1
2$sql = "SELECT name, age, grade FROM students";
$result = $conn->query($sql);这段代码执行了一个 SQL 查询,从
students
表中选择了name
、age
和grade
列,并将查询结果存储在$result
变量中。处理查询结果
1
2
3
4
5
6
7
8if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "姓名: " . $row["name"]. " - 年龄: " . $row["age"]. " - 成绩: " . $row["grade"]. "<br>";
}
} else {
echo "0 结果";
}这段代码检查查询结果中是否有数据。如果有数据,则通过
while
循环遍历每一行数据,将每一行的name
、age
和grade
值输出到网页上。如果查询结果为空,则输出 "0 结果"。关闭数据库连接
1
$conn->close();
最后,这段代码关闭了与 MySQL 数据库的连接,以释放资源并结束数据库会话。
通过这段 PHP 代码,你可以从 MySQL 数据库中获取数据,并将其动态地显示在网页上,实现了数据库和网页的交互。
HTML 页面显示数据:
1
2
3
4
5
6
7
8
9
10
<html>
<head>
<title>学生信息</title>
</head>
<body>
<h1>学生信息</h1>
</body>
</html>
在这个示例中,我们创建了一个名为 students
的表,并插入了一些示例数据。然后,使用 PHP
代码从数据库中查询这些数据,并将结果显示在网页上。通过这种方式,你可以使用
SELECT
语句从数据库中查询数据并在网站中展示。
4. SQL SELECT DISTINCT
SELECT DISTINCT
语句用于从数据库表中选择唯一不同的值,并将这些值作为结果返回。这在需要从表中获取不重复的值时非常有用,例如,获取某一列中所有不同的年龄、城市等。
基本语法
1 | SELECT DISTINCT column1, column2, ... |
- SELECT DISTINCT:这是 SQL 查询的一部分,表示要选择唯一不同的值。
- column1, column2, ...:这些是要选择的列名,可以是一个或多个列名,表示要从中选择唯一值的列。
- FROM table_name:这指定了要从中选择数据的表的名称。
示例
假设我们有一个名为 students
的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
4 | David | 21 | A |
5 | Alice | 22 | A |
我们可以使用 SELECT DISTINCT
来获取 age
列中的唯一不同的年龄值:
1 | SELECT DISTINCT age |
这个查询将返回 students
表中所有不同的年龄值:
1 | age |
这里不会重复返回相同的年龄值。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,需要在网页上显示所有学生的年龄范围。你可以使用
SELECT DISTINCT
来获取所有不同的年龄值,并将其显示在网页上。
下面是一个简单的 PHP 示例,用于从数据库中获取唯一不同的年龄值,并将其显示在网页上:
1 |
|
通过以上代码,你可以从 students
表中获取唯一不同的年龄值,并将其动态地显示在网页上。
5. SQL WHERE
WHERE
子句用于在 SQL
查询中指定条件,以过滤所返回的记录。通过 WHERE
子句,你可以定义一个或多个条件,只有满足条件的记录才会被检索出来。
基本语法
1 | SELECT column1, column2, ... |
- SELECT:指定要检索的列。
- FROM:指定要检索数据的表。
- WHERE:用于指定筛选条件。
示例
假设我们有一个名为 students
的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
4 | David | 21 | A |
我们可以使用 WHERE
子句来过滤 students
表中的记录,例如,只选择年龄大于 20 岁的学生:
1 | SELECT name, age |
这个查询将返回满足条件 age > 20
的学生的姓名和年龄:
1 | | name | age | |
多个条件
你可以使用逻辑运算符(例如
AND
、OR
、NOT
)结合多个条件来进一步筛选数据。
例如,选择年龄大于 20 岁且成绩为 'A' 的学生:
1 | SELECT name, age |
模糊查询
你也可以使用通配符进行模糊查询,例如,选择名字以 'A' 开头的学生:
1 | SELECT name, age |
这个查询将返回所有名字以 'A' 开头的学生的姓名和年龄。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上显示所有成绩为
'A' 的学生的信息。你可以使用 WHERE
子句来实现这个功能。
下面是一个简单的 PHP 示例,用于从数据库中获取成绩为 'A' 的学生信息,并将其动态地显示在网页上:
1 |
|
通过以上代码,你可以从 students
表中获取成绩为 'A'
的学生信息,并将其动态地显示在网页上。
6. SQL AND & OR
AND
和 OR
是 SQL
中用于组合多个条件的逻辑运算符。它们可以使查询更加灵活,以便根据多个条件过滤数据。
AND 运算符
AND
运算符用于同时满足多个条件时使用。只有当所有条件都为真时,才会返回相应的记录。
1 | SELECT column1, column2, ... |
例如,选择年龄大于 20 岁且成绩为 'A' 的学生:
1 | SELECT name, age |
OR 运算符
OR
运算符用于满足其中一个条件时使用。只要满足其中一个条件,就会返回相应的记录。
1 | SELECT column1, column2, ... |
例如,选择年龄大于 20 岁或成绩为 'A' 的学生:
1 | SELECT name, age |
复杂条件组合
你还可以组合多个 AND
和 OR
条件来创建更复杂的查询条件。
例如,选择年龄大于 20 岁且成绩为 'A' 或年龄大于等于 25 岁的学生:
1 | SELECT name, age |
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上显示年龄大于 20
岁且成绩为 'A' 的学生的信息,或者显示年龄大于等于 25
岁的学生的信息。你可以使用 AND
和 OR
运算符来实现这个功能。
下面是一个简单的 PHP 示例,用于从数据库中获取满足上述条件的学生信息,并将其动态地显示在网页上:
1 |
|
通过以上代码,你可以从 students
表中获取满足条件的学生信息,并将其动态地显示在网页上。
7. SQL ORDER BY
ORDER BY
语句用于对查询结果进行排序,可以按照一个或多个列的值进行升序(默认)或降序排序。它常用于以有序的方式显示数据。
基本语法
1 | SELECT column1, column2, ... |
- SELECT:指定要查询的列。
- FROM:指定要查询数据的表。
- ORDER BY:用于指定排序的列。
- column1:要排序的列名。
- ASC|DESC:可选项,表示升序(默认)或降序排序。
示例
假设我们有一个名为 students
的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
4 | David | 21 | A |
我们可以使用 ORDER BY
对 students
表中的数据进行排序,例如,按照年龄的降序排序:
1 | SELECT name, age |
这个查询将返回按照年龄降序排列的学生的姓名和年龄:
1 | | name | age | |
多列排序
你也可以对多个列进行排序,首先按照第一个列排序,然后按照第二个列排序,以此类推。
例如,按照年龄降序排序,如果年龄相同,则按照姓名的升序排序:
1 | SELECT name, age |
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上按照年龄的降序显示所有学生的信息。你可以使用
ORDER BY
语句来实现这个功能。
下面是一个简单的 PHP 示例,用于从数据库中获取所有学生信息,并按照年龄的降序将其动态地显示在网页上:
1 |
|
通过以上代码,你可以从 students
表中获取所有学生信息,并按照年龄的降序将其动态地显示在网页上。
8. SQL INSERT INTO
INSERT INTO
语句用于向数据库表中插入新的记录。通过这个语句,你可以指定要插入的列以及相应的值。
基本语法
1 | INSERT INTO table_name (column1, column2, ...) |
- INSERT INTO:指定要插入数据的表。
- table_name:要插入数据的表的名称。
- (column1, column2, ...):指定要插入数据的列名。
- VALUES:指定要插入的值。
- (value1, value2, ...):指定要插入的值,与列的顺序对应。
示例
假设我们有一个名为 students
的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
现在,假设我们要向 students
表中插入一条新的记录,表示一个新学生的信息。我们可以使用
INSERT INTO
语句来完成这个操作:
1 | INSERT INTO students (name, age, grade) |
这个语句将在 students
表中插入一条新的记录,该记录包含姓名为 'John Doe',年龄为 21,成绩为 'A'
的学生信息。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上添加一个表单,用户可以通过该表单输入新学生的信息。当用户提交表单时,你可以使用 PHP 将用户输入的信息插入到数据库中。
下面是一个简单的 PHP 示例,用于从表单获取新学生的信息,并将其插入到
students
表中:
1 |
|
通过以上代码,你可以在网站中创建一个表单,让用户输入新学生的信息,并将该信息插入到
students
表中。
9. SQL UPDATE
UPDATE
语句用于修改数据库表中现有记录的值。通过
UPDATE
语句,你可以更新表中指定列的值,并可以基于某些条件选择要更新的记录。
基本语法
1 | UPDATE table_name |
- UPDATE:指定要更新的表。
- table_name:要更新的表的名称。
- SET:指定要更新的列和对应的新值。
- column1 = value1, column2 = value2, ...:指定要更新的列以及它们的新值。
- WHERE:可选项,用于指定要更新的记录的条件。
- condition:可选项,指定要更新的记录必须满足的条件。
示例
假设我们有一个名为 students
的表,包含以下数据:
id | name | age | grade |
---|---|---|---|
1 | Alice | 22 | A |
2 | Bob | 20 | B |
3 | Charlie | 23 | C |
4 | David | 21 | A |
现在,假设我们想将名为 'Bob' 的学生的成绩修改为 'B'。我们可以使用
UPDATE
语句来完成这个操作:
1 | UPDATE students |
这个语句将在 students
表中找到名为 'Bob'
的学生,并将其成绩更新为 'B'。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上提供一个编辑表单,允许用户更新学生的信息。当用户提交表单时,你可以使用 PHP 将更新后的信息保存到数据库中。
下面是一个简单的 PHP
示例,用于从表单获取要更新的学生信息,并将其更新到 students
表中:
1 |
|
通过以上代码,你可以在网站中创建一个表单,允许用户输入要更新的学生姓名和新的成绩,并将更新后的信息保存到
students
表中。
10. SQL DELETE
DELETE
语句用于从数据库表中删除现有的记录。通过
DELETE
语句,你可以根据指定的条件删除表中符合条件的记录。
基本语法
1 | DELETE FROM table_name |
- DELETE FROM:指定要从中删除记录的表。
- table_name:要删除记录的表的名称。
- WHERE:可选项,用于指定要删除的记录的条件。
- condition:可选项,指定要删除的记录必须满足的条件。
示例
假设我们有一个名为 students
的表,结构如下:
1 | CREATE TABLE students ( |
现在,假设我们想要删除年龄小于 18 岁的学生。我们可以使用
DELETE
语句来完成这个操作:
1 | DELETE FROM students |
这个语句将从 students
表中删除所有年龄小于 18
岁的学生记录。
在网站中的应用实例
假设你正在开发一个学生信息管理系统,并且需要在网页上提供一个功能,允许管理员删除学生的信息。例如,管理员可能希望删除某个学生因为他已经毕业了或者因为其他原因。
下面是一个简单的 PHP 示例,用于从表单获取要删除的学生姓名,并将其从
students
表中删除:
1 |
|
通过以上代码,你可以在网站中创建一个表单,允许管理员输入要删除的学生姓名,并将其从
students
表中删除。
SQL SELECT TOP
当你需要从数据库中检索前几行数据时,SELECT TOP
就会派上用场。这在大型数据库中特别有用,因为它可以减少数据传输量和查询时间。
语法
1 | SELECT TOP (expression) column1, column2, ... |
expression
: 指定要返回的行数。column1, column2, ...
: 要检索的列。table_name
: 要从中检索数据的表。condition
: 可选项,用于指定过滤条件。
示例
假设我们有一个名为 customers
的表,其中包含客户信息。我们想要从中选择前五个客户:
1 | SELECT TOP 5 * FROM customers; |
如果你想按照某个特定的条件来选择前几行,可以添加
ORDER BY
子句:
1 | SELECT TOP 5 * FROM customers |
这将按照 customer_id
列的值升序排列客户,并选择前五个客户。
在某些数据库系统中,你还可以使用 LIMIT
关键字来达到相同的效果。例如,在 MySQL 中,可以这样写:
1 | SELECT * FROM customers |
但是,请注意,虽然语法不同,但效果是一样的。
SQL LIKE 和通配符
LIKE
和通配符在 SQL
中用于模糊匹配搜索,让你能够找到符合特定模式的数据。它在实际应用中非常有用,因为它可以根据需要进行灵活的搜索。
通配符
在 LIKE
操作符中,通配符是一种特殊的字符,用于匹配字符串模式的一部分。常用的通配符有:
%
: 匹配任意长度的任意字符(包括零个字符)。_
: 匹配单个字符。
示例
假设我们有一个 products
表,其中包含产品信息,我们想要找到所有以 "App" 开头的产品:
1 | SELECT * FROM products WHERE product_name LIKE 'App%'; |
这将返回所有产品名称以 "App" 开头的行,例如 "Apple", "Apparel" 等等。
如果我们想要找到所有名称以 "Apple" 开头,并以 "Phone" 结尾的产品,我们可以这样写:
1 | SELECT * FROM products WHERE product_name LIKE 'Apple%Phone'; |
这将返回所有产品名称以 "Apple" 开头,并以 "Phone" 结尾的行,例如 "Apple iPhone", "Apple Smartphone" 等等。
如果我们想要找到所有名称包含 "Shirt" 的产品,我们可以这样写:
1 | SELECT * FROM products WHERE product_name LIKE '%Shirt%'; |
这将返回所有产品名称中包含 "Shirt" 的行,例如 "T-Shirt", "Dress Shirt" 等等。
原理
LIKE
操作符与使用通配符时,SQL
引擎会根据通配符的位置和数量来匹配字符串。它逐个字符地检查模式和字符串,尝试找到与模式匹配的部分。这意味着,如果模式以
"%" 开头,则匹配会从字符串的开头开始;如果模式以 "%"
结尾,则匹配会从字符串的结尾开始。如果使用了多个
"%",则会匹配任意长度的任意字符。
LIKE
操作符对大小写敏感,但在某些数据库系统中,可以使用特定的函数来进行大小写不敏感的匹配,例如
LOWER()
函数。
虽然 LIKE
操作符非常灵活,但是在大型数据库中使用它可能会导致性能问题,因为它需要对每个符合条件的行进行逐个比较。在这种情况下,你可能会考虑其他搜索技术,例如全文搜索引擎。
SQL通配符
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[*charlist*] |
字符列中的任何单一字符 |
[^*charlist*] 或 [!*charlist*] |
不在字符列中的任何单一字符 |
SQL IN
IN
运算符允许你指定一个条件范围,并与一系列给定值进行比较。它是 SQL
中非常有用的一种条件过滤方法,可以大大简化复杂查询的编写。
原理
IN
运算符用于检查一个值是否与列表中的任何一个值相匹配。它的工作原理是,对于查询中的每一行,它会检查指定的列的值是否在提供的值列表中。如果值在列表中,则该行将被包含在结果中。
示例
假设我们有一个 products
表,其中包含产品信息,以及一个
category_id
列,表示产品所属的类别。现在我们想要找到所有属于类别 1、2 或 3
的产品:
1 | SELECT * FROM products WHERE category_id IN (1, 2, 3); |
这将返回所有 category_id
为 1、2 或 3 的产品。
如果我们想要进一步过滤,例如找到属于类别 1 或 2 的产品,并且价格低于 50 的产品:
1 | SELECT * FROM products WHERE category_id IN (1, 2) AND price < 50; |
这将返回所有 category_id
为 1 或 2,并且价格低于 50
的产品。
IN
运算符可以与其他条件结合使用,以满足复杂的过滤需求。例如,它可以与
NOT
运算符一起使用来排除指定的值,或者与子查询一起使用来动态地构建值列表。
性能考虑
尽管 IN
运算符在简化查询语句方面非常有用,但在处理大型数据集时可能会影响性能。这是因为
SQL
引擎需要在内部将查询优化为有效的执行计划,以确保高效地处理数据。对于较小的值列表,IN
运算符通常不会引起性能问题,但是当值列表很长时,性能可能会受到影响。
对于大型数据集或复杂查询,你可能需要考虑其他过滤技术,例如使用连接(JOIN)或子查询来实现相同的过滤效果,并且可能会提高查询的性能。
SQL BETWEEN
BETWEEN
运算符用于指定一个范围,并检索在指定范围内的值。它在 SQL
查询中是一个非常有用的条件过滤工具,可以让你轻松地找到符合特定范围条件的数据。
原理
BETWEEN
运算符用于检查一个值是否在指定的范围内。它的工作原理是,对于查询中的每一行,它会检查指定的列的值是否在指定的最小值和最大值之间(包括最小值和最大值)。如果值在指定范围内,则该行将被包含在结果中。
示例
假设我们有一个 orders
表,其中包含订单信息,包括订单日期
order_date
。现在我们想要找到所有在 2024 年 1
月份内的订单:
1 | SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31'; |
这将返回所有订单日期在 2024 年 1 月份内的订单。
如果我们想要找到价格在 50 到 100 之间的产品:
1 | SELECT * FROM products WHERE price BETWEEN 50 AND 100; |
这将返回所有价格在 50 到 100 之间的产品。
BETWEEN
运算符可以与其他条件结合使用,以满足更复杂的过滤需求。例如,它可以与其他条件组合,如
AND
、OR
等,以及与 NOT
运算符一起使用来排除指定范围的值。
注意事项
- 在使用
BETWEEN
运算符时要注意边界情况。根据 SQL 的标准,BETWEEN
包括指定的边界值。因此,在上面的示例中,BETWEEN '2024-01-01' AND '2024-01-31'
包括了 2024 年 1 月 1 日和 2024 年 1 月 31 日这两天的订单。 - 对于数值型数据,
BETWEEN
运算符可以直接使用,但对于日期型数据,需要确保日期的格式正确。
SQL 别名
SQL 别名允许你为表名、列名或计算字段指定一个别名,从而提高查询的可读性和可维护性。它使得查询结果更易于理解,尤其是在涉及多个表或复杂计算时。
原理
别名在 SQL 查询中的作用类似于变量名,在查询中引用的表、列或计算字段可以使用一个简短的别名来代替其原始名称。这使得查询更易于理解,尤其是在多表连接、子查询或计算字段的情况下,可以提高查询的可读性和可维护性。
示例
- 给表指定别名
假设我们有两个表:customers
和
orders
。我们想要查询客户的订单信息。在这种情况下,我们可以为表指定别名,使查询更加清晰。
1 | SELECT c.customer_id, o.order_id |
在这个例子中,customers
表被指定了别名
c
,orders
表被指定了别名
o
。这样在后续的查询中就可以使用这些别名来引用这些表。
- 给列指定别名
有时候我们需要查询结果中的列使用自定义的别名。
1 | SELECT product_name AS Product, price AS Price FROM products; |
在这个例子中,product_name
列被指定了别名
Product
,price
列被指定了别名
Price
。这样结果集中的列名会更清晰。
- 给计算字段指定别名
有时候我们需要在查询中计算一些值,并为计算结果指定别名。
1 | SELECT product_name, price * 0.9 AS Discounted_Price FROM products; |
在这个例子中,我们计算出折扣后的价格,并将其指定为别名
Discounted_Price
。这样可以清晰地表明这是一个计算出来的新字段。
注意事项
- 别名只在查询的执行期间有效,并不会修改表或列的原始名称。
- 在使用别名时,通常会使用
AS
关键字来明确指定别名,但在大多数 SQL 实现中,AS
关键字是可选的。
SQL 连接(JOIN)
用于合并来自不同表的数据。
SQL 连接(JOIN)是一种用于合并来自不同表的数据的操作。它允许你根据两个或多个表之间的关系将它们的行组合在一起,以创建一个包含了来自多个表的完整信息的结果集。
原理
连接操作基于表之间的关系将它们的行组合在一起。这些关系通常通过在表之间共享一个或多个列来定义。连接操作基于共享列上的值,将匹配的行组合在一起。连接操作通常与
ON
关键字一起使用,以指定连接的条件。
主要的连接类型包括:
- INNER JOIN:返回两个表之间共有的行,即匹配的行。
- LEFT JOIN(或 LEFT OUTER JOIN):返回左表中的所有行,以及与右表匹配的行。
- RIGHT JOIN(或 RIGHT OUTER JOIN):返回右表中的所有行,以及与左表匹配的行。
- FULL JOIN(或 FULL OUTER JOIN):返回左右两个表中的所有行,如果没有匹配,则用 NULL 值填充。
示例
- INNER JOIN
假设我们有两个表 customers
和
orders
,它们通过 customer_id
列相互关联。现在我们想要获取每个客户的订单信息:
1 | SELECT * |
这将返回所有匹配的客户和订单信息。
- LEFT JOIN
现在假设我们想要获取所有客户以及他们的订单信息,即使某些客户没有订单:
1 | SELECT * |
这将返回所有客户的信息,并且对于没有订单的客户,相关的订单信息将被填充为 NULL。
- RIGHT JOIN
假设我们想要获取所有订单以及订单所属的客户信息,即使某些订单没有关联的客户:
1 | SELECT * |
这将返回所有订单的信息,并且对于没有关联客户的订单,相关的客户信息将被填充为 NULL。
- FULL JOIN
假设我们想要获取所有客户和订单的信息,包括没有匹配的客户或订单:
1 | SELECT * |
这将返回所有客户和订单的信息,并且对于没有匹配的客户或订单,相关的信息将被填充为 NULL。
注意事项
- 连接操作可以基于一个或多个列进行。
- 在使用连接时,要确保连接的列具有相同的数据类型,以便进行比较。
- 连接操作的结果集大小可能会比原始表的大小大或小,具体取决于连接类型和连接条件。
SQL UNION
UNION
操作符用于组合两个或多个 SELECT
语句的结果集,并返回一个包含所有结果的单个结果集。它允许你将多个查询的结果合并在一起,以便在一个结果集中检索多个源的数据。
原理
UNION
操作符将两个或多个查询的结果集合并在一起,返回一个包含所有结果的单个结果集。结果集中的列数和数据类型必须相同,但是结果集可以来自不同的表或查询。重复的行会自动被去重,因此最终结果集中不会包含重复的行。
示例
假设我们有两个表 customers
和
suppliers
,它们包含不同的供应商和客户信息。我们想要将它们的信息合并成一个结果集。
1 | SELECT customer_id, customer_name, email |
这将返回一个包含了所有客户和供应商信息的结果集,其中客户和供应商信息按照指定的列进行合并,并且重复的行会被自动去重。
注意事项
UNION
操作符要求两个查询的结果集具有相同的列数和相似的数据类型。如果列数不同或数据类型不兼容,将会导致错误。- 如果你想要保留重复的行,可以使用
UNION ALL
操作符,它会保留所有行,包括重复的行。 - 通常情况下,
UNION
操作符要求查询的列顺序和数据类型都相同,但某些数据库系统也允许列顺序不同,只要列的数量和数据类型匹配即可。
SQL SELECT INTO
SELECT INTO
语句用于从一个表中选择数据并将其插入到新表中。这是一个非常方便的方法,可以快速地复制表的结构和数据到一个新的表中,而不需要手动创建目标表。下面我们将详细解释它的原理,并提供一些代码示例。
原理
SELECT INTO
语句首先执行一个 SELECT
查询来选择数据,然后将查询结果插入到一个新的表中。新表的结构由
SELECT
查询的结果确定,包括列名、数据类型等。如果目标表已经存在,则
SELECT INTO
语句会失败,因为它要求目标表是一个新的、不存在的表。
示例
假设我们有一个名为 employees
的表,其中包含员工的信息,我们想要将其中的一部分数据复制到一个新的表
employees_backup
中:
1 | SELECT * INTO employees_backup FROM employees; |
这将复制 employees
表的结构和数据到新表
employees_backup
中。
如果我们只想复制 employees
表的部分列到新表中,可以在
SELECT
查询中指定要选择的列:
1 | SELECT employee_id, employee_name INTO employees_backup FROM employees; |
这将只复制 employees
表中的 employee_id
和
employee_name
列到新表中。
注意事项
- 在使用
SELECT INTO
语句时,要确保目标表不存在,否则会导致错误。 - 如果需要复制的数据量很大,
SELECT INTO
可能会导致性能问题,因为它会锁定目标表并将所有数据一次性插入。在这种情况下,你可能需要考虑使用其他方法,例如先创建目标表,然后使用INSERT INTO ... SELECT
语句逐批插入数据。 - 在一些数据库系统中,你也可以使用
CREATE TABLE ... AS SELECT
语句来实现相同的功能,它与SELECT INTO
类似,但语法略有不同。
SQL INSERT INTO SELECT
INSERT INTO SELECT
语句用于从一个表中选择数据并将其插入到另一个表中。它允许你根据条件从源表中选择特定的数据,并将其插入到目标表中,而不需要手动逐行插入。
原理
INSERT INTO SELECT
语句首先执行一个 SELECT
查询来选择数据,然后将查询结果插入到指定的目标表中。目标表必须存在,并且目标表的结构必须与
SELECT
查询的结果兼容,包括列数和数据类型。通常情况下,SELECT
查询的列数和目标表的列数必须完全匹配,但在某些数据库系统中,也允许部分匹配。
示例
假设我们有两个表 employees
和
employees_backup
,它们具有相同的结构,我们想要将
employees
表中的数据复制到 employees_backup
表中:
1 | INSERT INTO employees_backup (employee_id, employee_name) |
这将从 employees
表中选择 employee_id
和
employee_name
列的数据,并将其插入到
employees_backup
表中。
如果我们想要复制 employees
表中的所有列到
employees_backup
表中,可以省略目标表的列名:
1 | INSERT INTO employees_backup |
这将从 employees
表中选择所有列的数据,并将其插入到
employees_backup
表中。
注意事项
- 在使用
INSERT INTO SELECT
语句时,要确保目标表存在,并且目标表的结构与SELECT
查询的结果兼容。 - 如果目标表已经包含了一些数据,
INSERT INTO SELECT
将会向目标表中追加新的数据。 - 在一些数据库系统中,
INSERT INTO SELECT
语句也可以与WHERE
子句一起使用,以实现更精确的数据选择。
SQL CREATE DATABASE
CREATE DATABASE
语句用于在数据库管理系统中创建一个新的数据库。它是管理数据库的基本操作之一,允许用户在系统中创建新的逻辑数据库实例。
原理
CREATE DATABASE
语句用于在数据库管理系统中创建一个新的数据库。它的执行会在系统中创建一个全新的数据库,该数据库将具有指定的名称和初始设置。一旦数据库被创建,就可以在其中创建表、视图、索引等数据库对象,并向其中插入数据。
示例
假设我们要在数据库管理系统中创建一个名为 my_database
的新数据库:
1 | CREATE DATABASE my_database; |
这将在数据库管理系统中创建一个名为 my_database
的新数据库。
注意事项
- 在执行
CREATE DATABASE
语句时,要确保具有足够的权限来创建数据库。通常只有具有管理员权限的用户才能执行此操作。 - 在某些数据库管理系统中,
CREATE DATABASE
语句可能包含一些可选参数,用于指定数据库的字符集、排序规则等设置。这些参数可以根据需要进行配置。 - 创建数据库后,可以使用
USE
语句切换到新创建的数据库中,以便执行后续的操作。例如:
1 | USE my_database; |
这将使当前会话切换到名为 my_database
的数据库中,以便执行后续的 SQL 操作。
SQL CREATE TABLE
CREATE TABLE
语句用于在数据库中创建一个新表。它定义了表的结构,包括表的名称、列名、数据类型以及约束等信息。
原理
CREATE TABLE
语句用于在数据库中创建一个新的表。它的执行会在数据库中创建一个新的表,并定义该表的结构。表的结构由列定义组成,每一列都有一个名称、数据类型和可选的约束。常见的约束包括主键、唯一键、外键、默认值等。
示例
假设我们要在数据库中创建一个名为 customers
的新表,其中包含客户的信息:
1 | CREATE TABLE customers ( |
这将在数据库中创建一个名为 customers
的新表,该表包含三个列:customer_id
、customer_name
和 email
。customer_id
列被定义为主键,它将唯一标识每个客户记录。
注意事项
- 在执行
CREATE TABLE
语句时,要确保具有足够的权限来创建表。通常只有具有管理员权限的用户才能执行此操作。 - 在定义表结构时,要仔细考虑每个列的数据类型和约束,以确保表的设计符合业务需求,并且数据完整性得到维护。
- 在某些数据库管理系统中,
CREATE TABLE
语句可能包含一些可选参数,用于指定表的存储引擎、字符集、排序规则等设置。这些参数可以根据需要进行配置。
SQL 约束
在 SQL 中,约束是用于定义表中数据规则和完整性约束的方法。它们确保了表中数据的一致性、正确性和有效性。常见的约束类型包括主键约束、唯一约束、外键约束、检查约束和默认约束。
主键约束(Primary Key Constraint)
主键约束用于唯一标识表中的每一行数据。它确保表中的每一行都具有唯一的标识符。主键约束可以由一个或多个列组成。
1 | CREATE TABLE students ( |
唯一约束(Unique Constraint)
唯一约束确保列中的所有值都是唯一的,但与主键约束不同的是,唯一约束允许列中的值为 NULL。
1 | CREATE TABLE employees ( |
外键约束(Foreign Key Constraint)
外键约束用于确保表中的数据完整性,它定义了表与其他表之间的关系。外键约束指定了一个列(或多个列),其值必须在另一个表的指定列中存在。
1 | CREATE TABLE orders ( |
检查约束(Check Constraint)
检查约束用于确保列中的值满足指定的条件。它允许你定义一个表达式,该表达式会对列中的值进行验证。
1 | CREATE TABLE products ( |
默认约束(Default Constraint)
默认约束用于为列指定默认值。如果插入操作未提供列的值,则将使用默认值。
1 | CREATE TABLE students ( |
注意事项
- 使用约束可以确保数据的一致性和完整性,有助于避免数据错误和不一致。
- 在设计表结构时,要仔细考虑哪些约束适合于每个列,以满足业务需求并保证数据完整性。
- 不同的数据库管理系统可能支持不同的约束类型和语法。在使用约束时,要查阅相应数据库管理系统的文档以了解其支持的约束类型和语法。
SQL NOT NULL
NOT NULL
是 SQL
中的一种约束,用于确保列中的值不为空。当在表的列上定义
NOT NULL
约束时,意味着该列在插入或更新数据时必须包含一个非空值。如果尝试插入或更新一个空值,则会引发约束违反错误。
原理
NOT NULL
约束用于确保表中的列不允许包含 NULL 值。NULL
值表示缺少值或未知值,而 NOT NULL
约束则要求列中的值必须是已知的、有效的值。这确保了数据的完整性,避免了出现不一致或意外的数据。
示例
以下是一个使用 NOT NULL
约束的示例:
1 | CREATE TABLE students ( |
在这个示例中,students
表中的 student_name
和 email
列都被定义为
NOT NULL
,这意味着插入或更新操作必须为这些列提供非空值。
注意事项
- 使用
NOT NULL
约束可以确保表中的列不允许包含空值,从而提高数据的完整性和一致性。 - 在设计表结构时,应根据业务需求和数据类型的特性来决定哪些列应该定义为
NOT NULL
。 - 当定义了
NOT NULL
约束后,在插入或更新数据时,必须为具有该约束的列提供非空值,否则会引发约束违反错误。
SQL UNIQUE
UNIQUE
是 SQL
中的一种约束,用于确保列中的所有值都是唯一的。与主键约束不同,UNIQUE
约束允许列中的值为 NULL,但除了 NULL
值之外,所有其他值都必须是唯一的。如果尝试插入或更新一个重复的值,则会引发约束违反错误。
原理
UNIQUE
约束用于确保表中的列中的值都是唯一的。它可以应用于单个列或多个列的组合。当在表的列上定义
UNIQUE
约束时,数据库管理系统会在插入或更新数据时检查该列的值是否与该列中的任何其他值冲突。如果冲突,则会引发约束违反错误。
示例
以下是一个使用 UNIQUE
约束的示例:
1 | CREATE TABLE products ( |
在这个示例中,products
表中的 product_name
列被定义为
UNIQUE
,这意味着插入或更新操作必须为该列提供一个唯一的值。
注意事项
- 使用
UNIQUE
约束可以确保表中的列中的值都是唯一的,但允许包含 NULL 值。 - 可以在单个列或多个列的组合上定义
UNIQUE
约束,以确保组合值的唯一性。 - 当定义了
UNIQUE
约束后,在插入或更新数据时,必须确保为该列或列组合提供一个唯一的值,否则会引发约束违反错误。
SQL PRIMARY KEY
PRIMARY KEY
是 SQL
中的一种约束,用于唯一标识表中的每一行。它确保表中的每个记录都具有唯一的标识符,且不允许
NULL 值。PRIMARY KEY
通常用于定义表的主键列,它是表的主要索引字段。
原理
PRIMARY KEY
约束用于定义表的主键列,它唯一标识表中的每一行。主键列的值必须是唯一的,且不允许为
NULL。通常情况下,每个表都应该有一个主键,用于确保表中的每个记录都可以被唯一标识。主键还可以用作表的主要索引字段,以提高检索效率。
示例
以下是一个使用 PRIMARY KEY
约束的示例:
1 | CREATE TABLE orders ( |
在这个示例中,order_id
列被定义为表的主键列。这意味着每个 orders
表中的
order_id
值都必须是唯一的,并且不允许为
NULL。该列通常也会被自动索引,以提高检索效率。
注意事项
- 使用
PRIMARY KEY
约束可以确保表中的每个记录都具有唯一标识符,且不允许为 NULL。 - 每个表通常应该有一个主键,用于唯一标识表中的每一行。
- 主键列的选择应该基于业务需求和数据特性,通常选择具有唯一性和稳定性的列作为主键。常见的选择包括自增长的整数列或具有唯一性的列。
- 在设计表结构时,应仔细考虑主键的选择和定义,以确保满足业务需求,并提高数据的完整性和检索效率。
SQL FOREIGN KEY
FOREIGN KEY
是 SQL
中的一种约束,用于确保两个表之间的数据完整性。它定义了一个列或列组合,该列或列组合的值必须与另一个表中的一个或多个列的值匹配。FOREIGN KEY
建立了表之间的关系,通常用于实现表之间的引用完整性,确保在关联表中不存在无效引用。
原理
FOREIGN KEY
约束用于定义表之间的关系,确保关联表中的引用是有效的。它指定了一个列(或列组合),其值必须与另一个表的指定列的值匹配。通常情况下,FOREIGN KEY
列会引用另一个表的主键列,以确保引用的一致性和完整性。
示例
以下是一个使用 FOREIGN KEY
约束的示例:
1 | CREATE TABLE orders ( |
在这个示例中,orders
表中的 customer_id
列被定义为 FOREIGN KEY
,并指定了引用了
customers
表的 customer_id
列。这意味着
orders
表中的 customer_id
列的值必须存在于
customers
表的 customer_id
列中,否则将无法插入或更新数据。
注意事项
- 使用
FOREIGN KEY
约束可以确保表之间的引用是有效的,提高了数据的完整性和一致性。 - 在定义
FOREIGN KEY
约束时,要确保引用的列在另一个表中存在并且具有唯一性。 - 在插入或更新数据时,要确保
FOREIGN KEY
列的值存在于引用表的列中,否则将无法执行操作,会引发约束违反错误。 - 在设计表结构时,应根据业务需求和数据关系来定义
FOREIGN KEY
约束,以确保数据的一致性和完整性。
SQL CHECK
CHECK
是 SQL
中的一种约束,用于确保列中的值满足指定的条件。当在表的列上定义
CHECK
约束时,数据库管理系统会在插入或更新数据时检查该列的值是否满足指定的条件。如果条件不满足,则会引发约束违反错误。CHECK
约束通常用于强制执行列中的数据规则,确保数据的有效性和完整性。
原理
CHECK
约束用于指定一个表达式,该表达式对列中的值进行验证。当插入或更新数据时,数据库管理系统会对该列的值进行检查,确保其满足指定的条件。如果条件不满足,则会拒绝插入或更新操作,并引发约束违反错误。
示例
以下是一个使用 CHECK
约束的示例:
1 | CREATE TABLE employees ( |
在这个示例中,employees
表中的 age
列被定义为 CHECK
约束,要求其值必须大于或等于
18。这意味着插入或更新操作必须为 age
列提供一个大于或等于
18 的值,否则会引发约束违反错误。
注意事项
- 使用
CHECK
约束可以确保列中的值满足指定的条件,从而强制执行列中的数据规则。 - 在定义
CHECK
约束时,要确保条件表达式能够正确地验证列中的值,并且不会过于复杂或耗费资源。 CHECK
约束可以应用于单个列或多个列的组合,以确保数据的有效性和完整性。- 在设计表结构时,应根据业务需求和数据规则来定义
CHECK
约束,以确保数据的一致性和准确性。
SQL DEFAULT
DEFAULT
是 SQL
中的一种约束,用于为列指定默认值。当在表的列上定义 DEFAULT
约束时,在插入新记录时,如果未提供该列的值,则会自动使用默认值。这样可以确保列中的数据始终具有一个预先定义的值,即使在插入数据时未显式提供该值。
原理
DEFAULT
约束用于为列指定一个默认值。当插入新记录时,如果未为带有
DEFAULT
约束的列提供值,则数据库管理系统会自动将默认值赋给该列。如果提供了值,则会使用提供的值而不是默认值。这样可以确保列中的数据始终具有一个已知的值,即使在插入数据时未提供该值。
示例
以下是一个使用 DEFAULT
约束的示例:
1 | CREATE TABLE users ( |
在这个示例中,users
表中的 username
和
email
列被定义为带有 DEFAULT
约束的列。如果在插入新记录时未提供 username
或
email
的值,则数据库将自动将默认值 'guest'
或
'example@example.com'
赋给相应的列。
注意事项
- 使用
DEFAULT
约束可以确保列中的数据始终具有一个默认值,即使在插入数据时未显式提供该值。 - 在定义
DEFAULT
约束时,要确保指定的默认值符合业务需求,并且与列的数据类型兼容。 - 如果提供了值,则数据库将使用提供的值而不是默认值。
- 在设计表结构时,应根据业务需求和数据特性来选择是否使用
DEFAULT
约束,以确保数据的完整性和一致性。
SQL CREATE INDEX
CREATE INDEX
是 SQL
中用于创建索引的语句。索引是一种数据结构,用于提高数据库查询的性能,特别是在表中存储大量数据时。索引可以帮助数据库系统更快地定位和检索数据,从而加快查询速度。
原理
数据库索引是一种数据结构,类似于书籍的目录,它存储了表中数据的一部分,并提供了一个快速查找数据的路径。索引通常是基于一个或多个列的值构建的,当查询包含索引列的条件时,数据库系统可以使用索引快速定位数据行,而不必扫描整个表。这样可以大大加快查询速度,特别是在大型数据集上。
CREATE INDEX
语句用于在指定的列或列组合上创建索引。一旦创建了索引,数据库系统会自动维护索引的结构,并确保索引与基础表数据的一致性。
示例
以下是一个使用 CREATE INDEX
语句的示例:
1 | CREATE INDEX idx_lastname ON employees (last_name); |
在这个示例中,我们在 employees
表的
last_name
列上创建了一个名为 idx_lastname
的索引。这将帮助数据库系统更快地定位和检索 employees
表中的数据,特别是在根据 last_name
列进行查询时。
注意事项
- 使用
CREATE INDEX
可以显著提高数据库查询的性能,特别是在大型数据集上。 - 在创建索引时,要考虑到查询的频率和类型,以及索引所涉及的列。创建过多或不必要的索引可能会增加数据库系统的负担,并导致性能下降。
- 索引会占用额外的存储空间,并且在插入、更新和删除操作时可能会导致额外的开销。因此,需要权衡索引的性能提升和额外开销之间的关系。
- 在设计表结构时,应根据查询的需求和模式来选择创建索引的列,以确保达到最佳的性能提升效果。
原理
数据库索引是一种数据结构,类似于书籍的目录,它存储了表中数据的一部分,并提供了一个快速查找数据的路径。索引通常是基于一个或多个列的值构建的,当查询包含索引列的条件时,数据库系统可以使用索引快速定位数据行,而不必扫描整个表。这样可以大大加快查询速度,特别是在大型数据集上。
CREATE INDEX
语句用于在指定的列或列组合上创建索引。一旦创建了索引,数据库系统会自动维护索引的结构,并确保索引与基础表数据的一致性。
示例
以下是一个使用 CREATE INDEX
语句的示例:
1 | CREATE INDEX idx_lastname ON employees (last_name); |
在这个示例中,我们在 employees
表的
last_name
列上创建了一个名为 idx_lastname
的索引。这将帮助数据库系统更快地定位和检索 employees
表中的数据,特别是在根据 last_name
列进行查询时。
注意事项
- 使用
CREATE INDEX
可以显著提高数据库查询的性能,特别是在大型数据集上。 - 在创建索引时,要考虑到查询的频率和类型,以及索引所涉及的列。创建过多或不必要的索引可能会增加数据库系统的负担,并导致性能下降。
- 索引会占用额外的存储空间,并且在插入、更新和删除操作时可能会导致额外的开销。因此,需要权衡索引的性能提升和额外开销之间的关系。
- 在设计表结构时,应根据查询的需求和模式来选择创建索引的列,以确保达到最佳的性能提升效果。`
SQL DROP
DROP
是 SQL
中用于删除数据库、表、索引或其他数据库对象的语句。它允许用户从数据库管理系统中删除不再需要的对象,以释放资源并确保数据库结构的整洁。
原理
DROP
语句用于删除数据库中的对象,包括数据库本身、表、索引等。执行
DROP
操作将永久删除指定的对象,其数据和结构将被完全删除,无法恢复。因此,在执行
DROP
操作之前,务必慎重考虑,并确保删除的对象确实不再需要。
示例
以下是一些使用 DROP
语句的示例:
- 删除数据库:
1 | DROP DATABASE my_database; |
这将从数据库管理系统中永久删除名为 my_database
的数据库,包括其中的所有表、索引和数据。
- 删除表:
1 | DROP TABLE my_table; |
这将从当前数据库中永久删除名为 my_table
的表,包括其中的所有数据和索引。
- 删除索引:
1 | DROP INDEX idx_lastname ON employees; |
这将从 employees
表中删除名为 idx_lastname
的索引,但不会影响表中的数据。
注意事项
- 执行
DROP
操作将永久删除指定的对象,其数据和结构将无法恢复。因此,在执行DROP
操作之前,务必慎重考虑,并确保删除的对象确实不再需要。 - 在执行
DROP
操作之前,要确保对删除对象具有足够的权限。通常只有具有管理员权限的用户才能执行DROP
操作。 - 在删除数据库、表或索引之前,建议先备份数据,以防意外情况发生,可以从备份中恢复数据。
SQL ALTER
用于修改数据库、表或索引。 ALTER
是 SQL
中用于修改数据库、表或索引的语句。它允许用户对已存在的数据库对象进行修改,例如添加、删除或修改列,修改表的约束,以及修改索引等。
原理
ALTER
语句用于对已存在的数据库对象进行修改。它可以用于修改表的结构,例如添加、删除或修改列;也可以用于修改表的约束,例如添加、删除或修改主键约束、唯一约束、外键约束等;还可以用于修改索引,例如添加或删除索引。
示例
以下是一些使用 ALTER
语句的示例:
- 添加列:
1 | ALTER TABLE employees ADD COLUMN salary INT; |
这将向 employees
表中添加一个名为 salary
的列,数据类型为整数类型。
- 删除列:
1 | ALTER TABLE employees DROP COLUMN age; |
这将从 employees
表中删除名为 age
的列。
- 修改列的数据类型:
1 | ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10, 2); |
这将修改 employees
表中 salary
列的数据类型为十进制类型,并指定了精度和小数位数。
注意事项
- 使用
ALTER
语句可以对已存在的数据库对象进行修改,但要注意修改操作可能会影响现有数据和约束。 - 在执行
ALTER
操作之前,建议先备份数据,以防意外情况发生,可以从备份中恢复数据。 - 修改数据库结构可能会导致数据库操作的并发问题,因此在进行修改操作时,应尽可能避免对正在运行的系统产生影响。
SQL Auto Increment
AUTO_INCREMENT
是 SQL
中用于创建自增长列的属性,通常用于为表中的主键列自动生成唯一的值。这种自动生成的值通常是连续的整数,每次插入新记录时都会自动增加。
原理
AUTO_INCREMENT
属性用于将一个列指定为自增长列。当在表的列上定义
AUTO_INCREMENT
属性时,数据库管理系统会自动为该列生成唯一的值。每次插入新记录时,该列的值会自动增加,并确保每个值都是唯一的。通常情况下,自增长列会作为表的主键列,用于唯一标识表中的每一行。
示例
以下是一个使用 AUTO_INCREMENT
的示例:
1 | CREATE TABLE students ( |
在这个示例中,students
表中的 student_id
列被定义为自增长列,并指定为表的主键列。这意味着每次插入新记录时,student_id
列的值会自动增加,并确保每个值都是唯一的。无需为 student_id
列提供值,数据库管理系统会自动为其生成一个唯一的值。
注意事项
- 使用
AUTO_INCREMENT
可以方便地为表中的主键列自动生成唯一的值,无需手动指定。 - 自增长列通常作为表的主键列,用于唯一标识表中的每一行。
- 自增长列的值是连续的整数,每次插入新记录时都会自动增加。因此,不建议手动修改自增长列的值,以免破坏数据的完整性。
- 在设计表结构时,应根据业务需求和数据特性来选择是否使用
AUTO_INCREMENT
,以确保数据的一致性和完整性。
SQL 视图
SQL 视图是虚拟的表,它是由一个 SQL 查询定义的,可以像普通表一样查询。视图的结果集是从一个或多个基本表(或视图)派生出来的。视图不包含数据,它只包含根据定义视图时指定的查询的结果集。
原理
视图本质上是一个存储在数据库中的查询结果集,它可以简化复杂查询、提高查询的重用性,并对敏感数据进行隐藏。视图的工作原理是当对视图执行查询时,数据库管理系统会执行视图的查询定义,并返回结果给用户。
示例
以下是一个创建视图的示例:
1 | CREATE VIEW customer_orders AS |
在这个示例中,我们创建了一个名为 customer_orders
的视图,该视图从 customers
表和 orders
表中获取 customer_id
和 order_id
列,并使用
INNER JOIN
进行连接。通过这个视图,我们可以方便地查询每个顾客的订单信息。
注意事项
- 视图可以简化复杂查询,并提高查询的重用性。
- 视图的结果集是动态计算的,每次查询时都会重新计算,因此它总是反映了基础数据的当前状态。
- 视图可以用作数据的安全性控制机制,通过只向用户公开视图而不是基础表来限制对敏感数据的访问。
- 视图的性能可能会受到查询的复杂性和底层表的大小影响。在设计视图时,应该注意查询的效率,并避免过于复杂的查询逻辑。
SQL 日期
在SQL中,日期和时间数据类型用于存储和操作日期和时间信息。这些数据类型允许您存储日期、时间、日期时间以及相关的操作和计算。以下是一些常见的日期和时间数据类型:
DATE
: 用于存储日期值,不包括时间部分。TIME
: 用于存储时间值,不包括日期部分。DATETIME
或TIMESTAMP
: 用于存储日期和时间值。YEAR
: 用于存储年份值。
原理
在SQL中,日期和时间数据类型的存储和处理取决于数据库管理系统的实现。通常,日期和时间数据类型允许您执行各种操作,如日期和时间的算术运算、日期和时间的比较、日期和时间的格式化等。
示例
以下是一个查询订单的示例,筛选出订单日期在2024年1月1日及以后的所有订单:
1 | SELECT * FROM orders WHERE order_date >= '2024-01-01'; |
在这个示例中,order_date
是一个日期或日期时间类型的列,我们使用 >=
操作符来筛选出订单日期在2024年1月1日及以后的订单。
注意事项
- 当处理日期和时间数据时,要确保使用正确的数据类型,并考虑到时区和格式化等因素。
- 在进行日期和时间的比较时,要注意不同数据库管理系统的行为,以及如何处理日期和时间的格式化。
- SQL提供了许多内置函数和运算符,用于处理日期和时间数据,例如
DATEADD
、DATEDIFF
、DATEPART
等。这些函数可以用于执行各种日期和时间的操作和计算。
SQL NULL 值
在SQL中,NULL
是一个特殊的值,用于表示缺少值或未知值。它与其他值不同,因为它不是任何特定数据类型的值,而是一种状态。NULL
可以在列中存储,表示该列中的值未知或不存在。
原理
NULL
值在SQL中用于表示缺失或未知的值。它不等同于零、空字符串或任何其他值,而是一种状态。当查询数据时,可以使用
IS NULL
或 IS NOT NULL
条件来检查列中是否包含
NULL
值。
示例
以下是一个查询学生表中成绩为 NULL
的示例:
1 | SELECT * FROM students WHERE grade IS NULL; |
这个查询将返回学生表中成绩列中值为 NULL
的所有行。
注意事项
- 当处理可能包含
NULL
值的列时,应该注意处理NULL
值的情况,以避免出现意外的结果。 NULL
值在SQL中不同于空字符串或零值,因此在比较或计算时需要特别注意。- 在设计表结构时,应该考虑是否允许列中包含
NULL
值,并在必要时进行适当的约束和处理。
SQL NULL 函数
在SQL中,NULL
函数用于处理包含 NULL
值的列或表达式,它可以将 NULL
值替换为指定的值。NULL
函数常用于处理结果集中可能包含
NULL
值的情况,使结果更易于阅读和处理。
原理
NULL
函数的原理是检查指定的列或表达式的值,如果该值为
NULL
,则返回指定的替代值;如果该值不为
NULL
,则返回该值本身。
示例
以下是一个使用 NULL
函数的示例:
1 | SELECT COALESCE(column_name, 'N/A') FROM table_name; |
这个查询将返回指定列中的值,如果值为 NULL
,则将其替换为
'N/A'
。否则,返回列中的实际值。
注意事项
NULL
函数可以用于处理结果集中可能包含NULL
值的情况,使结果更易于阅读和处理。- 在使用
NULL
函数时,要考虑指定的替代值是否适合实际情况,并且不会引入混淆或误解。 - 虽然
NULL
函数可以提供对NULL
值的处理,但在进行查询和数据处理时,仍需要小心处理可能包含NULL
值的情况,以确保结果的准确性和完整性。
SQL 通用数据类型
在SQL中,数据类型用于定义列中可以存储的数据的类型。不同的数据库管理系统支持不同的数据类型,但通常会包括数值型、字符型、日期/时间型等常见类型。
原理
数据类型在SQL中用于确定列中存储的数据的类型和格式。每种数据类型都有其特定的属性和限制,例如整数类型只能存储整数值,字符类型可以存储字符数据等。选择合适的数据类型可以确保数据的准确性、一致性和有效性。
示例
以下是一个使用常见数据类型的表创建示例:
1 | CREATE TABLE employees ( |
在这个示例中,我们创建了一个名为 employees
的表,包含了四个列:employee_id
(整数类型)、employee_name
(字符串类型,最大长度为50)、hire_date
(日期类型)和
salary
(十进制类型,总共10位数,其中2位是小数)。
注意事项
- 在设计表结构时,应该选择合适的数据类型来确保数据的准确性和一致性。
- 不同的数据库管理系统支持不同的数据类型,因此在编写SQL语句时需要考虑目标数据库的特性和支持情况。
- 数据类型的选择可能会影响数据库的性能和存储空间,因此应该根据实际需求进行权衡和选择。
SQL DB 数据类型
在这个例子中,我们使用 CREATE TABLE
语句创建了一个名为
employees
的表,其中包含了四个列:employee_id
、employee_name
、hire_date
和
salary
。让我们更详细地解释一下这些列的数据类型和原理。
employee_id INT
: 这一列的数据类型是INT
,表示整数。INT
是整数类型的一种,通常用于存储不带小数点的整数值。在这个示例中,employee_id
被定义为员工的唯一标识符,并且预计将存储整数值。employee_name VARCHAR(50)
: 这一列的数据类型是VARCHAR(50)
,表示可变长度的字符型数据,最大长度为50个字符。VARCHAR
是一种常见的字符类型,用于存储可变长度的字符数据。在这个示例中,employee_name
被定义为员工的姓名,最大长度为50个字符。hire_date DATE
: 这一列的数据类型是DATE
,表示日期值。DATE
是日期类型的一种,用于存储日期值,不包含时间部分。在这个示例中,hire_date
被定义为员工的入职日期。salary DECIMAL(10, 2)
: 这一列的数据类型是DECIMAL(10, 2)
,表示带有指定精度和小数位数的十进制数值。DECIMAL
是一种精确数值类型,用于存储带有指定精度和小数位数的十进制数值。在这个示例中,salary
被定义为员工的薪水,总共有10位数字,其中包括2位小数。
这些列的数据类型根据其所存储的数据的特性进行了选择。例如,employee_id
使用整数类型,因为它预计将存储唯一的整数标识符;employee_name
使用可变长度的字符类型,以适应不同长度的姓名;hire_date
使用日期类型,以存储日期值而不是日期时间值;salary
使用精确数值类型,以确保薪水的准确性和一致性。 ***
SQL函数
- AVG(): 计算指定列的平均值。
1 | SELECT AVG(salary) AS average_salary FROM employees; |
- COUNT(): 计算指定列中行的数量。
1 | SELECT COUNT(*) AS total_employees FROM employees; |
- FIRST(): 返回结果集的第一个值。
1 | SELECT FIRST(employee_name) AS first_employee FROM employees; |
- LAST(): 返回结果集的最后一个值。
1 | SELECT LAST(employee_name) AS last_employee FROM employees; |
- MAX(): 计算指定列的最大值。
1 | SELECT MAX(salary) AS max_salary FROM employees; |
- MIN(): 计算指定列的最小值。
1 | SELECT MIN(salary) AS min_salary FROM employees; |
- SUM(): 计算指定列的总和。
1 | SELECT SUM(salary) AS total_salary FROM employees; |
- GROUP BY: 按指定列对结果集进行分组。
1 | SELECT department_id, AVG(salary) AS average_salary |
- HAVING: 在GROUP BY子句中,对分组后的结果进行过滤。
1 | SELECT department_id, AVG(salary) AS average_salary |
- EXISTS: 检查是否存在满足条件的记录。
1 | SELECT employee_id, employee_name |
- UCASE(): 将字符串转换为大写。
1 | SELECT UCASE(employee_name) AS uppercase_name FROM employees; |
- LCASE(): 将字符串转换为小写。
1 | SELECT LCASE(employee_name) AS lowercase_name FROM employees; |
- MID(): 从字符串中提取子字符串。
1 | SELECT MID(employee_name, 1, 3) AS initials FROM employees; |
- LEN(): 返回字符串的长度。
1 | SELECT LEN(employee_name) AS name_length FROM employees; |
- ROUND(): 对数值进行四舍五入。
1 | SELECT ROUND(salary, 2) AS rounded_salary FROM employees; |
- NOW(): 返回当前日期和时间。
1 | SELECT NOW() AS current_datetime; |
- FORMAT(): 格式化数值。
1 | SELECT FORMAT(salary, '$#,##0.00') AS formatted_salary FROM employees; |
。