当前位置: 首页 > article >正文

【数据库】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本身在大多数数据库系统中是不区分大小写的,特别是在关键字和函数名称方面。例如,SELECTselectSeLeCt都可以视为相同的。尽管如此,表名、列名以及其他标识符(如数据库名)是否区分大小写取决于所使用的数据库系统和其配置。例如:

  • 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语句的基本结构通常包括:

  1. 关键字:例如SELECTFROMWHEREINSERT INTO等。
  2. 标识符:如表名、列名、数据库名等。
  3. 运算符和表达式:如+-*/等数学运算符,以及条件表达式。
  4. 条件子句:如WHEREHAVINGANDOR等。

二、 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:列的数据类型(如INTVARCHARDATE等)。
  • constraint:约束(如PRIMARY KEYNOT NULLUNIQUE等),用于限制列的值或表的完整性。

示例:

CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Age INT,
    Email VARCHAR(100) UNIQUE NOT NULL
);

此语句创建一个名为Students的表,包含四个列:StudentID(主键)、FirstNameLastNameAgeEmail。其中,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的列。

  • 修改列:MODIFYCHANGE

    用于修改列的数据类型或约束。具体语法和使用方法会根据不同的数据库系统略有不同。

    语法(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用于筛选查询结果,指定一个或多个条件。ANDOR用于连接多个条件,进行更复杂的筛选。

语法:

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 USERDROP USERGRANTREVOKE

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:要授予的权限类型(如SELECTINSERTUPDATE等)。
    • 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

当使用GRANTREVOKE修改用户权限时,修改的权限会在下次用户连接时生效。在某些情况下,可以使用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 JOINLEFT JOIN等)。SELECT Students.FirstName, Courses.CourseName FROM Students INNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentID;
(查找学生和他们选修的课程)
UNION用于合并多个SELECT语句的结果集。默认情况下,UNION去除重复的记录。如果想保留所有记录,可以使用UNION ALLSELECT 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岁的学生)
  1. LIKE

    • 用于进行模糊匹配查询,可以结合通配符进行更加灵活的查询。%代表任意数量的字符,_代表单个字符。
    • 示例:
     SELECT * FROM Employees WHERE LastName LIKE 'S%';  -- 查找所有姓氏以'S'开头的员工
     SELECT * FROM Employees WHERE FirstName LIKE '_n';  -- 查找所有名字为2个字符且第二个字符为'n'的员工
    
  2. IN

    • 用于指定一个值是否在给定的列表中,避免了多个OR语句的使用,使SQL更简洁。
    • 示例:
     SELECT * FROM Employees WHERE Department IN ('HR', 'IT', 'Finance');  -- 查找部门为HR、IT或Finance的员工
    
  3. BETWEEN

    • 用于在一定范围内查找数据,适用于数字、日期等类型。BETWEEN包含范围的两端。
    • 示例:
     SELECT * FROM Products WHERE Price BETWEEN 100 AND 500;  -- 查找价格在100到500之间的产品
    
  4. AS

    • 用于给表或列指定别名,提升可读性。尤其在复杂查询中,别名非常有用。
    • 示例:
     SELECT Name AS EmployeeName FROM Employees;  -- 将列`Name`命名为`EmployeeName`
    
  5. 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;
    

    该查询返回所有员工和他们所在部门的名称。

  6. UNION

    • 用于合并多个SELECT查询的结果,去除重复的记录。如果希望包含重复记录,可以使用UNION ALL
    • 示例:
     SELECT FirstName FROM Employees WHERE Age > 30
     UNION
     SELECT FirstName FROM Employees WHERE Age < 30;
    

    该查询返回所有员工的名字,去除重复。

  7. NOT NULL

    • 用于限制列值不能为空,常用于数据表的列约束,确保数据完整性。
    • 示例:
     CREATE TABLE Employees (
         ID INT PRIMARY KEY,
         Name VARCHAR(50) NOT NULL,  -- Name列不能为空
         Age INT
     );
    
  8. 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;FirstNameLastName 合并为 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,表示星期六。


http://www.kler.cn/a/446868.html

相关文章:

  • 在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题
  • Qt之串口设计-线程实现(十二)
  • BenchmarkSQL使用教程
  • 轻松上手:使用 Vercel 部署 HTML 页面教程
  • App自动化之dom结构和元素定位方式(包含滑动列表定位)
  • 计算机工作流程
  • Java中正则表达式的介绍、使用场景及示例代码
  • Java学习,输出数组元素
  • 31.设计模式
  • Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
  • Java基础面试题17:GenericServlet和HttpServlet有什么区别?
  • 【Java】mac安装Java17(JDK17)
  • 前端数据持久化指南:LocalStorage、SessionStorage 等的区别与应用
  • 从零用java实现 小红书 springboot vue uniapp (4)个人主页优化
  • 首个!艾灵参编的工业边缘计算国家标准正式发布
  • Epic游戏使用mod
  • MySQL通过日志恢复数据的步骤
  • Java中的方法重写:深入解析与最佳实践
  • debian linux 连网自动调整时间 (报错 Unit systemd-timesyncd.service could not be found.)
  • .NET周刊【12月第2期 2024-12-08】
  • pytorch离线安装步骤
  • 中阳动态分散投资策略:构建多元化投资组合的科学路径
  • 前端引入字体文件
  • 点云空洞的边界识别提取 pso-bp 神经网络的模型来修复点云空洞 附python代码
  • DataFrame to list(pandas框架转列表)
  • MySQL三大日志-Binlog