学好MySQL看完这一篇就够了(建议收藏)

目录

1.MySQL简介:

2.RDBMS 术语:

3.数据类型 :

4.数据库操作

说明:

5.MySQL的约束:

6.存储引擎

7.数据表操作:

1.查看表结构

2.查看建表语句

 3.修改表

8.给表添加数据

9.查询表的所有数据 

10.修改表数据 

11.删除表数据 

 1.使用delete删除

2. 使用truncate清空表数据

12.复制表数据

1. 表B并不存在

(1)将表A的数据和结构复制给(新创建的)表B 

(2)将表A的结构复制给(新创建的)表B

2. 表B已存在

13.导出表数据

14.导入表数据

1.使用LOAD DATA INFILE语句:

2.使用INSERT INTO语句批量插入数据:

15.单表数据查询

1.查询语句的通用结构如下: 

 2.查询字段列表

(1)查询所有字段

(2)查询指定字段 

(3)设置列别名

(4)使用 DISTINCT 关键字去除重复结果行

3.条件查询 

(1)关系运算符:

(2)逻辑运算符:

(3)集合运算符:

(4)范围运算符:

(5)空值运算符:

(6)模糊查询:

4.分组统计筛选

(1)分组 

(2)统计

(3)筛选

5.排序

6.限制查询结果行数

16.多表连接查询 

1.内连接(INNER JOIN):

2.左连接(LEFT JOIN):

3.右连接(RIGHT JOIN):

4.全连接(FULL JOIN):

5.交叉连接(Cross Join):

17.高级查询(子查询)

1.概念和用法

2.批量比较子查询

3.使用exisits进行子查询

4. 对于2个查询结果集的合并

18.正则表达式

19.SQL 注入 


1.MySQL简介:

MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典公司MySQL AB开发并维护,后来被Oracle Corporation收购。MySQL以其卓越的性能、稳定性和易用性而闻名,并广泛应用于各种应用程序和网站开发。

以下是MySQL的一些特点和功能:

 1.关系型数据库:MySQL是一种关系型数据库,它采用表格的形式组织数据,通过定义表格之间的关系来管理数据。

 2.SQL支持:MySQL遵循SQL(结构化查询语言)标准,并提供了丰富的SQL语法和功能,方便用户进行数据的查询、插入、更新和删除操作。

 3.多平台支持:MySQL可运行在多个操作系统上,包括Windows、Linux、macOS等,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。具有良好的跨平台兼容性。

 4.高性能:MySQL经过优化,能够快速响应查询请求和事务处理,具有较低的延迟和高吞吐量。

 5.可扩展性:MySQL能够处理大规模数据存储和处理需求,支持高并发访问和复杂的查询操作。

 6.数据安全和权限控制:MySQL提供了数据的安全保护机制,包括用户身份验证、权限管理和数据加密等功能,以确保数据的机密性和完整性。

 7.数据复制和高可用性:MySQL支持数据的复制和主从架构,可以实现数据备份和故障恢复,提高系统的可用性和容错能力。

 8.良好的社区支持:作为开源软件,MySQL拥有一个庞大的用户和开发者社区,提供了丰富的文档、示例和技术支持。

2.RDBMS 术语:

在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

3.数据类型 :

4.数据库操作

1:先创建一个数据库,以便后面建表建行建列

-- 1,删除数据库
	drop database if exists 数据库名;
-- 2,创建数据库
	create database 数据库名;
-- 3,修改数据库编码方式和字符集排列顺序
	alter database 数据库名 character set utf8 collate utf8_bin;
-- 4,使用数据库
	use 数据库名;
-- 5,查看当前所有数据库
	show databases;

2: 创建数据表

语法:create table 数据表名(
		列名1   数据类型  [列级约束],
		列名2   数据类型  [列级约束],
		.......
		列名n   数据类型  [列级约束]
		[, 表级约束1[,......,  表级约束n]]
	           )[存储引擎]

说明:

     []号括起来的部分是可选项,实际代码中不用写[]
    (1)列名符合规范(英文字母,数字,下划线等),有意义,
    (2)一张表中没有两个同名列,  列名不能和系统关键字(蓝色显示)重名
    (3)必须给每个列设置合适的数据类型
    (4)约束是限制每列存放的数据是否科学,无重复等
    可以在列后面设置列级约束,也可以所有列写完后,统一设置表级约束
    还可以不写约束,直接建表,后期通过修改表来设置相关的列约束

5.MySQL的约束:

1.主键约束(primary key):一张数据表只能由一个主键,主键可以是一列(单列主键),也可以是多列(联合主键),设置为主键的列,取值唯一,非空(必须要有数据),通常将编号等取值没有重复的列设置主键。

语法格式:

情况1:设置单列主键:直接在列后写primary key
CREATE TABLE table_name (
    column1 datatype PRIMARY KEY,
    column2 datatype,
    ...
);
情况2:设置多列主键,在所有列的后方写主键
CREATE TABLE table_name (
    column1 data_type,
    column2 data_type,
    ...
    PRIMARY KEY (column1, column2, ...)
);

2.(索引)唯一约束(unique):一张表可以设置多个唯一约束列,设置了唯一约束的列,同时会创建一个唯一索引,唯一约束的列,取值唯一的,确保列中的数据不重复,可以有空值。

语法格式:

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
    UNIQUE (column1, column2, ...)
);

3. (标识列)自动增长列(auto_increament):是一种特殊的约束,用于在插入新记录时自动生成唯一的递增值。自动增长列通常被用作主键,每个表只能有一个自动增长列,自动增长列的数据类型通常为整数型(如INT、BIGINT等)。

语法格式:

CREATE TABLE table_name (
    column_name data_type AUTO_INCREMENT,
    ...
    PRIMARY KEY (column_name)
);

4. 非空约束(not null):在添加数据时,确保列中的值不为空。

语法格式:

CREATE TABLE table_name (
    column1 datatype NOT NULL,
    ...
);

5. 默认值约束(default):在列中设置默认值,当未指定值时将使用该默认值。

语法格式:

CREATE TABLE table_name (
    column1 datatype DEFAULT default_value,
    ...
);

 6.检查约束(check):通过给列设置检查表达式,来验证该列输入的数据是否合法有效。

语法格式:

CREATE TABLE table_name (
    column1 datatype,
    ...
    CHECK (condition)
);

7.外键(foreign key)参考references:在关系型数据库中用于建立两个及以上的表之间关联的约束。通过外键,可以将两个及以上的表进行连接,并确保数据的完整性和一致性。

语法格式:

CREATE TABLE table_name1 (
    column1 data_type,
    column2 data_type,
    ...
    FOREIGN KEY (column1, column2, ...)
    REFERENCES table_name2 (ref_column1, ref_column2, ...)
    ON DELETE action
    ON UPDATE action
);

6.存储引擎

MySQL是一种开源的关系型数据库管理系统,它支持多种存储引擎以满足不同的数据处理需求。以下是MySQL中常用的几种存储引擎:

MyISAM:这是MySQL默认的存储引擎,在早期版本中使用较多。它提供了快速的插入和查询速度,但不支持事务和崩溃恢复功能。

InnoDB:这是MySQL最常用的存储引擎之一,它提供了对ACID(原子性、一致性、隔离性和持久性)事务的支持,并且支持行级锁定、多版本并发控制等高级功能。

MEMORY:也称为HEAP,将数据存储在内存中,具有非常高的读取和写入速度。但是,它只适合存储临时数据,因为数据库重新启动后数据将丢失。

NDB Cluster:这是MySQL的集群存储引擎,可以将数据分布在多台计算机上,实现高可用性和负载均衡。它支持事务和并行查询,适用于大规模应用和高并发访问。

除了以上列举的存储引擎外,MySQL还有其他一些存储引擎,如Archive、CSV、Blackhole等。每个存储引擎都有其自身的特点和适用场景,选择合适的存储引擎可以根据具体的业务需求来决定。

7.数据表操作:

1.查看表结构

使用DESCRIBE语句查看表结构:该语句将返回包含表列信息的结果集,包括列名、数据类型、主键信息等。说明:查看当前数据库不需要写数据库名 

语法格式:

DESCRIBE 数据表名;
DESCRIBE 数据库名.数据表名;
desc 数据库名.数据表名

2.查看建表语句

使用SHOW CREATE TABLE语句查看建表语句: 该语句将返回一个包含建表语句的结果集,其中包括完整的CREATE TABLE语句,可显示表的结构以及约束、索引等详细信息。说明:查看当前数据库不需要写数据库名。 

语法格式:

SHOW CREATE TABLE 数据表名;

 3.修改表

  1. 修改表名: 使用 ALTER TABLE 语句,通过 RENAME 子句将旧表名改为新表名。
    语法格式:

    ALTER TABLE 表名
    RENAME 新表名;
  2. 修改字段的数据类型: 使用 ALTER TABLE 语句,通过 MODIFY 子句修改指定表中字段的数据类型。
    语法格式:

    ALTER TABLE 表名
    MODIFY 列名 新数据类型;
    
  3. 修改字段名和数据类型: 使用 ALTER TABLE 语句,通过 CHANGE 子句修改指定表中字段的名称和数据类型。
    语法格式:

    ALTER TABLE 表名
    CHANGE 旧列名 新列名 新数据类型;
  4. 添加字段:

    • 最后一列:使用 ALTER TABLE 语句,通过 ADD 子句在已存在的表末尾添加新字段。
      语法格式:
      alter table 数据库名.数据表名 add 新字段名 数据类型
    • 第一列:使用 ALTER TABLE 语句,通过 ADD 子句在已存在的表首部添加新字段。
      语法格式:
      alter table 数据库名.数据表名 add 新字段名 数据类型 first
    • 指定列后:使用 ALTER TABLE 语句,通过 ADD 子句在已存在的表中某个字段之后添加新字段。
      语法格式:
      alter table 数据库名.数据表名 add 新字段名 数据类型 after 现有字段名
  5. 删除字段: 使用 ALTER TABLE 语句,通过 DROP 子句删除指定表中的字段。注意一次只能删除一个字段。
    语法格式:

    ALTER TABLE 表名
    DROP 列名;
  6. 修改字段顺序:

    • 将字段置于首列:使用 ALTER TABLE 语句,通过 MODIFY 子句将指定字段移至表的首列。
      语法格式:
      ALTER TABLE 表名
      MODIFY 列名 列定义 FIRST;
    • 将字段置于某一指定列后:使用 ALTER TABLE 语句,通过 MODIFY 子句将指定字段移至某一指定列之后。
      语法格式:
      ALTER TABLE 表名
      MODIFY 列名 列定义 AFTER 某一列名;
  7. 修改表的存储引擎: 使用 ALTER TABLE 语句,通过 engine 子句修改指定表的存储引擎。
    语法格式:

    ALTER TABLE 表名
    ENGINE = 新存储引擎;
  8. 修改表的约束:

    • 添加约束:使用 ALTER TABLE 语句,通过 ADD CONSTRAINT 子句为已存在的表添加约束。
      语法格式:
      ALTER TABLE 表名
      ADD CONSTRAINT 约束名 约束条件;
      
    • 删除约束:使用 ALTER TABLE 语句,通过 DROP CONSTRAINT 子句删除已存在表中的约束。
      语法格式:
      ALTER TABLE 表名
      DROP CONSTRAINT 约束名;
      

8.给表添加数据

1.一次添加一条数据
要一次添加一条数据到MySQL表中,您可以使用INSERT INTO VALUES语句的简化形式。
以下是基本语法:

INSERT INTO 表名 VALUES (值1, 值2, 值3, ...);

2.一次添加多条数据 
要一次添加多条数据到MySQL表中,可以使用INSERT语句的单行插入形式。
以下是基本语法:

INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);

9.查询表的所有数据 

1.要查询MySQL表中的所有数据,您可以使用SELECT语句。以下是基本语法:

SELECT * FROM 表名;

2."*"表示选择所有列。如果您只想选择特定的列,可以指定列名,用逗号分隔: 

SELECT 列1, 列2, 列3, ... FROM 表名;

10.修改表数据 

要修改MySQL表中的数据,可以使用UPDATE语句。以下是基本语法: 

UPDATE 表名 SET 列1=值1, 列2=值2, ... WHERE 条件;

说明:
        修改表数据不能违反相关约束(主键,外键,非空,检查)
        可以修改一个字段或者多个字段的值(多个字段之间用逗号隔开)
        如果没有加上where条件,默认修改该列所有行的数据
        如果加上where条件,修改符合条件的该列部分数据行数据
    where 条件
        在修改,删除和查询中经常使用
        条件表达式可以是关系表达式,或者是逻辑表达式
        关系运算符:>,>=,<,<=,=,!=,<>
        逻辑运算符:逻辑与and,逻辑或 or ,逻辑非 not

11.删除表数据 

 1.使用delete删除

要删除MySQL表中的数据,可以使用DELETE语句。(没有加where条件,默认删除整张表数据,加上where条件,删除满足条件的数据行,如果主表数据被从表正在引用,无法直接删除(先删除从表对应数据),后期可以通过给表设置触发器,自动删除关联表数据,如果主表数据没有被从表引用,可以直接delete删除,对于自增列,delete删除不会清空编号(后面添加的数据还是按照以前的编号赋值))以下是基本语法: 

DELETE FROM 表名 WHERE 条件;

2. 使用truncate清空表数据

TRUNCATE TABLE语句可以用于清空MySQL表中的数据。它会快速删除表中的所有行,并且不会回滚事务日志,因此比DELETE语句更高效。(对于有外键引用的主表,无法使用truncate清除数据,哪怕从表没有任何数据,只能先修改从表删除外键再truncate) 以下是TRUNCATE TABLE语句的基本语法:

TRUNCATE TABLE 表名;

12.复制表数据

 在数据库内部进行复制,如何将表A的数据复制给表B?主要有两种情况

1. 表B并不存在

(1)将表A的数据和结构复制给(新创建的)表B 

使用CREATE TABLE语句创建一个新表B,并将数据和结构从表A复制到表B。注意,该方法不会复制主键、外键和自增属性。 
基本语法:

CREATE TABLE 新表B SELECT * FROM 表A

(2)将表A的结构复制给(新创建的)表B

这条SQL语句将会在数据库中创建一个新表B,并复制表A的结构,但不包含任何数据。如果表A存在并具有所需的结构信息,执行该语句后,新表B将与表A具有相同的列定义、数据类型和约束。

 基本语法:

CREATE TABLE 表B SELECT * FROM 表A WHERE 1=0;

2. 表B已存在

目标表B的结构与表A一致(或者多几个允许为空值的列), 将表A的数据复制给表B 。

  基本语法:

INSERT INTO 表B SELECT * FROM 表A;

13.导出表数据

可以使用以下SQL语句将数据表导出为外部文件:

SELECT * FROM 数据表名 INTO OUTFILE '文件路径';

 注意,导出文件的路径取决于您的数据库设置。您可以通过执行以下语句查看变量 secure_file_priv 的值,该值确定了允许导出文件的路径范围:

SHOW VARIABLES LIKE '%secure%';

如果 secure_file_priv 的值为空,您可以在任意路径下导出文件。但如果值包含特定路径,则只能将文件导出到该路径下的文件夹中。

注意: 导出成excel文件可能打开为乱码(MYSQL格式utf8 , excel默认格式为GBK)
例如,将学生信息表 t_stuinfo 的数据导出为外部文件,您可以使用以下语句:

SELECT * FROM t_stuinfo INTO OUTFILE 'D:/1.txt';
SELECT * FROM t_stuinfo INTO OUTFILE 'D:/2.html';
SELECT * FROM t_stuinfo INTO OUTFILE 'D:/3.xls';

14.导入表数据

要将数据导入到表中,您可以使用MySQL提供的几种方法。以下是两种常用的方法:

1.使用LOAD DATA INFILE语句:

1.在您的MySQL客户端中,使用以下语法导入数据:

LOAD DATA INFILE '路径/文件名' INTO TABLE 表名 [选项];

2.替换'路径/文件名'为包含要导入数据的文件的实际路径和文件名。
3.将'TABLE_NAME'替换为目标表的实际名称。
还可以指定其他选项,例如字段分隔符、行终止符等。可以根据需要进行调整。

2.使用INSERT INTO语句批量插入数据:

1.准备一个文本文件,其中每一行代表要插入的一条数据。每个值应使用逗号或制表符分隔。
2.将该文件保存在MySQL服务器上(例如,/tmp/data.txt)。
3.在您的MySQL客户端中,使用以下语法导入数据:

INSERT INTO 表名 (列1, 列2, ...) VALUES
(数据行1的列1值, 数据行1的列2值, ...),
(数据行2的列1值, 数据行2的列2值, ...),
...
;

4.将'TABLE_NAME'替换为目标表的实际名称。
5.列举括号内的列和数据行中的值与您的表结构和数据对应。

     无论使用哪种方法,请确保具有足够的权限来执行这些操作,并且数据文件的格式与目标表的结构匹配。

15.单表数据查询

1.查询语句的通用结构如下: 

SELECT [all | distinct] * 或字段列表
FROM 表名1 [, 表名2, ... 表名n]
[WHERE 条件表达式]
[GROUP BY 分组字段列表 [HAVING 条件表达式]]
[ORDER BY 排序字段列表 [ASC | DESC]]
[LIMIT [起始行,] 行数]

其中,各部分的含义:

  • SELECT:选择要查询和返回的列名,可以使用 "*" 表示选择所有列,或者提供具体的字段列表。
  • FROM:指定要查询的数据表名,可以同时指定多个表,并用逗号分隔。
  • WHERE:可选参数,用于添加条件表达式来过滤数据,只返回符合条件的数据。
  • GROUP BY:可选参数,用于对结果进行分组,需要指定要分组的字段列表。
  • HAVING:可选参数,在使用 GROUP BY 后,可以在 HAVING 子句中添加条件表达式来进一步筛选分组结果。
  • ORDER BY:可选参数,用于对结果进行排序,默认为升序排列,也可以使用 "DESC" 关键字表示降序排列。
  • LIMIT:可选参数,用于限制返回结果的行数。可以指定起始行和要返回的行数,也可以只指定要返回的行数。

 2.查询字段列表

(1)查询所有字段

SELECT * FROM 表名;

(2)查询指定字段 

SELECT 列1, 列2, ...
FROM 表名;

(3)设置列别名

可以使用两种方式来设置列别名:列名 别名 或者 列名 AS 别名。 

例如,查看学生信息表的姓名、性别和生日,并设置别名:

SELECT sname 姓名, ssex 性别, sbirthday 生日
FROM student;

或者:

SELECT sname AS 姓名, ssex AS 性别, sbirthday AS 生日
FROM student;

(4)使用 DISTINCT 关键字去除重复结果行

例如,查看学生信息表的班级和性别,并去除重复结果: 

SELECT DISTINCT ssex 性别, sclass 班级
FROM student;

或者,查看学生信息表的性别,并去除重复结果:

SELECT DISTINCT ssex 性别
FROM student;

3.条件查询 

(1)关系运算符:

关系运算符:>,>=,<,<=,=,!=,<> 

代码格式:

SELECT * FROM 表名 WHERE 字段名 运算符 值;

(2)逻辑运算符:

逻辑与and,逻辑或 or ,逻辑非 not  

代码格式:

SELECT * FROM 表名 WHERE 条件1 运算符 条件2 AND/OR/NOT 条件3;

(3)集合运算符:

in和not in
判断某个字段的取值是否在某个范围,范围包含值A和值B,将较小的值A写在前面(否则查询不到数据)。
代码格式:

SELECT * FROM 表名 WHERE 字段名 IN(值1, 值2, 值3) 或 NOT IN(值1, 值2, 值3);

(4)范围运算符:

between ... and...
代码格式:

SELECT * FROM 表名 WHERE 字段名 BETWEEN 值A AND 值B;

(5)空值运算符:

is null和is not null
        字段取值为空: 字段 is null
        字段取值不为空:字段 is not null
代码格式:

SELECT * FROM 表名 WHERE 字段名 IS NULL 或 IS NOT NULL;

(6)模糊查询:

like和not like
常用的通配符:
            %    匹配任意长度(0-n)的字符
            _    匹配一个长度的字符
代码格式:

SELECT * FROM 表名 WHERE 字段名 LIKE '关键信息和通配符';

4.分组统计筛选

(1)分组 

SELECT 查询字段列表 FROM 表名 GROUP BY 分组字段列表;

注意:

  • 分组字段可以是一个字段,也可以是多个字段。
  • 当使用多个字段进行分组时,首先按照第一个字段的取值进行分组,然后在每个分组内再按照第二个字段进行分组。

示例 :-- 统计男女生的人数和名字

SELECT ssex 性别, COUNT(*) 人数,GROUP_CONCAT(sname) 姓名
FROM student GROUP BY ssex WITH ROLLUP;	

(2)统计

根据分组字段的取值,对某列的多行结果进行统计汇总。常用的聚合函数有:

  • COUNT(字段名或*):统计行数,如果指定字段名,则统计该字段非空值的行数;如果使用"*",则统计所有行数。
  • SUM(字段名):求和,该字段必须是数值类型,不统计空值。
  • AVG(字段名):平均数,该字段必须是数值类型,不统计空值。
  • MAX(字段名):最大值,不统计空值。
  • MIN(字段名):最小值,不统计空值。

示例 :-- 统计成绩表每个同学选修的科目数,总分,平均分,最高分,最低分

SELECT sid,COUNT(*),SUM(score),AVG(score),MAX(score),MIN(score)
FROM sc GROUP BY sid;

(3)筛选

使用HAVING条件表达式对分组统计后的结果进行筛选,需要与GROUP BY一起使用。HAVING后的字段表达式只能包含聚合函数列或分组字段。HAVING与WHERE的区别如下:

  • 相同点:都是用于数据筛选,如果仅对分组字段筛选,则结果相同。
  • 区别:
    • 位置不同:WHERE是在分组前对数据进行筛选,HAVING是在分组后对数据进行筛选。
    • 字段表达式不同:WHERE条件中不允许使用聚合函数列,而HAVING条件中只能使用聚合函数列或分组字段。
    • 使用限制:WHERE可以单独使用,但HAVING必须与GROUP BY结合使用。

 示例 :-- 统计成绩表每个同学选修的科目数,总分,平均分,最高分,最低分,只显示学号为10101001和10101002的统计信息

//HAVING条件表达式
SELECT sid,COUNT(*),SUM(score),AVG(score),MAX(score),MIN(score)
FROM sc GROUP BY sid HAVING sid IN('10101001','10101002');
//WHERE条件表达式
SELECT sid,COUNT(*),SUM(score),AVG(score),MAX(score),MIN(score)
FROM sc  WHERE sid IN('10101001','10101002') GROUP BY sid;

5.排序

在MySQL中,可以使用"ORDER BY"语句对数据行进行重新排列顺序。该语句按照指定字段的取值对数据行进行排序,默认情况下,MySQL会按照主键列的取值进行排序。

下面是"ORDER BY"的语法:

SELECT 查询字段列表 FROM 表名 ORDER BY 排序字段列表 [ASC|DESC];

解释一下各个部分:

  • SELECT 查询字段列表:指定你希望查询的字段列表。
  • FROM 表名:指定你要查询的表名。
  • ORDER BY 排序字段列表:指定你想要按照哪些字段进行排序。可以是一个或多个字段名,以逗号分隔。如果是多个字段,MySQL先按照第一个字段的取值排序,如果相同,则按照第二个字段的取值排序,依此类推。
  • ASC|DESC:可选参数,用于指定排序的顺序。默认为升序(ASC),也可以选择降序(DESC)。

以下是一些示例:

  • 按照一个字段进行升序排序:
    SELECT * FROM 表名 ORDER BY 字段名 ASC;
    
  • 按照多个字段进行排序,首先按字段1升序排序,然后按字段2降序排序:
    SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段2 DESC;
    

6.限制查询结果行数

可以使用"LIMIT"语句来限制查询结果的行数。下面是"LIMIT"的语法格式:

SELECT 查询字段列表 FROM 表名 [WHERE 条件] ORDER BY 排序字段列表 LIMIT [起始行,] n;

解释一下各个部分:

  • SELECT 查询字段列表:指定你希望查询的字段列表。
  • FROM 表名:指定你要查询的表名。
  • WHERE 条件(可选):用于指定查询的条件,如果需要筛选特定的数据行。
  • ORDER BY 排序字段列表:用于指定排序的字段列表。
  • LIMIT [起始行,] n:用于限制查询结果的行数。默认情况下从第一行开始的前n行;如果设置了起始行,则从该行后开始查询n行。

 示例:统计每个同学选修的科目数、总分、平均分、最高分、最低分,并按照平均分排序,取平均分数最高的前3名:

SELECT sid, COUNT(*), SUM(score), AVG(score), MAX(score), MIN(score)
FROM 表名 GROUP BY sid ORDER BY AVG(score) DESC LIMIT 3;

统计每个科目选修的学生人数、总分、平均分、最高分、最低分:

SELECT cid, COUNT(*), SUM(score), AVG(score), MAX(score), MIN(score)
FROM 表名 GROUP BY cid;

16.多表连接查询 

多表连接查询是一种在多个表之间建立关联关系并检索相关数据的查询操作。常见的多表连接类型包括内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)、交叉连接(Cross Join)和全连接(FULL JOIN)。以下是每种连接类型的简要说明:

1.内连接(INNER JOIN):

只返回两个表之间满足连接条件的匹配行。 

SELECT 列列表
FROM 表1
INNER JOIN 表2 ON 连接条件;

2.左连接(LEFT JOIN):

返回左表中所有行以及与其匹配的右表行。 

SELECT 列列表
FROM 表1
LEFT JOIN 表2 ON 连接条件;

3.右连接(RIGHT JOIN):

返回右表中所有行以及与其匹配的左表行。 

SELECT 列列表
FROM 表1
RIGHT JOIN 表2 ON 连接条件;

4.全连接(FULL JOIN):

返回左表和右表中的所有行,如果没有匹配的行则填充 NULL 值。  

SELECT 列列表
FROM 表1
FULL JOIN 表2 ON 连接条件;

5.交叉连接(Cross Join):

 返回表左和表右的所有可能的组合,结果集包含表左的每一行和表右的每一行的笛卡尔积。 

笛卡尔乘积:两个矩阵(A和B)相乘的结果
        行数=A的行数*B的行数
        列数=A的列数+B的列数 

SELECT *
FROM 表1
CROSS JOIN 表2;

17.高级查询(子查询)

1.概念和用法

子查询是指将一个SELECT查询语句嵌套在另一个查询中的查询方式。它可以作为父查询的WHERE条件的一部分,也可以作为临时表与其他表进行连接操作,还可以作为主查询的列来使用。

子查询的执行顺序是先执行内部查询,再执行外部查询。子查询应用非常灵活,可以简化复杂查询需求,特别适用于查询字段属于单个表或涉及多个表的情况。

常见的子查询应用场景包括:

  1. 子查询的结果作为父查询的WHERE条件的一部分。
  2. 子查询作为临时表(表别名),和其他表做多表连接。
  3. 子查询作为SELECT查询的某一列。

子查询的结果如果只有一个值,可以使用等号(=)进行匹配;如果有多个值,推荐使用IN关键字进行匹配。需要注意的是,在使用子查询时要确保子查询的语法正确,并且满足数据库表之间的相关条件,以获得准确的查询结果。
语法结构:

SELECT 字段1, 字段2, ...
FROM 表1
WHERE 字段1 IN (SELECT 字段1 FROM 表2 WHERE 条件);

2.批量比较子查询

注意:some、any表示某个集合的数据和另外集合的数据比较时,满足其中一个条件就可以了;all表示某集合的数据和另外集合的数据比较时,需要满足所有条件。
 示例:-- 查询c001课程中,分数比c002中任意一个高的分数

SELECT * FROM sc WHERE cid='c001' AND score > SOME
		(SELECT score FROM sc WHERE cid='c002');

SELECT * FROM sc WHERE cid='c001' AND score > ANY
		(SELECT score FROM sc WHERE cid='c002');

3.使用exisits进行子查询

语法:父查询语句 WHERE EXISTS 子查询。如果子查询有结果(行数不为0),返回true,开始父查询;如果子查询没有结果(行数为0),返回false,不进行父查询。exists子查询只返回布尔类型,不返回具体的查询结果。适合在不需要返回具体结果的情况下使用。 

4. 对于2个查询结果集的合并

1. 使用UNION进行合并去重:将查询1和查询2的结果合并到一个集合中,并删除重复行数据。

SELECT 查询1 UNION SELECT 查询2

2.使用UNION ALL进行合并保留重复行:将查询1和查询2的结果合并到一个集合中,并保留重复行数据。

SELECT 查询1 UNION ALL SELECT 查询2

18.正则表达式

MySQL支持正则表达式的操作符有两个,分别是REGEXP和RLIKE。它们可以用来在查询语句中进行模式匹配。

  • REGEXP:用于匹配符合正则表达式的值。
  • RLIKE:与REGEXP功能相同,用于匹配符合正则表达式的值。

在MySQL中,可以使用REGEXP操作符进行正则表达式匹配。以下是一些常见的正则表达式模式:

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

以下是几个在MySQL中使用REGEXP操作符进行正则表达式匹配的示例:
1.查找所有以字母"A"开头的名字:

SELECT name FROM person_tbl WHERE name REGEXP '^A';

2.查找所有以数字结尾的邮箱地址:

SELECT email FROM person_tbl WHERE email REGEXP '[0-9]$';

3.查找所有包含连续三个重复字符的字符串:

SELECT text FROM data_tbl WHERE text REGEXP '(.)\\1\\1';

4.查找所有以大写字母开头、后跟5个数字的用户名:

SELECT username FROM user_tbl WHERE username REGEXP '^[A-Z][0-9]{5}$';

19.SQL 注入 

MySQL是一种流行的关系型数据库管理系统,用于存储和管理结构化数据。SQL(Structured Query Language)是用于与数据库进行交互的标准查询语言。

SQL注入是一种常见的安全漏洞,它发生在应用程序未正确过滤用户提供的输入并将其直接插入到SQL查询中的情况下。攻击者可以利用这种漏洞执行恶意的SQL语句,并可能获取、修改或删除数据库中的数据。

为了防止SQL注入攻击,以下是一些最佳实践:

1.使用参数化查询(Prepared Statements):使用参数化查询可以让数据库引擎将用户输入作为数据而不是代码来处理,从而避免注入攻击。
示例(使用预编译语句):

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();

2.输入验证和过滤:在接受用户输入之前,对输入数据进行验证和过滤。确保只允许符合预期格式和类型的数据进入数据库查询。

3.实施最小特权原则:尽量使用具有最小权限的数据库账户连接到数据库,并限制应用程序所需的操作的权限。

4.避免动态拼接SQL查询:不要直接将用户输入与SQL查询拼接,而是使用参数化查询或数据库框架提供的安全方式。
示例(避免动态拼接):

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->bindParam(':username', $username);
$stmt->execute();

5.定期更新数据库和服务器软件:将数据库和服务器软件保持最新版本以获得最新的安全修复和增强功能。
这些措施可以大大降低SQL注入攻击的风险,并提高应用程序的安全性。

猜你喜欢

转载自blog.csdn.net/m0_74293254/article/details/131534386