【MySQL_学习笔记】2021.8.19

  • 多层复杂连接
SELECT * 
    FROM student INNER JOIN score ON student.s_id = score.s_id
SELECT * 
    FROM student INNER JOIN score ON student.s_id = score.s_id
                 INNER JOIN course ON score.c_id = course.c_id

INNER JOIN 在使用时遵循的原则:

(1)每个 INNER JOIN 只能连接两张表;

(2)多次 INNER JOIN 可以连接多张表;

(3)过多连接会影响性能,一般不超过3层。

SELECT student.s_id, s_name, c_name, score, points
    FROM student INNER JOIN score ON student.s_id = score.s_id
                 INNER JOIN course ON score.c_id = course.c_id
    ORDER BY student.s_id

备注:在多表连接查询中可以使用 AS 对参与连接的表取别名,如果需要对同一张表进行两次或两次以上次数的连接时,必须对表取别名加以区分,否则SQL语句会报错,无法顺利执行查询

SELECT clients.client_name AS 骗子,tran_time AS 交易日期,a.client_name AS 受害人, money AS 诈骗金额
    FROM clients INNER JOIN cheats
                   ON client_name = cheat_name AND clients.phone = cheats.phone
                 INNER JOIN transactions
                   ON transactions.to_client = clients.client_id
             INNER JOIN clients AS a ON transactions.from_client = a.client_id
SELECT a.client_name AS 受害人, SUM(money) AS 诈骗总金额

    FROM clients INNER JOIN cheats
                   ON client_name = cheat_name AND clients.phone = cheats.phone            
                 INNER JOIN transactions
                   ON transactions.to_client = clients.client_id
             INNER JOIN clients AS a ON transactions.from_client = a.client_id
                        
    GROUP BY a.client_id,a.client_name
    ORDER BY 诈骗总金额 DESC
  • 外连接与Union 
SELECT * 
    FROM student LEFT JOIN score
                 ON student.s_id = score.s_id
SELECT * 
    FROM student RIGHT JOIN score
                 ON student.s_id = score.s_id

备注:

(1)在SQL连接查询中,包含表中没有关联行的那些记录的连接方式称为外连接。外连接分为左连接、右连接、全外连接

(2)确保左表中的记录全部出现在结果中,即使填充 NULL,这种外连接的形式称为左连接

(3)左连接的运行过程是:先执行内连接得到一次结果;检查左表是否还有“漏掉”的记录

(4)确保右表中的记录全部出现在结果中,即使填充 NULL,这种外连接的形式称为右连接

(5)确保两张表的记录全部出现在结果中,即使填充 NULL,这种外连接的形式称为全外连接(mysql不支持此语法

(6)全外连接的运行过程是:先执行内连接;检查左表遗漏数据;检查右表遗漏数据

SELECT s_id,s_name,email FROM student
UNION
SELECT s_id,s_name,contact FROM left_student
SELECT s_id,s_name,email,null AS left_year FROM student
UNION
SELECT s_id,s_name,contact,left_year FROM left_student

备注:

(1)多个SQL语句的执行结果合并到一张结果表中称为联合(UNION)

(2)如果用 UNION 将两个查询结果连在一起,两个查询结果中的字段名称可以不同,但是字段数目和类型必须相同

(3)对于参与联合的表,如果某个需要显示的字段在其他表中存在,而在本表中不存在,为了满足联合语句的规则,需要使用常量作为字段的值,根据其他表中存在字段为该字段取别名

SELECT s_id,s_name,email FROM student
UNION ALL
SELECT s_id,s_name,contact FROM left_student

备注:

(1)如果两个查询结果有重叠,UNION 之后会去除重复、只保留其中一个

(2)使用 UNION ALL 可以不去除重复,保留两个结果中的全部内容

posted @ 2021-08-27 13:36  ZzzRed  阅读(48)  评论(0)    收藏  举报