WEB——06.MySQL(3)


文章目录

  • WEB——06.MySQL(3)
  • 子查询(嵌套查询)
  • 关联关系
  • 表和表之间如何建立关系?
  • 关联查询
  • 等值连接
  • 内连接
  • 外连接
  • 关联查询总结
  • 关联查询总结


子查询(嵌套查询)

  • 查询工资高于程序员最高工资的员工信息
    select * from emp where sal>(select max(sal) from emp where job=“程序员”);
  • 查询工资最高的员工信息
    select * from emp where sal=(select max(sal) from emp);
  • 查询和孙悟空相同工作的员工信息
    select * from emp where job=(select job from emp where name=“孙悟空”) and name!=“孙悟空”;
  • 查询拿最低工资员工的同事们的信息(同事指同一部门)

select * from emp where dept_id=( select dept_id from emp where sal = (select min(sal) from emp)) and sal != (select min(sal) from emp ;

关联关系

  • 只一个项目中创建的表和表之间存在的业务关系
  • 关系如下:
  • 一对一:有AB两张表,A表中一条数据对应B表的一条数据,B表中一条数据对应A表的一条数据。
  • 一对多:有AB两张表,A表中一条数据对应B表的多条数据,B表中一条数据对应A表的一条数据。
  • 多对多:有AB两张表,A表中一条数据对应B表的多条数据,B表中一条数据对应A表的多条数据。

表和表之间如何建立关系?

  • 一对一:在AB任意一张表里添加一个建立关系的字段 指向另外一张表的主键
  • 一对多:在一对多的两张表中,在“多”的表里面添加建立关系的字段 指向另外一张表的主键
  • 多对多:创建一个单独的关系表,表里面有两个字段指向另外两个表的主键
  • 多对多举例: 苍老师: 小红,小花,小绿 传奇哥: 小花,小绿
    create table t(id int primary key auto_increment,name varchar(20));
    create table s(id int primary key auto_increment,name varchar(20));
    create table t_s(tid int ,sid int);
    insert into t values(null,‘苍老师’),(null,‘传奇哥’);
    insert into s values(null,‘小红’),(null,‘小花’),(null,‘小绿’);
    insert into t_s values(1,1),(1,2),(1,3),(2,2),(2,3);

老师表:t
学生表:s
关系表:t_s

  • 查询每个老师名字和对应的学生姓名
    select t.name,s.name
    from t join t_s ts on t.id=ts.tid join s on s.id=ts.sid;
  • 查询苍老师的学生姓名

select s.name from t join t_s ts on t.id=ts.tid join s on s.id=ts.sid where t.name=“苍老师”;

关联查询

  • 查询存在关联关系的表的查询方式称为关联查询
  • 关联查询的方式包括:等值连接,内连接,外连接

等值连接

  • 格式:select * from A,B where 关联关系 and 其他条件;
  • 查询工资高于2000的员工的姓名和对应的部门名

select e.name ,d.name from emp e, dept d where e.dept_id = d.id and sal>2000;

  • 查询程序员的姓名,工资,部门名,部门地点
    select e.name,e.sal,d.name,d.loc from emp e,dept d where e.dept_id = d.id and job = “程序员”;

内连接

  • 等值连接和内连接查询到的是一样的数据,推荐使用内连接
  • 格式:select * from A join B on 关联关系 where 其他条件;
  • 查询工资高于2000的员工姓名和对应的部门名
    select e.name ,d.name from emp e inner join dept d on e.dept_id = d.id where sal>2000;
  • 查询程序员的姓名,工资,部门名,部门地点
    select e.name,e.sal,d.name,d.loc fom emp e join dept d on e.dept_id=d.id where job=“程序员”;

外连接

  • 等值连接和内连接查询到的是两个表的交际数据
  • 外连接查询到的是一张表的全部和另外一张表的交集
  • 格式:select * from A left/rigth join B on 关联关系 where 其他条件;
  • 查询所有员工姓名和对应的部门名
    select e.name d.name from emp e left join dept d on e.dept_t=d.id;
  • 查询所有部门的名字,地址,和对应的员工姓名,工资
    select d.name d.loc e.name,e,sal from emp e right join dept d on e.dept_id=d.id;

关联查询总结

  • 如果查询的数据是两个表的交际数据,使用等值连接或内连接(推荐)
  • 如果查询的是一张表的全部和另外一张表的交际则使用外连接
    pt d on e.dept_id=d.id;

关联查询总结

  • 如果查询的数据是两个表的交际数据,使用等值连接或内连接(推荐)
  • 如果查询的是一张表的全部和另外一张表的交际则使用外连接