MySQL从入门到精通(三)

一、建表语句

DROP TABLE IF EXISTS EMP;
DROP TABLE IF EXISTS DEPT;
DROP TABLE IF EXISTS SALGRADE;
 
CREATE TABLE DEPT
       (DEPTNO int(2) not null ,
	DNAME VARCHAR(14) ,
	LOC VARCHAR(13),
	primary key (DEPTNO)
	);
CREATE TABLE EMP
       (EMPNO int(4)  not null ,
	ENAME VARCHAR(10),
	JOB VARCHAR(9),
	MGR INT(4),
	HIREDATE DATE  DEFAULT NULL,
	SAL DOUBLE(7,2),
	COMM DOUBLE(7,2),
	primary key (EMPNO),
	DEPTNO INT(2) 
	)
	;
 
CREATE TABLE SALGRADE
      ( GRADE INT,
	LOSAL INT,
	HISAL INT );
 
 
 
 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
10, 'ACCOUNTING', 'NEW YORK'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
20, 'RESEARCH', 'DALLAS'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
30, 'SALES', 'CHICAGO'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
40, 'OPERATIONS', 'BOSTON'); 
commit;
 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7369, 'SMITH', 'CLERK', 7902,  '1980-12-17'
, 800, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7499, 'ALLEN', 'SALESMAN', 7698,  '1981-02-20'
, 1600, 300, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7521, 'WARD', 'SALESMAN', 7698,  '1981-02-22'
, 1250, 500, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7566, 'JONES', 'MANAGER', 7839,  '1981-04-02'
, 2975, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7654, 'MARTIN', 'SALESMAN', 7698,  '1981-09-28'
, 1250, 1400, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7698, 'BLAKE', 'MANAGER', 7839,  '1981-05-01'
, 2850, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7782, 'CLARK', 'MANAGER', 7839,  '1981-06-09'
, 2450, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7788, 'SCOTT', 'ANALYST', 7566,  '1987-04-19'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7839, 'KING', 'PRESIDENT', NULL,  '1981-11-17'
, 5000, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7844, 'TURNER', 'SALESMAN', 7698,  '1981-09-08'
, 1500, 0, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7876, 'ADAMS', 'CLERK', 7788,  '1987-05-23'
, 1100, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7900, 'JAMES', 'CLERK', 7698,  '1981-12-03'
, 950, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7902, 'FORD', 'ANALYST', 7566,  '1981-12-03'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7934, 'MILLER', 'CLERK', 7782,  '1982-01-23'
, 1300, NULL, 10); 
commit;
 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
1, 700, 1200); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
2, 1201, 1400); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
3, 1401, 2000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
4, 2001, 3000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
5, 3001, 9999); 
commit;

 

二、连接查询/跨表查询

在实际开发中,数据往往不是存放一张表中,而是同时存储在多张表中,这些表与表存在着关系,我们在检索数据的时候往往需要多张表联合起来检索,这种多表联合检索被称为连表查询或跨表查询

1.笛卡尔积现象

含义:若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的成绩,该现象称为笛卡尔积现象。

显示每个员工信息,并显示所属部门名称

select e.ename,d.dname from emp e,dept d;

2.连接查询根据:年代分类

2.1 SQL92语法

语法结构:select xxx from A 表名,B表名 where 表连接条件 and 数据查询条件;

查询每一个员工所在的部门名称,要求最终显示员工姓名和对应的部门名称

 select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;

缺点:表连接条件与查询条件放在一起,没有分离;

2.2 SQL99语法

语法结构:select xxx from A 表名 join B 表名 on 表的连接条件;

查询每一个员工所在的部门名称,要求最终显示员工姓名和对应的部门名称

select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno

优点:表连接独立,结构清晰,如果结果数据不满足要求,可再追加where条件进行过滤;

3. 连接查询根据:连接方式分类

3.1 内连接

定义:只连接匹配的行,即A表与B表相连接,能将匹配的记录查询出来

1)等值连接

查询员工的名称和员工所对应的部门名称

select e.ename,d.dname from emp e (inner) join dept d on e.deptno = d.deptno;

2)非等值连接

查询员工的工资等级

select e.ename,s.grade from emp e join salgrade s on e.sal between losal and hisal;

3)自连接

查询员工的名称和员工对应的领导名称

select e.ename empname,b.ename leadername from emp e join emp b on e.empno = b.mgr;

3.2 外连接

定义:A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录时,会自动模拟出null值与之匹配;

1)左外连接

定义:包含左边表的全部行(不管右边的表中是否存在与他们匹配的行),以及右边表中全部匹配的行。

2)右外连接

定义:包含右边表的全部行(不管右边的表中是否存在与他们匹配的行),以及左边表中全部匹配的行。

扫描二维码关注公众号,回复: 9025626 查看本文章

4.案例详解

4.1查询每一个员工所在的部门名称,要求最终显示员工姓名和对应的部门名称(内连接:等值)

注意:多张表查询时,通常会对表起别名,若两张表中有相同名称的字段时,该相同名称字段不知道属于哪张表中,这时需要通过对表起别名来限制该字段属于哪张表,并且提高SQL语句的效率,可读性也高。

思路分析:

1)Step 1:从<emp e员工信息表>查询出员工姓名和部门编号;

2)Step 2:从<dept d 部门信息表>查询出部门编号和部门名称;

3)Step 3:内连接等值条件:e.deptno = d.deptno

注意:在连接查询时,即使我们使用的了限制条件,但是匹配次数没有减少,只显示有效数据;

select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno

4.2 找出每一个员工对应的部门名称,要求部门名称全部显示(左/右连接)

思路分析:

1)先查询出每一个员工的部门名称

2)查询部门信息

3)右外连接条件:员工表的部门编号=部门表的部门编号

select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;
select e.ename,d.dname from dept d left outer join emp e on e.deptno = d.deptno;

注意:任何一个右外连接都可写成左外连接,任何一个左外连接都可写成右外连接;

4.3 找出每一个员工对应的部门名称,以及该员工对应的工资等级,要求显示员工姓名、部门名称、工资等级

思路分析:

1)查询出员工对应的部门编号和工资

2)查询出部门信息

3)查询出工资等级信息

4)多表连接条件:员工表与部门表连接,再与工资等级表连接

select e.ename,d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and hisal;

注意:多张表进行表连接得语法格式:

select
    xxx
from
    A表
join
    B表
on
    连接条件1
join
    C表
on
    连接条件2

三、子查询

定义:select 语句嵌套select语句被称为子查询;

注意:select子句可出现在select、from、where关键字后面

1.案例

1.1 (where后)找出薪水比公司平均薪水高的员工,要求显示员工名和薪水

思路分析:

1)找出公司的平均薪水

2)找出薪水比公司平均薪水高的员工

3)将平均薪水替换为他的查询语句

select ename,sal from emp where sal > (select avg(sal) from emp);

1.2(from后)找出每一个部门的平均薪水,并且要求显示平均薪水的薪水等级

1)根据部门分组找到每一个部门的平均薪水

2)查询出薪水等级信息

3)将第一步查询结果当作一张临时表t,然后将t表与薪水等级表进行表连接

select t.deptno,t.avgsal,s.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal order by deptno;

四、union合并(相加集合)

定义:将查询的结果集合并

注意:合并结果集的时候,查询字段个数必须相同;

4.1查询出job为MANAGER和SALESMAN的员工

select empno,ename,job from emp where job = 'MANAGER'
union
select empno,ename,job from emp where job = 'SALESMAN'

五、limit使用

作用:获取一表前几条或中间某几行数据

用法:limit起始下标m,长度n

5.1 取前5个员工信息

思路分析:

1)查询出全部员工的信息

2)使用limit取出前5个员工的信息

select * from emp limit 0,5;

5.2 找出工资排名前5的员工

思路分析:

1)按照工资降序排序

2)取前5个员工<limit出现在SQL语句的最后位置>

select ename,sal from emp order by sal desc limit 5;
发布了98 篇原创文章 · 获赞 148 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40310148/article/details/102979272
今日推荐