SQL笔记(待补充)
关系型 和 非关系型。(是否有规律,是否固定规则)
2.业务是有规则的
3.mysql逻辑架构图
4.ibd文件 表结构和数据
5.innodb 和 myisam
6.myisam存储引擎:sdi 表结构 myi 索引 myd数据
7.什么是存储引擎?
8.你知道的mysql的存储引擎有哪些?
9.怎么选择?
10.能用数字表示不用文字,能用占用空间小的类型不用占空间大的类型
11.decimal(5,2) 最大能存多大的数字 ?
12.date 日期 ;datetime 日期时间;timestamp时间戳;
13.1:mysql逻辑架构图。2:存储引擎分类。3:用户权限练习。【作业:创建三个用户:dev(所有库,增删改查),test(测试库,增改查),pro (生产库,查询权限)】4:测试题。5:牛客网。
14.UNION ALL和untion 结果集合并的区别,都是纵向合并,但union去重,unionall不去重
15.四种jioin的区别

作业1:画出下题sql的执行顺序,流程图

问题:查询所有同学的学号、姓名、选课数、总成绩;

sql语法树

整体结构解析 * 这是一个嵌套查询的语法树结构。
* 外层查询是一个 SELECT 语句,它从子查询 t1 的结果中获取数据并进行聚合操作。
* 子查询 t1 内部进行了表的连接操作,并对连接结果进行了列的选择和处理。
2.
外层查询 * SELECT 部分 * 选择了 t1.sid、t1.sname、COUNT(course_id) 和 SUM(number)。这里的 t1 是子查询的结果集。
* COUNT(course_id) 用于统计子查询结果中每个学生对应的课程数量,SUM(number) 用于统计每个学生的分数总和。
* GROUP BY 部分 * 按照 t1.sid 进行分组。这意味着对于每个不同的学生ID,将分别计算上述的统计值(课程数量和分数总和)。
3.
子查询t1 * SELECT 部分 * 从连接后的结果中选择了 stu.sid(学生表中的学生ID)、stu.sname(学生表中的学生姓名)、sc.course_id(成绩表中的课程ID)和经过处理的 sc.number(成绩表中的成绩,使用 IFNULL 处理可能的 NULL 值并命名为 number)。
* LEFT JOIN 部分 * 子查询中使用了 LEFT JOIN 将 student 表(别名为 stu)和 score 表(别名为 sc)进行连接。连接条件是 stu.sid = sc.student_id。这意味着会保留 student 表中的所有行,并且在 score 表中找到匹配的行,如果没有匹配则相应列的值为 NULL。
* 表关系 * student 表提供学生的基本信息(如学生ID和姓名),score 表提供学生的课程成绩信息(如课程ID和成绩)。通过 LEFT JOIN 将两者关联起来,以便在子查询中获取完整的学生相关信息用于外层查询的统计和选择操作
- FROM :首先执行子查询中的
FROM子句,即从student表和score表中检索数据。 - JOIN :执行
LEFT JOIN操作,将student表和score表连接起来。 - WHERE :在子查询中没有
WHERE子句,因此不进行额外的过滤。 - GROUP BY :在子查询中没有
GROUP BY子句,因此不进行分组。 - HAVING :在子查询中没有
HAVING子句,因此不进行分组后的过滤。 - SELECT :执行子查询中的
SELECT子句,选择stu.sid、stu.sname、sc.course_id和经过处理的sc.number。 - DISTINCT :在子查询中没有
DISTINCT关键字,因此不进行去重操作。 - ORDER BY :在子查询中没有
ORDER BY子句,因此不进行排序。 - LIMIT :在子查询中没有
LIMIT子句,因此不限制返回的记录数量。
子查询执行完毕后,将其结果作为临时表t1。然后,执行外层查询:
LEFT JOIN子句的底层实现
LEFT JOIN(左连接)是一种SQL操作,用于将两个表中的数据按照指定的条件进行匹配,并返回左表中的所有记录以及右表中匹配的记录。如果右表中没有匹配的记录,则返回NULL值。
在底层实现上,LEFT JOIN通常使用嵌套循环算法来完成。具体步骤如下:
- 执行左表的查询操作,获取左表的所有记录。
- 逐条获取左表记录的连接字段值。
- 根据连接字段值,在右表中查找匹配的记录。
- 如果找到匹配的记录,则将左表记录与右表记录合并成一条结果记录;如果没有找到匹配的记录,则将左表记录与NULL值进行合并。
- 重复步骤2-4,直到遍历完所有左表记录。

在MySQL中,不能直接在UPDATE或DELETE语句的FROM子句中引用目标表,这是因为这种操作可能会导致数据的不一致性和不确定性。例如,如果你正在尝试更新一个表,并且在更新的条件中使用了同一个表的数据,MySQL可能无法确定应该先执行哪个操作,是更新还是查询,这可能会导致意外的结果。







