旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

MySQL——多表查询细致引见以及实例【MySQL教程】,多表查询

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:51评论:0


导读:1.表与表之间的关联一对一:用户表和身份信息表,用户表是主表比方:男子表、女人表createtableman(midintprimarykey...

1.表与表之间的关联

一对一:用户表和身份信息表,用户表是主表
比方:男子表 、女人表

  create table man( 
   mid int primary key  auto_increment,
        mname varchar(32),
        wid int unique
    );
 create table woman(
        wid  int primary key  auto_increment,
        wname varchar(32)
    );

一对多:最常见的表关联,用户表和定单表
比方:员工表、部门表

 create table emp(
            empno int primary key  auto_increment,
            ename varchar(32),
            deptno int
        );
 create table dept(
            deptno int primary key  auto_increment,
            dname varchar(32)
        );

多对多:比方门生表和课程表,平常状况都是将多对多的关联拆分为一对多或许多对一的关联。

create table student(            sid  int primary key  auto_increment,
            sname varchar(32)
        );
insert into student (sname) values ('大拿');     
insert into student (sname) values ('唐嫣');
insert into student (sname) values ('王健林');
 create table course(
            cid int primary key  auto_increment,
            cname varchar(32)
        );
insert into course (cname) values ('语文');    
insert into course (cname) values ('数学');    
insert into course (cname) values ('英语');    
insert into course (cname) values ('化学');
create table s_c(
       cid int,        sid int
   );
 insert into s_c (sid,cid) values (1,1);    
 insert into s_c (sid,cid) values (1,2);    
 insert into s_c (sid,cid) values (1,3);    
 insert into s_c (sid,cid) values (1,4);    
 insert into s_c (sid,cid) values (2,2);    
 insert into s_c (sid,cid) values (2,4);    
 insert into s_c (sid,cid) values (3,1);    
 insert into s_c (sid,cid) values (3,3);

2.为何要运用多张表

防止涌现大批的数据的冗余。
并非表拆的越多就越好,依据实际状况举行拆分。

3.观点

同时查询多张表

4.分类

<1>兼并查询
union ,union all

兼并效果集,就是把两个select语句的查询效果兼并到一同。(相当于并集)
兼并的两个效果,列数和列的递次,类须要一致

create table emp(
       empno int primary key  auto_increment,
       ename varchar(32)
   );
create table dept(
        deptno int primary key  auto_increment,
        dname varchar(32)
    );
select * from emp  union select * from dept;    
select * from emp  union all select * from dept;

<2>衔接查询
员工表

  create table emp(
            empno int primary key auto_increment, # 员工编号
            ename varchar(32),  #员工姓名
            job varchar(32),        #员工职位
            mgr  int,                       #上级编号
            hiredate date,          #入职时刻
            sal double,                 #薪水
            comm double,                #奖金
            deptno int                  #所属部门
        );

部门表

 create table dept(
            deptno int primary key auto_increment,  #部门编号
            dname varchar(32),      #部门称号
            loc varchar(32)             #部门地点
        );

内衔接: inner join....on 、 join 、 ,
inner join 是比较运算符,只返回相符前提的行

比方:

select * from emp inner join  dept  on emp.deptno=dept.deptno;        
select * from emp e ,dept d where e.deptno = d.deptno;        
select * from emp e join dept d where e.deptno = d.deptno;

外衔接:
左外衔接:LEFT OUTER JOIN | left join ... on
代表查询,左侧行的悉数,右侧没有则null

select * from emp e LEFT OUTER JOIN  dept d ON e.deptno = d.deptno;

右外衔接: right join ... on 或许 right outer join .... on
右衔接包括right join 右表一切的行,假如左表中某行在右表没有婚配,则效果中对应的左表的部门悉数为空(null)

 select * from emp e right OUTER JOIN  dept d ON e.deptno = d.deptno;

自衔接:
自衔接就是说,在统一个数据表中,看做是两个表,示意查找每个人的指导,假如没有指导,则显现无指导
把一张表看做成两张表,一张员工表,一张指导表,都是emp表

select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;

天然衔接:natural join (join)| natural left join(同 left join) | natural right join (同 right join)

天然衔接会自动推断,以两个表中雷同的字段为衔接前提,返回查询效果。

select * from emp natural join dept;       
select * from emp NATURAL left join dept;        
select * from emp NATURAL right join dept;

注重:内衔接不写衔接前提会涌现笛卡尔积的效果,应当防止这类状况,而外衔接不写衔接前提会报错。

<3>子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)
子查询处理的题目:
谁的薪资比丛浩高???

 select * from emp where sal >(select sal from emp where ename='从浩');

定义:子查询许可把一个查询嵌套在另一个查询当中
子查询又叫做内部查询,相当于内部查询。包括内部查询的就称为外部查询。子查询的效果被主查询所运用。
注重的题目

1.括号

2.能够在主查询的where select having from 背面,都能够运用子查询

3.不能够再group by 背面运用子查询

4.主查询和子查询能够不是统一张表;只要子查询返回的值,主查询能够运用。

需求:查询部门称号是人力的员工信息
第一种体式格局:应用子查询

select * from emp where deptno=(select deptno from dept where dname='人力部');

第二种体式格局:应用关联查询

 select * from emp e,dept d where e.deptno = d.deptno and d.dname='人力部';

SQL优化:只管运用多表查询
绝大部分的子查询再终究实行的时刻他都是转换成一个多表查询来实行的。 经由过程SQL实行计划能够看出来。
经由过程SQL实行计划会发明两种体式格局实行的是一样的。

5.from背面的子查询
需求:
查询员工号 姓名 月薪

select empno,ename,sal from emp;

6.平常不在子查询中排序

7.平常先实行子查询,再去实行主查询

ANY关键字

假定any内部的查询返回效果个数是三个,如:result1,result2,result3,那末

select .... from .. where a > any(...);
->select ..... from ... where a > result1 or a >result2  or a >result3;

需求:
查询工资比1号部门中恣意一个员工高的信息

select * from emp where sal > any(select sal from emp where deptno = 1);

ALL关键字

ALL关键字与any关键字相似,只不过上面的or改成and :

select .... from .. where a > all(...);
->select ..... from ... where a > result1 and a >result2  and a >result3;

需求:
查询工资比1号部门中一切员工号的员工信息

   select * from emp where sal > all(select sal from emp where deptno = 1);

SOME关键字

some 关键字和any关键字是一样的功用。所以:

select .... from .. where a > any(...);

->select ..... from ... where a > result1 or a >result2  or a >result3;

IN关键字

IN运算符用于where表达式中,以列表向的情势支撑多个挑选。语法以下:

where column in (v1,v2,v3,.....);        
where column not in (v1,v2,v3,.....);

当in前面加上not运算符时刻,示意与in相反的意义,既不在这写列表项中挑选。

案例:
查询部门称号是人力和研发的员工

 select * from emp where deptno in   (select deptno from dept where dname='人力部' or dname='研发部')
分类: MySQL数据库

想相识更多相干题目请接见ki4网:MySQL视频教程

以上就是MySQL——多表查询细致引见以及实例的细致内容,更多请关注ki4网别的相干文章!

标签:多表查询


欢迎 发表评论: