【数据库】SQL语句基础
【数据库】SQL语句基础
文章目录
- 【数据库】SQL语句基础
- 一、SQL与数据库
- 二、 SQL语句类型
- 2.1 数据定义语言(DDL)
- 1. 创建数据库:CREATE DATABASE
- 2. 创建表:CREATE TABLE
- 3. 删除表:DROP TABLE
- 4. 修改表结构:ALTER TABLE
- 5. 删除数据库:DROP DATABASE
- 2.2 数据操作语言(DML)
- 1. 插入数据:INSERT INTO
- 2. 更新数据:UPDATE
- 3. 删除数据:DELETE
- 4. 清除数据:TRUNCATE TABLE
- 2.3 数据查询语言(DQL)
- 1. 查询数据:SELECT
- 2. 去除重复数据:DISTINCT
- 3. 排序查询:ORDER BY
- 4. 聚合函数:COUNT(), AVG(), SUM(), MIN(), MAX()
- 5. 分组查询:GROUP BY
- 6. 条件查询:WHERE, AND, OR
- 7. 分页查询:LIMIT 和 OFFSET
- 8. 内连接查询:INNER JOIN
- 9. 外连接查询:LEFT JOIN, RIGHT JOIN
- 10. 子查询
- 2.4 数据控制语言(DCL)
- 1. 管理用户:CREATE USER, DROP USER
- 2. 权限管理:GRANT, REVOKE
- 3. 刷新权限:FLUSH PRIVILEGES
- 4. 查看权限:SHOW GRANTS
- 5. 权限类型
- 三、 SQL关键字与操作符
- 四、 常用SQL函数
- 1. 聚合函数
- 2. 字符串处理函数
- 3. 日期函数
一、SQL与数据库
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准编程语言。通过SQL,用户可以进行数据插入、更新、删除、查询等操作。SQL并不依赖于特定的编程语言,而是作为数据库的查询语言,与多种开发语言结合使用(如Python、Java等)以进行数据的操作。
数据库是一个有组织的、存储和管理数据的系统。它包含一系列的数据表,每个表有若干字段和记录。数据库用于存储大量的结构化数据,可以高效地进行数据查询、更新、插入和删除操作。数据库管理系统(DBMS)则是用于创建、管理、访问和维护数据库的软件。
关系型数据库管理系统(RDBMS)
关系型数据库管理系统(RDBMS)是一种基于关系模型的数据库管理系统。在RDBMS中,数据存储在表格形式中,表之间通过主键和外键建立关系。常见的关系型数据库系统包括MySQL、PostgreSQL、Oracle和SQL Server等。RDBMS的主要特点是数据的结构化存储、数据之间的关系、支持ACID(原子性、一致性、隔离性、持久性)特性以及支持SQL查询语言。
常见的数据库管理系统
- MySQL:开源的关系型数据库管理系统,广泛应用于网站、应用程序开发等领域。MySQL支持ACID事务和多种数据类型,具备高效的查询性能。
- PostgreSQL:开源的对象-关系型数据库系统,注重标准兼容性和扩展性。PostgreSQL支持复杂的查询、事务和数据类型,广泛应用于学术研究和企业级应用。
- Oracle:由甲骨文公司开发的商用数据库管理系统,适用于大规模、复杂的数据库应用。Oracle具备强大的性能、可靠性和安全性。
- SQL Server:微软推出的关系型数据库管理系统,通常与微软技术栈(如ASP.NET)配合使用,适合企业级应用开发。
在正式开始学习SQL之前需要知道一些常识:
SQL本身在大多数数据库系统中是不区分大小写的,特别是在关键字和函数名称方面。例如,SELECT
、select
、SeLeCt
都可以视为相同的。尽管如此,表名、列名以及其他标识符(如数据库名)是否区分大小写取决于所使用的数据库系统和其配置。例如:
- 在MySQL中,表名默认区分大小写,列名通常不区分大小写。
- 在PostgreSQL中,表名和列名默认是区分大小写的。
因此,在编写SQL时,建议遵循统一的命名规则,以保持代码的可读性和可维护性,包括:
- SQL关键字通常建议使用大写字母书写(虽然大部分数据库系统对大小写不敏感,但大写有助于代码的可读性)。
- 每条SQL语句通常以分号(
;
)结尾,特别是在多条语句中时。- 对于表名、列名等标识符,避免使用SQL保留字,并尽量保持一致的命名规范。
SQL语言的结构通常包括以下几类操作:
-
数据定义语言(DDL):用于定义数据库结构。常用的DDL语句有:
CREATE
:创建数据库、表、视图等。ALTER
:修改数据库结构(如修改表结构)。DROP
:删除数据库、表、视图等。
-
数据操作语言(DML):用于操作数据内容。常用的DML语句有:
SELECT
:查询数据。INSERT
:插入数据。UPDATE
:更新数据。DELETE
:删除数据。
-
数据控制语言(DCL):用于控制对数据库的访问权限。常用的DCL语句有:
GRANT
:授予权限。REVOKE
:撤销权限。
-
事务控制语言(TCL):用于管理事务的提交和回滚。常用的TCL语句有:
COMMIT
:提交事务。ROLLBACK
:回滚事务。SAVEPOINT
:设置事务的保存点。
SQL语句的基本结构通常包括:
- 关键字:例如
SELECT
、FROM
、WHERE
、INSERT INTO
等。- 标识符:如表名、列名、数据库名等。
- 运算符和表达式:如
+
、-
、*
、/
等数学运算符,以及条件表达式。- 条件子句:如
WHERE
、HAVING
、AND
、OR
等。
二、 SQL语句类型
SQL语句可以分为多种类型,每种类型用于不同的操作,包括定义数据库结构、操作数据、查询数据和管理数据库权限等。
2.1 数据定义语言(DDL)
数据定义语言(DDL,Data Definition Language)是SQL的一个子集,主要用于定义、修改和删除数据库结构。DDL语句不直接操作数据,它们影响数据库的结构、表格、索引等对象。常见的DDL语句包括创建数据库、创建表、删除表、修改表结构、删除数据库等。
1. 创建数据库:CREATE DATABASE
CREATE DATABASE
语句用于创建一个新的数据库。它是SQL中最基础的DDL操作之一。创建数据库时,你需要为其指定一个名称,可以选择定义字符集、排序规则等。
语法:
CREATE DATABASE database_name;
可以在创建数据库时指定一些属性,例如字符集和排序规则(具体数据库系统可能有所不同)。例如,在MySQL中,指定字符集和排序规则的语法为:
CREATE DATABASE database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
示例:
CREATE DATABASE SchoolDB;
此语句会创建一个名为SchoolDB
的数据库。
2. 创建表:CREATE TABLE
CREATE TABLE
语句用于创建一个新表,并定义该表的结构,包括列名、数据类型和约束。表的结构是数据库设计的核心部分,合理设计表的结构可以确保数据的完整性和查询效率。
语法:
CREATE TABLE table_name (
column1 datatype [constraint],
column2 datatype [constraint],
...
);
table_name
:表的名称。column_name
:列的名称。datatype
:列的数据类型(如INT
、VARCHAR
、DATE
等)。constraint
:约束(如PRIMARY KEY
、NOT NULL
、UNIQUE
等),用于限制列的值或表的完整性。
示例:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INT,
Email VARCHAR(100) UNIQUE NOT NULL
);
此语句创建一个名为Students
的表,包含四个列:StudentID
(主键)、FirstName
、LastName
、Age
和Email
。其中,Email
列设置为唯一且不能为空。
3. 删除表:DROP TABLE
DROP TABLE
语句用于删除现有的表及其所有数据。删除表后,该表的结构和其中的数据都将永久丢失。因此,在执行此操作时需要非常小心。
语法:
DROP TABLE table_name;
示例:
DROP TABLE Students;
此语句将删除名为Students
的表,并且无法恢复其包含的数据。
4. 修改表结构:ALTER TABLE
ALTER TABLE
语句用于修改现有表的结构,允许对表进行多种操作,如添加、删除、修改列,修改约束等。它非常强大,可以对表进行动态调整,而不需要重新创建表。
常见的ALTER TABLE
操作有:
-
添加列:
ADD
用于向表中添加一个新的列。可以指定列的名称、数据类型及约束。
语法:
ALTER TABLE table_name ADD column_name datatype [constraint];
示例:
ALTER TABLE Students ADD DateOfBirth DATE;
该语句会向
Students
表添加一个名为DateOfBirth
的新列,数据类型为DATE
。 -
删除列:
DROP COLUMN
用于从表中删除某个列。删除列时,数据会丢失,且不能恢复。
语法:
ALTER TABLE table_name DROP COLUMN column_name;
示例:
ALTER TABLE Students DROP COLUMN Email;
该语句会从
Students
表中删除名为Email
的列。 -
修改列:
MODIFY
或CHANGE
用于修改列的数据类型或约束。具体语法和使用方法会根据不同的数据库系统略有不同。
语法(MySQL):
ALTER TABLE table_name MODIFY column_name new_datatype [new_constraint];
示例:
ALTER TABLE Students MODIFY Age INT NOT NULL;
该语句会修改
Students
表中的Age
列,确保该列的值不能为空。另外,有些数据库系统(如MySQL)也支持
CHANGE
操作,用于修改列的名称和数据类型。语法:
ALTER TABLE table_name CHANGE old_column_name new_column_name new_datatype;
示例:
ALTER TABLE Students CHANGE FirstName FirstName VARCHAR(100);
该语句会将
FirstName
列的名称更改为FirstName
(实际上没有更改列名,但可以修改数据类型等)。
5. 删除数据库:DROP DATABASE
DROP DATABASE
语句用于删除数据库及其所有对象(包括所有表、视图、索引等)。这是一项不可逆的操作,删除数据库后,所有相关数据将被丢失。
语法:
DROP DATABASE database_name;
示例:
DROP DATABASE SchoolDB;
此语句会删除SchoolDB
数据库以及其中所有的表和数据。
2.2 数据操作语言(DML)
数据操作语言(DML,Data Manipulation Language)用于操作数据库中的数据,包括插入、更新、删除和清除数据。与数据定义语言(DDL)不同,DML不涉及表结构的更改,而是专注于数据的增、删、改、查等操作。DML语句是日常数据库操作的核心部分,帮助用户有效地管理和操作数据。
1. 插入数据:INSERT INTO
INSERT INTO
语句用于向表中插入一行或多行数据。可以插入指定列的数据,也可以插入所有列的数据。如果插入数据时未指定某列,数据库将使用该列的默认值(如果有的话)。
语法:
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
table_name
:目标表的名称。column1, column2, ...
:要插入的列名。value1, value2, ...
:要插入的对应列的值。
示例:
INSERT INTO Students (StudentID, FirstName, LastName, Age)
VALUES (1, 'John', 'Doe', 20);
该语句将一行数据插入到Students
表中,其中包含StudentID
为1,FirstName
为"John",LastName
为"Doe",Age
为20的记录。
插入多行数据:
可以一次插入多行数据,使用逗号分隔各行数据:
INSERT INTO Students (StudentID, FirstName, LastName, Age)
VALUES
(2, 'Jane', 'Smith', 22),
(3, 'Mike', 'Johnson', 21),
(4, 'Emily', 'Brown', 23);
2. 更新数据:UPDATE
UPDATE
语句用于修改表中已存在的记录。可以更新一个或多个列的值,但必须指定更新条件,以避免不小心更新所有记录。
语法:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE [condition];
table_name
:要更新数据的表名。column1, column2, ...
:需要更新的列名。value1, value2, ...
:新的列值。WHERE [condition]
:指定条件,只有满足该条件的记录才会被更新。如果省略WHERE
子句,表中所有记录都会被更新。
示例:
UPDATE Students
SET Age = 21
WHERE StudentID = 1;
该语句将更新Students
表中StudentID
为1的记录,将Age
列的值修改为21。
注意事项:
- 如果没有
WHERE
条件,UPDATE
语句会更新表中的所有记录。例如,UPDATE Students SET Age = 25;
会将Students
表中所有学生的年龄修改为25,这通常是一个错误操作。
3. 删除数据:DELETE
DELETE
语句用于从表中删除满足特定条件的记录。删除操作是不可恢复的,因此在执行DELETE
时需要谨慎。DELETE
会逐行删除数据,但保留表结构不变。
语法:
DELETE FROM table_name
WHERE [condition];
table_name
:要删除数据的表名。WHERE [condition]
:删除满足该条件的记录。如果没有WHERE
条件,表中所有记录将被删除。
示例:
DELETE FROM Students
WHERE StudentID = 1;
该语句会删除Students
表中StudentID
为1的记录。
注意事项:
- 与
UPDATE
类似,DELETE
如果没有指定WHERE
条件,会删除表中的所有记录。为了防止不小心删除所有数据,始终建议加上WHERE
子句。
4. 清除数据:TRUNCATE TABLE
TRUNCATE TABLE
语句用于删除表中的所有数据,但与DELETE
不同,它不逐行删除数据,而是通过更高效的方式清空整个表。TRUNCATE
通常比DELETE
速度更快,但也有一些区别:
TRUNCATE
会重置表的自增计数器(例如,在MySQL中,如果表中有自增列,TRUNCATE
会将计数器重置为初始值)。TRUNCATE
无法与WHERE
条件一起使用,它会删除表中的所有数据。TRUNCATE
通常不产生日志记录,因此操作不可恢复。
语法:
TRUNCATE TABLE table_name;
示例:
TRUNCATE TABLE Students;
该语句会删除Students
表中的所有记录,但表的结构保持不变。TRUNCATE
通常用于快速清空表数据,尤其是在需要删除大量数据时。
注意事项:
- 与
DELETE
不同,TRUNCATE
不能触发删除触发器(如果存在)。 - 由于
TRUNCATE
是不可恢复的,所以在使用时需要特别小心。
2.3 数据查询语言(DQL)
数据查询语言(DQL,Data Query Language)主要用于从数据库中查询数据。
SELECT
语句是DQL中最常用的语句,它用于从一个或多个表中提取信息。DQL的核心功能是查询和提取数据,结合其他SQL语句可以非常灵活地操作和展示数据。
1. 查询数据:SELECT
SELECT
语句用于从一个或多个表中检索数据。可以指定要查询的列、表和条件,还可以使用排序、去重、聚合等功能。
基本语法:
SELECT column1, column2, ...
FROM table_name
WHERE [condition];
column1, column2, ...
:要查询的列名。如果要查询所有列,可以使用*
。table_name
:从哪个表中查询数据。[condition]
:指定查询条件,筛选符合条件的记录。
示例:
SELECT FirstName, LastName
FROM Students
WHERE Age > 18;
该语句查询Students
表中,年龄大于18的学生的名字和姓氏。
查询所有列:
SELECT *
FROM Students;
该语句返回Students
表中的所有数据。
2. 去除重复数据:DISTINCT
DISTINCT
关键字用于返回查询结果中不重复的值。它适用于需要排除重复数据的场景。
语法:
SELECT DISTINCT column_name
FROM table_name;
示例:
SELECT DISTINCT Age
FROM Students;
该语句返回Students
表中不重复的年龄。
3. 排序查询:ORDER BY
ORDER BY
用于对查询结果进行排序。默认情况下,排序是按升序(ASC)排列的。如果需要降序排列,可以使用DESC
关键字。
语法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name [ASC|DESC];
column_name
:用于排序的列名。ASC
:升序排序(默认)。DESC
:降序排序。
示例:
SELECT FirstName, LastName
FROM Students
ORDER BY Age DESC;
该语句根据Age
列的值降序排列Students
表中的数据。
4. 聚合函数:COUNT(), AVG(), SUM(), MIN(), MAX()
聚合函数用于对查询结果进行计算,通常用在需要统计、计算总数、求平均数等场景。
COUNT()
: 计算行数AVG()
: 计算平均值SUM()
: 计算总和MIN()
: 获取最小值MAX()
: 获取最大值
语法:
SELECT COUNT(*) FROM table_name;
SELECT AVG(column_name) FROM table_name;
SELECT SUM(column_name) FROM table_name;
SELECT MIN(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
示例:
SELECT COUNT(*) FROM Students;
该语句返回Students
表中记录的总数。
SELECT AVG(Age) FROM Students;
该语句返回Students
表中学生的平均年龄。
5. 分组查询:GROUP BY
GROUP BY
用于根据一个或多个列将查询结果分组,通常与聚合函数一起使用。它用于统计各个分组的数据。
语法:
SELECT column, COUNT(*)
FROM table_name
GROUP BY column;
示例:
SELECT Age, COUNT(*)
FROM Students
GROUP BY Age;
该语句会按Age
列对Students
表中的数据进行分组,并统计每个年龄段的学生人数。
6. 条件查询:WHERE, AND, OR
WHERE
用于筛选查询结果,指定一个或多个条件。AND
和OR
用于连接多个条件,进行更复杂的筛选。
语法:
SELECT column1, column2
FROM table_name
WHERE [condition1] AND|OR [condition2];
示例:
SELECT FirstName, LastName
FROM Students
WHERE Age > 18 AND LastName = 'Doe';
该语句查询Students
表中年龄大于18并且姓氏为’Doe’的学生。
使用OR
连接条件:
SELECT FirstName, LastName
FROM Students
WHERE Age > 18 OR LastName = 'Doe';
该语句查询Students
表中年龄大于18或姓氏为’Doe’的学生。
7. 分页查询:LIMIT 和 OFFSET
分页查询用于限制查询返回的记录数,常用于在Web应用中显示查询结果时进行分页。LIMIT
指定返回的记录数,OFFSET
指定从哪一条记录开始返回。
语法:
SELECT column1, column2
FROM table_name
LIMIT number_of_records OFFSET start_position;
number_of_records
:要返回的记录数。start_position
:从哪一条记录开始返回(从0开始)。
示例:
SELECT * FROM Students
LIMIT 10 OFFSET 20;
该语句返回Students
表中从第21条记录到第30条记录的数据(注意,OFFSET
是从0开始计算的)。
8. 内连接查询:INNER JOIN
INNER JOIN
用于返回两个或多个表中匹配的记录。如果表中没有匹配的记录,则不会返回任何结果。
语法:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
示例:
SELECT Students.FirstName, Students.LastName, Courses.CourseName
FROM Students
INNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentID
INNER JOIN Courses ON Enrollments.CourseID = Courses.CourseID;
该语句查询所有注册课程的学生的名字、姓氏以及课程名称。
9. 外连接查询:LEFT JOIN, RIGHT JOIN
外连接用于返回两个表中匹配的数据以及不匹配的数据。LEFT JOIN
返回左表的所有记录以及匹配的右表记录,RIGHT JOIN
则返回右表的所有记录以及匹配的左表记录。
LEFT JOIN
:返回左表的所有记录和匹配的右表记录。RIGHT JOIN
:返回右表的所有记录和匹配的左表记录。
语法:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
示例:
SELECT Students.FirstName, Students.LastName, Courses.CourseName
FROM Students
LEFT JOIN Enrollments ON Students.StudentID = Enrollments.StudentID
LEFT JOIN Courses ON Enrollments.CourseID = Courses.CourseID;
该语句查询所有学生的名字、姓氏以及他们注册的课程。如果某个学生没有注册课程,查询结果中该学生的课程名称将为空。
10. 子查询
子查询是一个嵌套在其他查询中的查询。根据返回的结果不同,子查询可以分为以下几种类型:
-
单行单列子查询:返回单个值(行和列)。
SELECT FirstName, LastName FROM Students WHERE Age = (SELECT MAX(Age) FROM Students);
-
多行单列子查询:返回多个值(行,但只有一个列)。
SELECT FirstName, LastName FROM Students WHERE Age IN (SELECT Age FROM Students WHERE Age > 18);
-
多行多列子查询:返回多个值(行和列)。
SELECT FirstName, LastName, Age FROM Students WHERE (FirstName, LastName) IN (SELECT FirstName, LastName FROM Students WHERE Age > 18);
2.4 数据控制语言(DCL)
数据控制语言(DCL,Data Control Language)用于管理数据库中的访问权限、用户管理以及控制数据操作的权限。DCL语句确保数据库的安全性和合理的访问控制,主要包括用户的创建、权限的授予与撤销。常见的DCL语句有
CREATE USER
、DROP USER
、GRANT
和REVOKE
。
1. 管理用户:CREATE USER, DROP USER
-
CREATE USER
:
用于在数据库中创建一个新的用户,并为该用户分配一个密码。用户可以根据需要与特定的主机(如localhost
或%
)相关联。语法:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
username
:要创建的用户名。host
:指定用户连接数据库的主机,可以是localhost
(本机)或者%
(任何主机)。password
:用户的登录密码。
示例:
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';
该语句在数据库中创建了一个名为
new_user
的用户,并为其设置了密码password
。该用户仅能从localhost
主机登录。 -
DROP USER
:
用于删除数据库中的用户。如果一个用户不再需要访问数据库,或者由于其他原因需要删除该用户时,可以使用此命令。语法:
DROP USER 'username'@'host';
示例:
DROP USER 'new_user'@'localhost';
该语句会删除名为
new_user
且只允许从localhost
主机登录的用户。
2. 权限管理:GRANT, REVOKE
权限管理语句用于授予或撤销用户对数据库中对象的访问权限(如表、视图、数据库等)。使用这些语句可以控制用户能否执行某些操作,例如读取、插入、更新、删除数据等。
-
GRANT
:
GRANT
语句用于授予用户对数据库对象的权限。可以为一个用户授予一或多个权限。语法:
GRANT privilege_type ON database_name.table_name TO 'username'@'host';
privilege_type
:要授予的权限类型(如SELECT
、INSERT
、UPDATE
等)。database_name.table_name
:指定授予权限的数据库和表名。如果是整个数据库,可以使用*
。username
:要授予权限的用户名。host
:指定用户连接数据库的主机。
示例:
GRANT SELECT, INSERT ON Students.* TO 'new_user'@'localhost';
该语句授予
new_user
用户在localhost
主机上的Students
表的SELECT
(查询)和INSERT
(插入)权限。还可以授予多个权限:
GRANT SELECT, INSERT, UPDATE ON Students TO 'new_user'@'localhost';
授予所有权限:
如果希望授予用户所有权限,可以使用ALL PRIVILEGES
关键字:GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
该语句授予
username
用户对database_name
数据库中所有表的所有权限。 -
REVOKE
:
REVOKE
语句用于撤销用户对数据库对象的权限。撤销某个权限后,用户将无法再执行相应的操作。语法:
REVOKE privilege_type ON database_name.table_name FROM 'username'@'host';
privilege_type
:要撤销的权限类型。database_name.table_name
:指定撤销权限的数据库和表名。username
:要撤销权限的用户名。host
:指定用户连接数据库的主机。
示例:
REVOKE SELECT, INSERT ON Students.* FROM 'new_user'@'localhost';
该语句撤销
new_user
用户在localhost
主机上的Students
表的SELECT
(查询)和INSERT
(插入)权限。还可以撤销多个权限:
REVOKE SELECT, INSERT, UPDATE ON Students FROM 'new_user'@'localhost';
撤销所有权限:
如果希望撤销用户对某个数据库或表的所有权限,可以使用ALL PRIVILEGES
:REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host';
3. 刷新权限:FLUSH PRIVILEGES
当使用GRANT
或REVOKE
修改用户权限时,修改的权限会在下次用户连接时生效。在某些情况下,可以使用FLUSH PRIVILEGES
语句强制数据库立即重新加载权限表,从而立即生效。
语法:
FLUSH PRIVILEGES;
此语句会重新加载权限表,确保所有权限更改立即生效。
4. 查看权限:SHOW GRANTS
SHOW GRANTS
语句用于查看某个用户的权限。可以查询特定用户的权限情况,以确认用户当前拥有的操作权限。
语法:
SHOW GRANTS FOR 'username'@'host';
示例:
SHOW GRANTS FOR 'new_user'@'localhost';
该语句将显示new_user
用户在localhost
主机上拥有的所有权限。
5. 权限类型
常见的权限类型有:
SELECT
:允许查询数据。INSERT
:允许插入数据。UPDATE
:允许更新数据。DELETE
:允许删除数据。CREATE
:允许创建数据库或表。DROP
:允许删除数据库或表。ALTER
:允许修改数据库或表的结构。INDEX
:允许创建或删除索引。GRANT OPTION
:允许将权限授予其他用户。ALL PRIVILEGES
:授予所有权限。
三、 SQL关键字与操作符
SQL中有许多关键字与操作符,它们用于帮助进行更灵活的查询和数据操作。以下是一些常见的SQL关键字与操作符。
关键字/操作符 | 描述 | 示例 |
---|---|---|
LIKE | 用于在WHERE 子句中进行模糊查询,可以匹配指定模式的字符串。通常与通配符% 和_ 一起使用。% 表示零个或多个字符,_ 表示单个字符。 | SELECT * FROM Students WHERE FirstName LIKE 'J%'; (查找所有名字以’J’开头的学生) |
IN | 用于检查某个值是否在指定的值列表或子查询返回的结果集中。它简化了多个OR 条件的写法。 | SELECT * FROM Students WHERE Age IN (18, 19, 20); (查找年龄为18、19或20岁的学生) |
BETWEEN | 用于检查某个值是否在一个范围内。包括范围的两个边界。 | SELECT * FROM Students WHERE Age BETWEEN 18 AND 22; (查找年龄在18到22岁之间的学生) |
AS | 用于给列或表指定别名,通常用于结果的展示,增强可读性。 | SELECT FirstName AS Name, Age FROM Students; (将 FirstName 列重命名为Name ) |
JOIN | 用于从两个或多个表中查询相关数据,连接表的方式有多种(如INNER JOIN 、LEFT JOIN 等)。 | SELECT Students.FirstName, Courses.CourseName FROM Students INNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentID; (查找学生和他们选修的课程) |
UNION | 用于合并多个SELECT 语句的结果集。默认情况下,UNION 去除重复的记录。如果想保留所有记录,可以使用UNION ALL 。 | SELECT FirstName FROM Students WHERE Age > 18 UNION SELECT FirstName FROM Students WHERE Age < 18; (查找所有学生的名字) |
NOT NULL | 用于指定某列的数据不允许为NULL ,常用于字段约束。 | CREATE TABLE Students (StudentID INT, FirstName VARCHAR(50) NOT NULL); ( FirstName 列不能为空) |
VIEW | 用于创建一个虚拟表,该表包含一个SQL查询的结果集,方便多次查询使用,且不存储实际数据。 | CREATE VIEW StudentAgeView AS SELECT FirstName, Age FROM Students WHERE Age > 18; (创建一个视图 StudentAgeView ,显示所有年龄大于18岁的学生) |
-
LIKE
:- 用于进行模糊匹配查询,可以结合通配符进行更加灵活的查询。
%
代表任意数量的字符,_
代表单个字符。 - 示例:
SELECT * FROM Employees WHERE LastName LIKE 'S%'; -- 查找所有姓氏以'S'开头的员工 SELECT * FROM Employees WHERE FirstName LIKE '_n'; -- 查找所有名字为2个字符且第二个字符为'n'的员工
- 用于进行模糊匹配查询,可以结合通配符进行更加灵活的查询。
-
IN
:- 用于指定一个值是否在给定的列表中,避免了多个
OR
语句的使用,使SQL更简洁。 - 示例:
SELECT * FROM Employees WHERE Department IN ('HR', 'IT', 'Finance'); -- 查找部门为HR、IT或Finance的员工
- 用于指定一个值是否在给定的列表中,避免了多个
-
BETWEEN
:- 用于在一定范围内查找数据,适用于数字、日期等类型。
BETWEEN
包含范围的两端。 - 示例:
SELECT * FROM Products WHERE Price BETWEEN 100 AND 500; -- 查找价格在100到500之间的产品
- 用于在一定范围内查找数据,适用于数字、日期等类型。
-
AS
:- 用于给表或列指定别名,提升可读性。尤其在复杂查询中,别名非常有用。
- 示例:
SELECT Name AS EmployeeName FROM Employees; -- 将列`Name`命名为`EmployeeName`
-
JOIN
:- 用于将两个或多个表的数据按相关联的列进行连接。常见的连接类型有:
INNER JOIN
:返回两个表中满足连接条件的记录。LEFT JOIN
:返回左表的所有记录以及右表中满足条件的记录。如果右表没有匹配记录,返回NULL。RIGHT JOIN
:与LEFT JOIN
相对,返回右表的所有记录以及左表中满足条件的记录。
- 示例:
SELECT Employees.Name, Departments.DepartmentName FROM Employees INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
该查询返回所有员工和他们所在部门的名称。
- 用于将两个或多个表的数据按相关联的列进行连接。常见的连接类型有:
-
UNION
:- 用于合并多个
SELECT
查询的结果,去除重复的记录。如果希望包含重复记录,可以使用UNION ALL
。 - 示例:
SELECT FirstName FROM Employees WHERE Age > 30 UNION SELECT FirstName FROM Employees WHERE Age < 30;
该查询返回所有员工的名字,去除重复。
- 用于合并多个
-
NOT NULL
:- 用于限制列值不能为空,常用于数据表的列约束,确保数据完整性。
- 示例:
CREATE TABLE Employees ( ID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, -- Name列不能为空 Age INT );
-
VIEW
:- 视图是一个虚拟表,基于SELECT查询的结果创建。它没有存储实际数据,但可以像普通表一样进行查询,简化复杂的查询。
- 示例:
CREATE VIEW EmployeeDetails AS SELECT Name, Age, Department FROM Employees WHERE Age > 30;
该视图返回年龄大于30岁的所有员工的详细信息。
四、 常用SQL函数
SQL提供了多种函数,用于执行各种数据处理任务。常用的函数包括聚合函数、字符串处理函数和日期函数。
1. 聚合函数
聚合函数用于对一组值执行计算并返回单一的结果。常见的聚合函数有:
AVG()
:计算某列的平均值。例如,SELECT AVG(Salary) FROM Employees;
会计算所有员工的平均工资。COUNT()
:计算某列或表中的行数(不包含NULL
值)。例如,SELECT COUNT(*) FROM Employees;
计算表中员工的总数。也可以使用COUNT(DISTINCT column)
计算某列中不重复的值的个数。SUM()
:计算某列的总和。例如,SELECT SUM(Salary) FROM Employees;
计算所有员工工资的总和。MAX()
:返回某列的最大值。例如,SELECT MAX(Salary) FROM Employees;
返回员工中最高的工资。MIN()
:返回某列的最小值。例如,SELECT MIN(Salary) FROM Employees;
返回员工中最低的工资。
这些聚合函数通常与GROUP BY
语句结合使用,用于对查询结果进行分组后进行计算。例如,SELECT Department, AVG(Salary) FROM Employees GROUP BY Department;
返回每个部门的平均工资。
2. 字符串处理函数
字符串函数用于对字符串数据进行操作和处理。常见的字符串处理函数有:
CONCAT()
:连接两个或多个字符串。例如,SELECT CONCAT(FirstName, ' ', LastName) AS FullName FROM Employees;
将FirstName
和LastName
合并为FullName
。LENGTH()
:返回字符串的长度(以字符为单位)。例如,SELECT LENGTH(FirstName) FROM Employees;
返回FirstName
列每个值的字符长度。UPPER()
:将字符串转换为大写。例如,SELECT UPPER(FirstName) FROM Employees;
将员工的名字转换为大写字母。LOWER()
:将字符串转换为小写。例如,SELECT LOWER(LastName) FROM Employees;
将员工的姓氏转换为小写字母。TRIM()
:去除字符串两端的空白字符。例如,SELECT TRIM(FirstName) FROM Employees;
去除FirstName
两端的空格。SUBSTRING()
:提取字符串的子字符串。例如,SELECT SUBSTRING(FirstName, 1, 3) FROM Employees;
提取FirstName
列中每个值的前三个字符。REPLACE()
:替换字符串中的子字符串。例如,SELECT REPLACE(FirstName, 'John', 'Mike') FROM Employees;
将名字为 ‘John’ 的员工名字替换为 ‘Mike’。FIND_IN_SET()
:查找字符串是否在逗号分隔的字符串中,返回位置。例如,SELECT FIND_IN_SET('HR', 'HR,IT,Finance') AS DepartmentPosition;
查找 ‘HR’ 在字符串 ‘HR,IT,Finance’ 中的位置。
3. 日期函数
日期函数用于处理日期和时间数据。常见的日期函数有:
NOW()
:返回当前日期和时间(系统时间)。例如,SELECT NOW();
返回当前日期和时间,如2024-12-21 10:30:00
。CURDATE()
:返回当前日期。例如,SELECT CURDATE();
返回当前日期,如2024-12-21
。DATEDIFF()
:计算两个日期之间的天数差异。例如,SELECT DATEDIFF('2024-12-21', '2024-12-01');
计算两个日期之间的天数差异,结果为20天。DATE_ADD()
:向日期添加指定的时间间隔。例如,SELECT DATE_ADD('2024-12-01', INTERVAL 10 DAY);
在2024-12-01
上添加 10 天,结果为2024-12-11
。DATE_SUB()
:从日期中减去指定的时间间隔。例如,SELECT DATE_SUB('2024-12-21', INTERVAL 5 DAY);
从2024-12-21
减去 5 天,结果为2024-12-16
。YEAR()
:返回日期的年份部分。例如,SELECT YEAR('2024-12-21');
返回2024
。MONTH()
:返回日期的月份部分。例如,SELECT MONTH('2024-12-21');
返回12
。DAY()
:返回日期的日部分。例如,SELECT DAY('2024-12-21');
返回21
。WEEKDAY()
:返回日期的星期几(0=星期一,6=星期天)。例如,SELECT WEEKDAY('2024-12-21');
返回5
,表示星期六。