多表查询的两种方法

方式1:连表操作
inner join 内连接
select * from l1 inner join l2 on l1.l2_id = l2.id;
# 表 l1 内连接 表 l2 连接条件是 l1的字段L2_ID = L2的字段id left join 左连接
select * from l1 left join l2 on l1.l2_id = l2.id;
# 表 l1 内连接 表 l2 连接条件是 l1的字段L2_ID = L2的字段id
# 左连接是已 左表l1 显示为准 右表没有则用null 空填充 左连接:保证左表数据可以全部显示 右链接:可以保证右表全部显示 right join 右链接
select * from l1 right join l2 on l1.l2_id = l2.id
# 表 l1 内连接 表 l2 连接条件是 l1的字段L2_ID = L2的字段id
# 右连接是已 右表l2 显示为准 左表没有则用null 空填充 union 全连接
select * from l1 left join l2 on l1.l2_id = l2.id;
union
select * from l1 right join l2 on l1.l2_id = l2.id; 将左右连接全部生效 展示两个表的所有数据 各自没有的全部用null填充 '''
学会了连表操作之后也就可以连接N多张表
思路: 将拼接之后的表起别名 然后当做一张表 再去连接其他表,依次反复可以达到3 4 5表连接
''' 方式2:子查询
将一条sql语句用括号括起来 可以当成另外一条SQL语句的查询条件
题目:求姓名是jason的员工部门名称
# 子查询类似我们生活中解决问题的方式 分步操作 步骤1:先根据 jason 获取到部门编号
select l1_id from l2 where name = 'jason' 步骤2:在根据部门编号 获得部门名称
select name from l1 where id = (select l1_id from l2 where name = 'jason'); # 这样就获得了 jason的部门名称 '''
很多时候多表查询需要结合实际情况判断用哪种 更多时候甚至是相互配合使用
'''

sql语句基础语法补充

concat / existe / 表字段 增加 修改 删除

1.concat
concat 用于展示分组之前的字段拼接 select concat(name,'|',password) from l1; +---------------------+
| concat(id,'|',name) |
+---------------------+
| 200|技术 |
| 201|人力资源 |
+---------------------+ 可以把需要展示的数据拼接进行展示 多字段拼接可以使用 concat_ws 方法 因为这样就不需要输入多个字符
select concat_ws('|',id,name,age,sex) from l1;
# 意思 使用'|'拼接所有字段
# 得到结果 10001|张无忌|18|男 2.existe
sql语句1 existe sql语句2
只有当sql语句成立成功运行的情况下才会执行sql语句1
否则不执行sql语句1 返回空数据
类似一点点 python语法中的if 3.修改表名
alter table l1 rename l2; 4.添加表字段
alter table 表名 add 添加字段名 字段类型 字段约束
alter table l1 add name char(4) unique; 5.修改表字段信息
alter table 表名 change 旧字段名 新字段名 字段类型 约束条件;
# 修改字段信息 比如 原字段名 name 类型 char 条件 非空
# 新字段名 age 类型 char 条件不填写,默认是会只修改字段名
# 字段类型 约束条件等 没有修改的还是会保留下来的 6.删除字段
alter table 表名 drop 字段名;
alter table l1 drop age;

复杂sql练习题

"""
编写复杂的SQL不要想着一口气写完
一定要先明确思路 然后一步步写一步步查一步步补
"""
1、查询所有的课程的名称以及对应的任课老师姓名
SELECT cname,tname FROM course INNER JOIN teacher on course.teacher_id = teacher.tid; 4、查询平均成绩大于八十分的同学的姓名和平均成绩
SELECT
student.sname,
T1.AVG_NUM
FROM
student
INNER JOIN ( SELECT student_id, avg( num ) AS AVG_NUM FROM score GROUP BY student_id HAVING AVG_NUM > 80 ) AS T1 ON student.SID = T1.student_id; 7、查询没有报李平老师课的学生姓名
SELECT
student.sname
FROM
student
WHERE
student.class_id NOT IN (
SELECT DISTINCT
score.student_id
FROM
score
WHERE
score.course_id IN (
SELECT
course.cid
FROM
course
WHERE
course.teacher_id = ( SELECT teacher.tid FROM teacher WHERE teacher.tname = '李平老师' ))); 8、查询没有同时选修物理课程和体育课程的学生姓名
SELECT
student.sname
FROM
student
WHERE
student.sid IN (
SELECT
score.student_id
FROM
score
WHERE
score.course_id IN (
SELECT
course.cid
FROM
course
WHERE
course.cname IN ( '物理', '体育' ))
GROUP BY
score.student_id
HAVING
COUNT( course_id ) = 1
);
9、查询挂科超过两门(包括两门)的学生姓名和班级
SELECT student_id, FROM score WHERE score.num < 60 GROUP BY student_id HAVING COUNT(course_id) >= 2;
SELECT
student.sname,
class.caption
FROM
student
INNER JOIN class ON student.class_id = class.cid
WHERE
student.sid IN (SELECT student_id FROM score WHERE score.num < 60 GROUP BY student_id HAVING COUNT( course_id ) >= 2 )

复杂mysql/多表查询的更多相关文章

  1. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  2. Mysql 单表查询 子查询 关联查询

    数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

  3. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  4. MySQL多表查询回顾

    ----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...

  5. python 3 mysql 单表查询

    python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

  6. python3 mysql 多表查询

    python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...

  7. Mysql 单表查询-排序-分页-group by初识

    Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...

  8. Mysql 单表查询where初识

    Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...

  9. MySQL多表查询合并结果union all,内连接查询

    MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...

  10. MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案

    MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...

随机推荐

  1. 关于使用kuboard安装其自带的监控应用的注意事项

    在安装过程中若想监控kube-controller-manager和kube-scheduler,需要按步骤中的如下说明操作 在这里,所有master节点的这俩文件都需要修改,不用apply,等一分钟 ...

  2. CentOS7.9 yum方式安装redis最新版

    yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum --enablerepo=remi ins ...

  3. Jenkins配置项目构建的钉钉通知

    在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook,复制webhook. Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警. 安装钉钉通知插件 ...

  4. 苹果手机安装郑好办手机app后给绿城通公交卡充值的步骤

    1.苹果手机,需要带有NFC功能 苹果XS手机该功能默认是开启的,不用额外的其他操作 苹果11该功能需要设置开启才行.步骤:设置--通用--NFC,然后开启 2,公交卡 如下这种的公交卡可以充值: 如 ...

  5. SonarQube 插件之 Issues Report & SonarLint 的配置及使用

    转载自:https://cloud.tencent.com/developer/article/1010599 1.Issues Report Plugins 介绍 使用 Issues Report ...

  6. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中节点有两个权 ...

  7. SSM项目环境快速搭建

    SSM项目的环境搭建 环境搭建的目标 工程创建 创建父工程 创建空 maven工程 xxx-parent 作为父工程 修改父工程中的 pom.xml <!--?xml version=" ...

  8. JuiceFS 元数据引擎选型指南

    文件系统是我们常见的存储形式,内部主要由数据和元数据两部分组成.其中数据是文件的具体内容,通常会直接展现给用户:而元数据是描述数据的数据,用来记录文件属性.目录结构.数据存储位置等.一般来说,元数据有 ...

  9. C++ 右值引用与一级指针

    将右值引用用于一级指针,在初始化时等号右边必须为右值,有以下几种用法: //方式一:引用一级指针,常规用法 int a = 5; int * &&rrpa = &a; //右值 ...

  10. 如何用AR Engine环境Mesh能力实现虚实遮挡

    在AR应用中,用户最不希望看到不真实的穿模现象发生,如虚拟形象部分身体陷入墙壁之中,或者未碰到墙壁却已无法移动,这种不真实的交互十分影响用户体验.那如何才能让避免虚拟物体的穿模问题呢?使用AR Eng ...