复杂mysql/多表查询
多表查询的两种方法
方式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/多表查询的更多相关文章
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- Mysql 单表查询 子查询 关联查询
数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- MySQL多表查询回顾
----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...
- python 3 mysql 单表查询
python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...
- python3 mysql 多表查询
python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...
- Mysql 单表查询-排序-分页-group by初识
Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...
- Mysql 单表查询where初识
Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...
- MySQL多表查询合并结果union all,内连接查询
MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...
- MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案
MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...
随机推荐
- k8s控制器和Pod Template的关系
Pod 本身并不能自愈(self-healing).如果一个 Pod 所在的 Node (节点)出现故障,或者调度程序自身出现故障,Pod 将被删除:同理,当因为节点资源不够或节点维护而驱逐 Pod ...
- GitLab 之 Git LFS 大文件存储的配置
转载自:https://cloud.tencent.com/developer/article/1010589 1.Git LFS 介绍 Git 大文件存储(Large File Storage,简称 ...
- 组件化开发1-git命令简洁版
1-给项目添加git git init 2-查询当前状态,(红色显示的为在工作区,绿色为暂缓区) git status 3-提交到暂缓区 git add . 4-提交到本地仓库('xxxx'里面为注释 ...
- Node.js躬行记(23)——Worker threads
Node.js 官方提供了 Cluster 和 Child process 创建子进程,通过 Worker threads 模块创建子线程.但前者无法共享内存,通信必须使用 JSON 格式,有一定的局 ...
- 《3-D Deep Learning Approach for Remote Sensing Image Classification》论文笔记
论文题目<3-D Deep Learning Approach for Remote Sensing Image Classification> 论文作者:Amina Ben Hamida ...
- esp-idf 移植 lvgl8.3.3
一.准备材料 开发板:esp32s3 idf版本:4.4.2 lvgl:8.3.3 注意:lvgl不要选择master分支,编译失败时不好确定问题. 二.创建idf项目 方式一 通过 VSCode 创 ...
- python今日分享(内置方法)
目录 一.习题详解 二.数据类型的内置方法理论 三.整型相关操作 四.浮点型相关操作 五.字符串相关操作 六.列表相关操作 今日详解 一.习题详解 1.计算1-100所有数据之和 all_num = ...
- 常用RE对照表——敬请期待!!!
.* #任意长度任意字符
- 『现学现忘』Git分支 — 39、Git中分支与对象的关系
目录 1.Git对象之间的关系 2.提交对象与分支的关系 (1)提交对象与分支的关系 (2)分支说明 (3)HEAD与分支的关系 1.Git对象之间的关系 我们之前学了Git的三个对象:提交对象.树对 ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...