sql入门-多表查询
案例涉及表
----------------------------------建表语句之前翻看之前博客文章
多表查询
-- 学生表
create table studen (
id int primary key auto_increment comment 'id',
name varchar(50) comment '姓名',
no varchar(10) comment '学号'
) comment '学生表';
insert into studen values (null , '黛绮丽','2000100101'),(null , '谢逊','2000100102'),(null , '殷天正','2000100103'),(null , '韦一笑','2000100184');
drop table studen;
use itheima;
-- 课程表
create table course(
id int auto_increment primary key comment 'id',
name varchar(10) comment '课程名称'
)comment '课程名称';
insert into course values (null,'java'),(null,'php'),(null,'mysql'),(null,'hadoop');
-- 中间表(连接两种表上的关系)
create table studen_course(
id int primary key auto_increment comment 'id',
studen_id int not null comment '学生id',
course_id int not null comment '课程id',
constraint wj_studen foreign key(studen_id) references studen(id),
constraint wj_course foreign key(course_id) references course(id)
) comment '学生课程中间表';
insert into studen_course values(null,1,1),(null,1,2),(null,1,3),(null,1,4);
-- 多表查询需要消除笛卡尔积
-- 内连接 **--两张表交集部分
-- -- 隐式内连接 select 字段列表 表1,表2 where 条件
-- -- 显示内连接 select 字段列表 from 表1 [inner]join 被连接的表 on 连接条件
-- inner
-- 外连接 **-- 左外 相当于查询所有左表数据 并包含表1和表2 交集部分数据 右外同理
-- -- 左外连接 select 字段 from 表1 left[outer] join 表2 no 条件 ...
# 1.查询emp所有数据,和对应部门信息
select e.*,d.name from emp e left join dept d on e.det_id = d.id;
-- -- 右外连接 select 字段 from 表1 right[outer]join 表2 on 条件...
-- outer可以省略
-- 自连接查询 select 字段 from 表a 别名a join 表a 别名b on 条件...
# **-- 自连接查询,可以是内连接查询,也可以是外连接查询
#1. 查询员工并获取 及其领导的名字
select * from emp;
select e1.name 员工姓名 ,e1.age 年龄 , e2.name 领导名称 from emp e1 join emp e2 on e1.mangerid = e2.id;
#2. 查询员工并获取 及其领导的名字(没有领导也要显示出来) -- 使用左侧连接即可
select e1.name 员工姓名 ,e1.age 年龄 , e2.name 领导名称 from emp e1 left join emp e2 on e1.mangerid = e2.id;
-- 联合查询 select 字段 from 表a unino[all] select 字段 from 表b ....
-- union 合并查询结果
-- union all 合并结果,并去重
# 1.薪资小于 5000 和 年龄大于50
-- union 会去重 猪八戒只出现一次
select * from emp where salary < 5000
union
select * from emp where age > 50;
-- 猪八戒 会重复出现两次 语法 union all 合并两次查询结果(不去重)
select * from emp where salary < 5000 -- 猪八戒符合条件
union all
select * from emp where age > 50; -- 猪八戒符合条件
-- 子查询 sql嵌套select 语句 称为嵌套查询 又称子查询
-- select * from t1 where column1 = (select column1 from t2)
-- 子查询外部可以是 inster update delete select任何一个
-- -- 标量子查询(子查询结果为单个值)
# -- 常用的操作符 =等于 <>不等 >大于 >=大于等于 <小于 <=小于等于
# 查询销售部所有员工
select * from emp where det_id = (select id from dept where name = '销售部');
-- -- 列子查询(查询结果为一列)
# -- 常用操作符 in指定范围内 not in指定范围外
# -- any子查询任意一个满足即可 some和any等同 all子查询返回列表所有值必须满足
# 查询比 销售部 所有人工资都高的员工信息
select id from dept where name = '销售部';
select salary from emp where det_id = (select id from dept where name = '销售部');
select * from emp where salary > all (select salary from emp where det_id = (select id from dept where name = '销售部'));
-- -- 行子查询(查询结果为一行)
# -- 常用操作符 = <> in not in
# 查询和 杨逍 的 薪资 及 直属领导 相同的员工
select salary , mangerid from emp where name = '杨逍' ;
select * from emp where (salary , mangerid) = (select salary , mangerid from emp where name = '杨逍');
-- -- 表子查询(查询结果为多行多列)
# 常用操作符 in
# 查询 宋远桥 和 鹿杖客 职位相同和薪资相同的员工
select salary , job from emp where name = '宋远桥' || name = '鹿杖客';
select * from emp where (salary , job) in (select salary , job from emp where name = '宋远桥' || name = '鹿杖客');
# 查询入职日期 '2006-01-01'之后的员工信息,及其部门信息
select id,det_id from emp where entrydate > '2006-01-01';
select e.* , d.name from emp e ,dept d where (e.id , d.id) in (select id,det_id from emp where entrydate > '2006-01-01');
select * from emp where entrydate > '2006-01-01';
select * from (select * from emp where entrydate > '2006-01-01') e left join emp d on e.det_id = d.id;
# -- -- 根据子查询位置,分为where之后,from之后,select之后
# ========================多表查询案例=======================
create table salgrade (
grade int ,
losal int ,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,30001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);
# 1. 查询员工的姓名 年龄 职位 部门信息
select name , age , job ,det_id from emp;
-- 隐式内连接--35ms
select e.name ,e.age ,e.job,d.name from dept d , emp e where e.det_id = d.id;
-- 显示外连接--28ms 外连接 左连接 查询交际部分-且返回左侧表所有
select e.name ,e.age ,e.job,d.name from emp e left join dept d on d.id = e.det_id;
# 2.查询年龄小于30岁的员工姓名,年龄 职位,部门信息(显示内连接)
select * from emp where age < 30;
-- 隐式内连接
select e.name ,e.age ,e.job,d.name from emp e ,dept d where e.age < 30 and e.det_id = d.id;
-- 显示内连接 -inner join on 只查询交际部分
select * from emp e inner join dept d on e.det_id = d.id where e.age < 30;
# 3.查询所有员工的部门id,部门名称
-- distinct 去重
select distinct d.* from dept d , emp e where d.id = e.det_id;
# 4.查询所有年龄大于40岁的员工,及其部门的名称,如果员工没有部门,也需要展示出来
select e.* , d.name from emp e left join dept d on e.det_id = d.id where age > 40;
# 5.查询所有员工的工资的等级
select e.salary ,s.grade from emp e , salgrade s where e.salary between s.losal and s.hisal;
# 6.查询研发部所有员工信息及工资等级
select id from dept where name = '研发部';
select * from emp where det_id = (select id from dept where name = '研发部');
-- 子查询方法完成
select e.*, s.grade
from (select * from emp where det_id = (select id from dept where name = '研发部')) e,
salgrade s
where e.salary between s.losal and s.hisal;
-- 内连接方法
select *
from emp e,
dept d,
salgrade s
where e.det_id = d.id
and e.salary between s.losal and
s.hisal
and d.name = '研发部';
# 7.查询‘研发部员’ 工的 ’平均工资‘ -- 聚合函数 avg 平均值
select avg(e.salary)
from emp e ,dept d where e.det_id = d.id and d.name = '研发部';
# 8.查询工资比 '常遇春' 高的员工信息
select salary from emp where name = '常遇春';
select * from emp e where e.salary > (select salary from emp where name = '常遇春');
# 9.查询比平均工资高的员工信息
select avg(salary) from emp ;
select * from emp e where e.salary > (select avg(salary) from emp) ;
# 10.查询低于本部门平均工资的员工信息
-- a思路 ** 当前指定部门的平均薪资
select avg(salary) from emp where det_id = 1;
-- b 此处考察执行顺序 首先from e1 条件薪资小于 指定部门平均薪资
select e1.* , (select avg(salary) from emp where det_id = e1.det_id) 部门平均薪资
from emp e1
where e1.salary < (select avg(salary) from emp where det_id = e1.det_id);
# 11.查询所有的部门信息,并统计部门的员工人数
-- 获取指定部门统计人数
select count(*)
from emp where det_id = 1;
-- 统计部门人数
select d.name ,d.id ,(select count(*)from emp e where e.det_id = d.id ) 部门人数 from dept d;
# 12.查询所有学生 的选则课情况 展示学生名称 ,学号,课程名称
-- 涉及表 studen course stunden_course
select s.name, s.no, c.name
from studen s,
studen_course sc,
course c
where s.id = sc.studen_id
and c.id = sc.course_id;
相关文章:
sql入门-多表查询
案例涉及表 ----------------------------------建表语句之前翻看之前博客文章 多表查询 -- 学生表 create table studen ( id int primary key auto_increment comment id, name varchar(50) comment 姓名, no varchar(10) comment 学号 ) comment 学生表; insert…...
软考A计划-网络工程师-必考知识点-上
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…...
kafka复习:(17)seekToBeginning的用法
从分区的开始进行消费,因为kafka会定期清理历史数据,所以分区开始的位移不一定为0。seekToBeginning只是从目前保留的数据中最小的offset进行消费 package com.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;import org.apache.kafka.clients.consume…...
C# textBox1.Text=““与textBox1.Clear()的区别
一、区别 textbox.Text "" 和 textbox.Clear() 都可以用于清空文本框的内容,但它们之间有一些细微的区别。 textbox.Text "": 这种方式会将文本框的 Text 属性直接设置为空字符串。这样会立即清除文本框的内容,并将文本框显示为空…...
CnetSDK .NET OCR SDK Crack
CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件,用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件,使用Tesseract OCR引擎技术,可将字符识别准确率提高99%。通过将此.NET OCR扫…...
Python最新面试题汇总及答案
一、基础部分 1、什么是Python?为什么它会如此流行?Python是一种解释的、高级的、通用的编程语言。Python的设计理念是通过使用必要的空格与空行,增强代码的可读性。它之所以受欢迎,就是因为它具有简单易用的语法 2、为什么Pytho…...
设计模式(单例模式,工厂模式),线程池
目录 什么是设计模式? 单例模式 饿汉模式 懒汉模式 工厂模式 线程池 线程池种类 ThreadPoolExcutor的构造方法: 手动实现一个线程池 什么是设计模式? 计算机行业程序员水平层次不齐,为了让所有人都能够写出规范的代码,于是就有了设计模式,针对一些典型的场景,给出一…...
在mybatis中的mapper.xml中如何使用parameterType实现方法单个传参,对象传参,多参数传参.
在MyBatis的mapper.xml文件中,可以使用parameterType属性来指定方法的参数类型。parameterType属性用于指定传递给映射方法的参数类型,这将影响到MyBatis在映射方法执行时如何处理参数。 以下是三种不同情况下如何在mapper.xml中使用parameterType实现方…...
No120.精选前端面试题,享受每天的挑战和学习
文章目录 浏览器强制缓存和协商缓存cookie,localStorage、sessionStoragejs闭包,原型,原型链箭头函数和普通函数的区别promise的状态扭转 浏览器强制缓存和协商缓存 浏览器缓存是浏览器用于提高网页加载速度的一种机制。浏览器缓存分为强制缓…...
c# 访问sqlServer数据库时的连接字符串
//sql server 身份验证的场合, 连接字符串 private string ConnstrSqlServer "server服务器名称;uid登录名称;pwd登录密码;database数据库名称"; //windows 身份验证连接字符串 private string ConnstrWindows "server服务器名称;database数据库…...
排序算法概述
1.排序算法分类 **比较类算法排序:**通过比较来决定元素的时间复杂度的相对次序,由于其时间复杂度不能突破 O ( n l o g n ) O(nlogn) O(nlogn),因此也称为非线性时间比较类算法 **非比较类算法排序:**不通过比较来决定元素间的…...
ChatGPT在高等教育中的应用利弊探讨
人工智能在教育领域的应用日益广泛。2022年11月OpenAI开发的聊天机器人ChatGPT在全球范围内流传开来,其中用户数量最多的国家是美国(15.22%)。由于ChatGPT应用广泛,具有类似人类回答问题的能力,它正在成为许多学生和教育工作者的可信赖伙伴…...
Java之API详解之Runtime的详细解析
3.1 概述 Runtime表示Java中运行时对象,可以获取到程序运行时设计到的一些信息 3.2 常见方法 常见方法介绍 我们要学习的Object类中的常见方法如下所示: public static Runtime getRuntime() //当前系统的运行环境对象 public void exit(int statu…...
机器学习之softmax
Softmax是一个常用于多类别分类问题的激活函数和归一化方法。它将一个向量的原始分数(也称为 logits)转换为概率分布,使得每个类别的概率值在0到1之间,同时确保所有类别的概率之和等于1。Softmax函数的定义如下: 对于…...
npm script命令
1 串行/并行执行命令 //串行 npm-run-all text test npm run text && npm run test //并行改成& npm-run-all --parallel text test npm run text & npm run test2 传递参数 {"lint": "eslint js/*.js","lint:fix":…...
【力扣周赛】第360场周赛
【力扣周赛】第360场周赛 8015.距离原点最远的点题目描述解题思路 8022. 找出美丽数组的最小和题目描述解题思路 8015.距离原点最远的点 题目描述 描述:给你一个长度为 n 的字符串 moves ,该字符串仅由字符 ‘L’、‘R’ 和 ‘_’ 组成。字符串表示你在…...
php环境变量的配置步骤
要配置PHP的环境变量,以便在命令行中直接使用php命令,以下是一般的步骤: Windows 操作系统 下载和安装PHP:首先,你需要从PHP官方网站(https://www.php.net/downloads.php)下载适用于你的操作系…...
Kdtree
Kdtree kdtree 就是在 n 维空间对数据点进行二分;具体先确定一个根,然后小于在这个维度上的根的节点在左边,大于的在右边,再进行下一个维度的划分。直到维度结束,再重复,或者直到达到了结束条件࿱…...
算法leetcode|74. 搜索二维矩阵(rust重拳出击)
文章目录 74. 搜索二维矩阵:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 74. 搜索二维矩阵: 给你一个满足下述两条属性的…...
element浅尝辄止7:InfiniteScroll 无限滚动
滚动加载:滚动至底部时,加载更多数据。 1.如何使用? //在要实现滚动加载的列表上上添加v-infinite-scroll,并赋值相应的加载方法, //可实现滚动到底部时自动执行加载方法。<template><ul class"infinit…...
Day05-Vue基础
Day05-Vue基础 一、单向数据流 父子组件通信。会在父组件中定义好数据,将数据传递给子组件,可以使用这个数据 Vue中针对props这个属性提出了一个单向数据流的概念。 Vue针对props做了一些限制,可以接受值,使用这个值,规范中不要去直接修改这个值 目的是为了对数据流进…...
《机器学习在车险定价中的应用》实验报告
目录 一、实验题目 机器学习在车险定价中的应用 二、实验设置 1. 操作系统: 2. IDE: 3. python: 4. 库: 三、实验内容 实验前的猜想: 四、实验结果 1. 数据预处理及数据划分 独热编码处理结果(以…...
14. Docker中实现CI和CD
目录 1、前言 2、什么是CI/CD 3、部署Jenkins 3.1、下载Jenkins 3.2、启动Jenkins 3.3、访问Jenkins页面 4、Jenkins部署一个应用 5、Jenkins实现Docker应用的持续集成和部署 5.1、创建Dockerfile 5.2、集成Jenkins和Docker 6、小结 1、前言 持续集成(CI/CD)是一种…...
【多思路解决喝汽水问题】1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水
题目内容 喝汽水问题 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。 题目分析 数学思路分析 根据给出的问题和引用内容,我们可以得出答案。 首先ÿ…...
P1591 阶乘数码(Java高精度)
题目描述 求 n ! n! n! 中某个数码出现的次数。 输入格式 第一行为 t ( t ≤ 10 ) t(t \leq 10) t(t≤10),表示数据组数。接下来 t t t 行,每行一个正整数 n ( n ≤ 1000 ) n(n \leq 1000) n(n≤1000) 和数码 a a a。 输出格式 对于每组数据&a…...
Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)
( 虽然文章中有大多文本内容,想了解更深需要耐心看完,必定大有受益 ) 目录 一、动态SQL ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 优点 ( 4 ) 特殊标签 ( 5 ) 演示 二、#和$的区别 2.1 #使用 ( 1 ) #占位符语法 ( 2 ) #优点 2.…...
mysql下载
网址 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2、选择MSI进行安装 3、这里我选择离线安装 4、这里我选择直接下载 5、等待下载安装即可...
聚合函数与窗口函数
聚合函数 回答一 聚合函数(Aggregate Functions)是SQL中的函数,用于对一组数据进行计算,并返回单个结果。聚合函数通常用于统计和汇总数据,包括计算总和、平均值、计数、最大值和最小值等。 以下是一些常见的聚合函…...
c语言实现堆
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树1、树的概念2、树的相关概念3、树的表示 二、二叉树1、二叉树概念2、特殊的二叉树3、二叉树的性质4、二叉树的顺序结构5、二叉树的链式结构 三、堆(二叉树…...
ubuntu 如何将文件打包成tar.gz
要将文件打包成.tar.gz文件,可以使用以下命令: tar -czvf 文件名.tar.gz 文件路径 其中,-c表示创建新的归档文件,-z表示使用gzip进行压缩,-v表示显示详细的打包过程,-f表示指定归档文件的名称。 例如&am…...
怎样做已有网站的编辑维护/免费网站开发平台
题外话:三大操作系统------Linux、Unix、Windows,Unix系统如常见的Mac OS,Linux的很多命令跟Unix是通用的,所以就有一些开发人猿喜欢用苹果的原因。Linux发行版特别多,供给与选择合适的某个小众领域的发行版࿰…...
如何做网站的优化和推广/深圳seo网络推广
大多数情况下,页面上控件的显示问题 大多数情况是图层加载的时候顺序不对,做相应的调整就可以。 当控件显示出来,但是却不相应事件,往往还是图层的问题。比如一个页面的viewcontroller上已经添加了一个表视图(tablevie…...
南充网站设计/网站推广途径和要点
举例: 340%60 40 ,怎么来的? 340 - 60*5 40 340 - (比340小的那个可以被60整除的正整数) . 40 如果是负数: -340%60 -340 - (比-340小的那个可以被60整除的负整数) -340 - (-360) 20 如图:也可以换个思路想, -340…...
最新新闻热点及观点/电子商务沙盘seo关键词
set(集合) 直接创建一个空集合set_empty set() print(set_empty) # set() 根据参数创建# 根据参数 set_argument set(42,345,ry) print(set_argument) # 这样会报错,因为set只允许有一个参数 根据列表来创建set_list set([11,11,45,11,ee]) print(set…...
网站开发接单平台/竞价培训
作用域闭包递归 (自己调自己) 简单闭包 function parent() {var x parentfunction son() {var x sonreturn x}return son() } parent() //son闭包写法: /*写法一*/ function parent() {var x parentreturn function son() {var x …...
做网站软件流程/武汉百度推广外包
写原生的时候,我们经常会用到广播,接口,回调等方法来实现发送和接受通知以及通信的。 那么在RN中,也有一套发送和接收通知的方法,用的组件是DeviceEventEmitter。下面看一下,RN中是如何发送和接收事件的&am…...