系列文章目录
一、连接查询
连接查询会将多个表的记录横向对接,形成一整张的临时表并返回。
图片中的演示,如果有连接条件,均为左表.班级id=右表.id
。
-
内连接:
返回两个表中满足连接条件的记录。
SELECT 字段,…… FOR 左表 INNER JOIN 右表 ON 连接条件;
多个表的连接查询:
SELECT 字段,…… FOR 左表 INNER JOIN 右表 INNER JOIN 表 …… ON 连接条件;
下面各种连接的多个表查询,也是上面这个格式。
-
左连接:
返回左表的所有记录和右表中满足连接条件的记录,不满足的,就用NULL补充。
SELECT 字段,…… FOR 左表 LEFT JOIN 右表 ON 连接条件;
-
右连接:
返回右表的所有记录和左表中满足连接条件的记录,不满足的,就用NULL补充。
SELECT 字段,…… FOR 左表 RIGHT JOIN 右表 ON 连接条件;
-
全连接:
返回左右表中所有的记录,不满足连接条件的,就用NULL补充。
mysql不支持全连接,使用UNION连接左连接和右连接,可以实现全连接的效果。
左连接语句 UNION 右连接语句;
-
交叉连接(笛卡尔积):
返回左表中的每一行与右表中每一行的组合。
SELECT 字段,…… FOR 表名,……;
为了避免箭头混乱,箭头只连接了右表的第一行,其他两行也是同样的道理:
二、子查询
-
子查询的概念:
将一个查询语句的结果当作另外一个查询语句的条件去使用。
-
语法:
SELECT 字段,…… FOR 表名 WHERE 表达式 操作符 (子查询)
操作符可以是 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
IN和NOT IN已经讲过,补充一下EXISTS、NOT EXISTS:
EXISTS用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE(执行子查询外层语句),否则返回 FALSE(不执行子查询外层语句);若使用关键字 NOT,则返回的值正好相反。
-
举例:
使用子查询在students表和course表中查询学习Python课程的学生姓名:
SELECT name FROM students WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Python');
三、关键字顺序
-
关键字书写顺序:
SELECT DISTINCT 字段名…… FROM 表名 连接方式 JOIN 表名 ON 连接条件 WHERE 过滤条件 GROUP BY 分组依据 HAVING 过滤条件 ORDER BY 排序依据 LIMIT 数量;
-
关键字执行顺序:
FROM --> JOIN --> ON --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> LIMIT
四、存储引擎
-
常见存储引擎:
-
InnoDB:
该引擎是MySQL5.5版本及之后的默认存储引擎。支持事务、外键,安全性更高。
事务会在后面详细讲解。创建表会生成:表结构文件、表数据文件。
-
MyISAM:
该引擎是MySQL5.5版本之前的默认存储引擎。速度比InnoDB更快,但不支持事务和外键,安全性低。
创建表会生成:表结构文件、表数据文件、表索引文件。
-
MEMORY:
也叫内存引擎,数据全部存放在内存中,速度快,但断电数据会丢失。主要用于临时存储。
创建表会生成:表结构文件。
-
BLACKHOLE:
直译过来就是“黑洞”,它的特点如同其名,无论存入任何数据,都会立刻消失。使用select查询,结果永远为空。该引擎有一些高级特性,在特定的场所很有用,但暂时不做讲解。
创建表会生成:表结构文件 。
-
-
查看所有引擎:
SHOW ENGINES;
-
设置引擎:
创建表的同时,设置引擎:CREATE TABLE 表名 ( …… ) ENGINE = 存储引擎名称;
临时修改,当前会话有效:
SET default_storage_engine=存储引擎名称;