项目代码第8讲【数据库基础知识】:SQL(DDL、DML、DQL、DCL);函数(聚合、字符串、数值、日期、流程);约束;多表查询;事务

黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili

一、数据库相关概念

1、主流的关系型数据库都支持SQL语言——SQL语言可以操作所有的关系型数据库

        像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的关系型数据库系统都支持SQL,并将其作为主要的查询和数据操作语言。这些系统实现了SQL标准的大部分功能,但也添加了各自的扩展和特性。

        基础的SELECT、INSERT、UPDATE、DELETE等操作在大多数情况下是兼容的,但在涉及更复杂的查询或需要利用特定数据库特性的场合时,就需要针对具体数据库调整SQL代码了。【比如二、3、6>分页查询,不同关系型数据库用的不一样】

2、什么是 关系型数据库(RDBMS)?

反之,则称之为“非关系型数据库”。

二、SQL语句的分类——DDL、DML、DQL、DCL

下图中,注意SQL语句不区分大小写,关键字建议使用大写

        当使用引号时,使用单引号。

1、DDL

1>数据库操作

 上图中,“查询当前数据库”是结合“使用”的。“查询当前数据库”——就是看当前处于哪个数据库。

2>表操作——针对表+字段(即列名)

下图中,在对某个数据库进行操作时,要先通过上图的“使用”命令进入该数据库。

 

1》数据类型【略】:数值类型、字符串类型、日期时间类型
2》针对表——添加&修改&删除

下图中,TRUNCATE是只留下了表的结构,里面的数据都没有了

3》针对每个字段——添加&修改&删除

2、DML:对表中内容的增(INSERT)删(DELETE)改(UPDATE)

1>选择MySQL图形化界面

下载DataGrip,其功能比前两种都要强大。

DataGrip的基本操作,见下述链接:

11. 基础-SQL-图形化界面工具DataGrip_哔哩哔哩_bilibili

2>增(INSERT)——插入指定字段/全部字段;批量添加数据

        下图中,引号是单引号。

3>改(UPDATE)

4>删(DELETE)

3、DQL:查询表中内容(SELECT);及其执行顺序!

下图中,讲解分组查询前需要先讲聚合函数

验证上图右边的执行顺序:

先执行FROM:如下图,在FROM后给表加别名,发现其它地方都可以用

WHERE在SELECT之前:如下图,在SELECT后面给e.age取别名eage,想在WHERE后面使用eage却报错。证明WHERE的执行顺序在SELECT之前!

SELECT在ORDER BY之前:如下图,在SELECT后面给e.age取别名eage,可以在ORDER BY后面使用eage。

1>基本查询

2>条件查询(WHERE)

注意区别OR和IN,如下图:

上图中红色字体部分“不能省略!”,解释如下图:

3>聚合函数【讲“分组查询”前得先讲聚合函数】:是作用于某一列的,注意NULL值不参与所有聚合函数运算

比如select count(*) from emp; 答案=16,即一共有16行数据。

然而,如果select count(idcard) from emp; 如果idcard有一行的数据为null,那么答案=15。【NULL值不参与所有聚合函数运算】

4>分组查询(GROUP BY)

上图中,“分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。”

        比如下图的1.,如果加个name字段,是没有任何意义的。只是显示了性别是"女"的第一行数据的女生姓名。如下下图。

5>排序查询(ORDER BY)

6>分页查询(数据库方言,MySQL中是LIMIT)

下图中,“查询记录数”就是“每页显示记录数”

下图中,起始索引=(2-1)*10=10;“查询记录数”就是“每页显示记录数”=10.

        emp表里一共16行数据,所以第二页只显示6行数据。

举例:查询前5个员工

4、DCL:管理数据库 用户、控制数据库的访问 权限

1>管理用户

mysql数据库如下,里面有个user表存储着使用的用户。

举例:

2>权限控制

三、函数

1、聚合函数【见二、3、3>】

2、字符串函数

3、数值函数

4、日期函数

5、流程函数

四、约束:作用于表中字段上的规则,在创建/修改表的时候添加约束

1、概述

2、举例

在上图创建完表后,插入下图的两条数据,不用指定id字段

如下图所示,id字段会自增

3、外键约束:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

1>外键关联到另一个表中的字段,被引用的列需要保证其值的 唯一性和非空性

这意味着,被引用的列是 主键(Primary Key)唯一约束(Unique Constraint)+ 非空

        唯一约束允许列包含空值(除非在定义约束时明确指定了不允许空值)。因此,在确保非空性的前提下,具有唯一约束的列也可以被外键引用。

在上图中,如果在父表dept中删除了id=1的部门,对子表emp没有任何影响。这违背了数据的一致性和完整性。

创建表后添加外键

现在如果要在父表dept中删除了id=1的部门,那么会报错

2>外键删除更新行为【级联操作等】

1》举例CASCADE

2》举例SET NULL

五、多表查询

1、多表关系:一对多(多对一)、多对多、一对一

3>一对一:多用于单表拆分

拆分上图中的表为两张表,如下图

增加外键,关联两张表。如下图

        注意要设置外键为唯一的。如下下图。

2、多表查询概述:需要消除掉无效的笛卡尔积【常为表取别名:在FROM后面取(因为执行DQL顺序是先执行FROM)】

需要消除掉无效的笛卡尔积,只显示有用的数据

3、多表查询分类:连接查询【内、外(左/右)、自连接】、子查询

1>内连接(隐式、显式):查询两张表交集的部分

2>外连接(左外、右外):谁取名就以谁为主

3>自连接:自己连接自己

举例:

把上图看作下图两张表

4、联合查询(union , union all):把多次查询的结果合并起来,形成一个新的查询结果集

5、子查询(嵌套查询):SQL语句中嵌套SELECT语句

1>标量子查询

2>列子查询

3>行子态询

4>表子查询

六、事务

1、事务:一组操作的集合,它是一个不可分割的工作单位(这些操作要么同时成功,要么同时失败)

2、事务操作

下面左/右两图作用一样的。

在左图中,SELECT @@autocommit;

        如果结果=1,则是自动提交事务;如果结果=0,则是手动提交事务,需要执行commit;

 

3、事务四大特性(ACID):原子性(A)、一致性(C)、隔离性(I)、持久性(D)

持久性:一旦事务提交,数据就会永久地存储在磁盘中,如下图

4、并发事务问题:脏读、不可重复读、幻读

1>脏读

在下图中,事务A要执行3个操作。事务A在第二个操作时把id的值更新了,但是此时事务A还没有提交。事务B却拿到了更新后的id的值。这种情况称为”脏读“。

1》问题分析

这属于典型的“脏读”问题。

如果事务 A 后续回滚(Rollback),那么事务 B 读取到的数据实际上是无效的,导致数据不一致。

2》如何避免

提高事务隔离级别到 READ COMMITTED(读已提交) 或更高。

  • READ COMMITTED:确保事务只能读取已提交的数据,避免脏读。

2>不可重复读

在下图中,事务A要执行4个操作。事务A执行第一个操作时,没有找到id=1。此后,事务B向数据库提交了id=1的更新。然后,事务A的第三个操作就读到了更新后的id数据。这种情况称为”不可重复读“。

1》问题分析

这属于“不可重复读”问题。

事务 A 在同一个事务中对同一条数据的两次查询结果不一致,可能导致业务逻辑错误

2》如何避免

提高事务隔离级别到 REPEATABLE READ(可重复读) 或更高。

  • REPEATABLE READ:在同一事务中,多次读取同一数据时,保证结果一致。即确保事务内多次读取结果一致。
  • 不过,在某些数据库(如 MySQL 的 InnoDB 引擎)中,即使在 REPEATABLE READ 隔离级别下,仍可能出现幻读问题。

3>幻读

在下图中,事务A 执行 id=1(insert)时,由于事务B已经插入了id=1(id是主键),那么这句话就会报错。此时在事务A中再次执行id=1(select),会发现id=1这个主键又在了。

1》问题分析

这属于“幻读”问题。

幻读通常发生在范围查询中(例如 SELECT * FROM table WHERE id > 10),但由于主键冲突的存在,这种现象也可以被归类为幻读的一种表现形式。

2》如何避免

提高事务隔离级别到 SERIALIZABLE(串行化)。

  • SERIALIZABLE:最高隔离级别,完全避免脏读、不可重复读和幻读。
  • 代价是性能下降,因为事务之间会被串行化执行。

5、事务隔离级别——分析原因见4、

下图中,✔代表允许。

        SERIALIZABLE(串行化)隔离级别最高,性能却最差。

举例: