【数据库】SQL语句底子
一、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语句有:
- 事件控制语言(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语句用于删除现有的表及其所有数据。删除表后,该表的结构和其中的数据都将永久丢失。因此,在执行此操作时需要非常小心。
语法:
示例:
此语句将删除名为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;
复制代码 示例:
此语句会删除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;
复制代码 示例:
该语句会删除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的学生的名字和姓氏。
查询所有列:
该语句返回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语句强制数据库立即重新加载权限表,从而立即生效。
语法:
此语句会重新加载权限表,确保所有权限更改立即生效。
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,表示星期六。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |