表的联查

员工表与部门表

员工表:id,姓名,年龄,部门id
部门表:部门id,部门名,部门成立时间,部门领导,部门职责....

表和表之间的关系

  • 一对一
  • 一对多
  • 多对多

创建联查

创建表

先创建被依赖表(dept):
create table dept (did integer primary key auto_increment comment '部门id',
dname varchar(10) comment '部门名',
des varchar(30) comment '部门描述');

再创建关联表(emp):
create table emp (emp_id integer primary key auto_increment comment '员工id',
emp_name varchar(20) comment '员工名',
emp_salary integer comment '员工薪资',
emp_age integer comment '员工年龄',
d_id integer comment '部门id',
foreign key (d_id) references dept(did) on UPDATE cascade
on delete cascade );

添加外键的方法:
foreign key (自己表的列名) references 被关联表(被关键表的列)
on UPDATE cascade:可以被修改(修改被关联表中内容,关联表中的内容也会被修改,delete下同)
on delete cascade:可以被删除

添加数据

在给有外键的表添加数据时候,要添加的数据必须在被关联表(dept)中出现
insert into dept values (null,'研发部' ,'******'),
(null,'市场部' ,'aaa'),
(null,'人事部' ,'bbb'),
(null,'营销部' ,'ccc'),
(null,'行政部' ,'ddd');

insert into emp values (null ,'张三','6000',25,1),
(null ,'李四','8000',22,3),
(null ,'王五','5000',24,2),
(null ,'赵六','7000',26,4),
(null ,'钱七','9000',23,3);

关于外键:

  • 外键只和update 和 delete 有关系
  • 在insert的时候,只有在被关联表(dept)有相应的值时,才能在关联表(emp)中添加
  • 如果在创建表的时候给外键添加 on update cascade ,那么关联表(emp)的外键只可以随时被关联表(dept)的改变自动修改
  • 如果添加了 on delete cascade,那么删除被关联表(dept)的数据之后,
    被关联表的相关数据一并删除
  • 删除表的时候,先drop关联表(emp),再drop被关联表(dept)

多对多联查:学生表和课程表

学生表:id,name
课程表:id,name
需要的中间表:id,s_id,c_id
如果两个表是多对多的关系,那么必然会有中间表来关联两者

创建表

学生表:
create table if not exists stu(sid integer auto_increment primary key ,
sname varchar(10) ) comment '学生表';
课程表:
create table if not exists course(cid integer auto_increment primary key ,
cname varchar(10)) comment '课程表';
中间表:
create table if not exists sc(id integer primary key auto_increment,
s_id integer,
c_id integer,
foreign key (s_id) references stu(sid)
on UPDATE cascade ,
foreign key (c_id) references course(cid)
on UPDATE cascade ) comment '中间表';

多表查询

select emp.emp_name,emp.d_id,
dept.dname,dept.did
from emp,dept where emp.d_id=dept.did;

笛卡尔积axb

多表查询就是把不符合条件的笛卡尔积全部去掉

join...on(inner join...on)

左外连接 left join
join左侧的表的所有行一定会在结果中出现
右外连接 right join
join右侧的表的所有行一定会在结果中出现
全连接 full join
笛卡尔积 cross join
自然连接 natural join
自连接: 取代子查询的手段

join:两表形成的笛卡尔积的形式合并为一个表
on:过滤笛卡尔积的条件

判断语句执行的顺序:on > where > having

练习

1.查询员工及所在部门所有信息

select *
from emp join dept
on emp.d_id = dept.did;

2.查询所有员工姓名,薪资和所在部门

select emp_name ,emp_salary ,dept.dname
from emp join dept
on emp.d_id = dept.did;

3.查询员工姓名及所在部门的全部信息

select emp_name,dept.*
from emp join dept
on emp.d_id = dept.did;

4.查询“市场部”的员工的姓名和薪资

select dept.dname,emp.emp_name ,emp_salary
from emp join dept
on emp.d_id = dept.did
where dept.dname='市场部';

5.查询“市场部”年龄大于22岁的员工姓名和薪资

select emp_name, emp_salary
from emp join dept
on emp.d_id = dept.did
where dept.dname='市场部' and emp_age>22;

6.查询每个部门的平均薪资

select dept.dname,AVG(emp_salary)
from emp join dept
on emp.d_id = dept.did
group by dept.dname;

7.查询每个部门的人数

select dept.dname,count(*)
from emp join dept
on emp.d_id = dept.did
group by dept.dname;

8查询每个部门年龄大于21岁的员工的人数(要求全部输出)

select dept.dname,count(emp_name)
from emp right join dept
on emp.d_id = dept.did and emp_age>21
group by dept.dname;

9.查询每个部门的薪资>5000的员工的平均年龄和每个部门的平均薪资

select dept.dname,AVG(emp.emp_salary),AVG(emp.emp_age)
from emp join dept
on emp.d_id = dept.did
group by dept.dname
having AVG(emp.emp_salary)>5000;

2019.3.26 SQL语句(进阶3)的更多相关文章

  1. 2019.3.25 SQL语句(进阶篇1)

    运算符 基本的加减乘除取余都可以在SQL中使用 新建Employee1表并添加数据 create table Employee1 (eid int primary key auto_increment ...

  2. 2019.3.25 SQL语句(进阶2)

    子查询 数据库中的表沿用 上一篇博客 中使用的Employee1. 练习: 1.求所有年龄比张三小的人 select * from Employee1 where age < (select a ...

  3. sql语句进阶教程

    转载自:http://blog.csdn.net/u011001084/article/details/51318434 最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下 ...

  4. 2019.3.22 SQL语句(基础篇)

    SQL语句 创建一个数据库: create database+数据库名; 使用数据库: use+数据库名; 查看mySQL中有哪些数据库: show databases; 删除数据库 drop dat ...

  5. 能写数据后台,需要掌握哪些进阶的sql语句?

    国庆假期花了一些时间,首次尝试并玩转 grafana,这几天继续不断优化和完善,如今看着自己的成果,相当满意.--逐步接近我想要的理想后台啦. 需求是不停歇的.今天我又给自己发掘了一些新需求,比如变量 ...

  6. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  7. SQL语句练习(进阶版)

    学生数据库中有三个基本表(关系)如下: 学生表S(Sno,Sname,Age,Sex,SD) 课程表C(Cno,Cname, Teacher) 选课表SC(Sno,Cno,Grade) 请用SQL语言 ...

  8. MySQL高级(进阶)SQL语句

    MySQL高级(进阶)SQL语句 目录 MySQL高级(进阶)SQL语句 一.实例准备--制表 1. 表1(商店区域表) 2. 表2(商店销售表) 3. 表3(城市表) 4. 表4(total_sal ...

  9. mysql进阶(十九)SQL语句如何精准查找某一时间段的数据

    SQL语句如何精准查找某一时间段的数据 在项目开发过程中,自己需要查询出一定时间段内的交易.故需要在sql查询语句中加入日期时间要素,sql语句如何实现? SELECT * FROM lmapp.lm ...

随机推荐

  1. 关于instanceof测试遇到的问题

    今天上上课 用 instanceof关键字来判断某个对象是否属于某种数据类型.报错  代码如下 package cn.lijun.demo3; import cn.lijun.demo.Person; ...

  2. C++ 中 dynamic_cast 浅析

    简述:dynamic_cast 操作符,将基类的指针或引用安全的转换为派生类的指针或引用.主要讲解,dynamic_cast操作符的原理.使用方式.编译器设置.返回值等相关知识. dynamic_ca ...

  3. Java简单实现AOP,Java通用异常拦截,Java与Lamada

    直接看代码不废话.不懂Lamada直接百度... package test; /** * QQ:1448376744 * @author 花间岛 * */ //控制器 public class Con ...

  4. SQL server T-sql语句查询执行顺序

    前言 数据库的查询执行,毋庸置疑是程序员必备的技能之一,然而数据库查询执行的过程绚烂多彩,却是很少被人了解,今天我们来深入了解下sql查询的来龙去脉,为查询的性能优化打个基础 这篇博客,摒弃查询优化性 ...

  5. 基于verilog的FFT算法8点12位硬件实现

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  6. 数据库处理session类

    <?php /* * 使用数据库处理session * php.ini 中 session.save_handler 设为 "user" */ class Dbsession ...

  7. Mybatis 的动态 SQL 语句

    <if>标签 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 比如在 id 如果不为空时可以根据 id 查询, 如果 username 不同空时还要加入用户名作为条件.这种 ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题   题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上 ...

  9. [BZOJ2879][Noi2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  10. 安装vm tools(方便虚拟机复制粘贴切换)

    在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(而不再用按ctrl+alT释放),而且还可以令 ...