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');
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, NULL, 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);
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);
dept (部门表)
DEPTNO (部门编号)
NAME(部门名称)
LOC(部门的地址)
emp(员工表)
EMPNO(员工编号)
ENAME(员工的名称)
JOB(工作岗位)
MGR(直接上级领导编号)
HIREDATE(入职日期)
SAL(薪资,工资)
COMM(补助)
DEPTNO(部门编号)
salgrade(薪资等级)
GRADE(薪资编号)
LOSAL(最低薪资)
HISAL(最高薪资)
1、=查询
#查询薪水为5000的员工
select* from emp where sal=5000;
#查询职位为 MANAGER 的员工的信息
select*from emp where job='MANAGER'
2、不等号的查询(<>或者!=)
## != <>
查询薪水不等于5000的员工的信息
select* from emp where sal!=5000;
查询职位不是MANAGER 的员工的信息
select*from emp where job<>'MANAGER'
3、区间条件的查询(<,<=,>,>= ,between…and)
#薪水大于1600的员工信息
select*from emp where sal>1600
#薪水在1600和3000之间的员工信息(不包含)
select*from emp where sal>=1600 and sal<3000
#BETWEEN and 是包含头尾信息
select* from emp where sal BETWEEN 1600 and 3000
4、或者(or)
## 查询部门编号为20或者30的部门信息
select*from dept where deptno=20 or deptno=30
5、包含,不包含的查询(in,not in )
select*from dept where deptno in(20,30,40)
#查询部门编号不为20也不为30的信息
select*from dept where deptno not in(20,30,40)
6、关于空的查询操作(is null ,is not null)
##null我们在做条件判断的时候不能用等号或者不等号
#查询没有补助的员工的信息
select*from emp where comm is null
#查有补助的员工的信息
select*from emp where comm is not null
7、模糊查询(like ,%_)
#模糊查询需要我们使用匹配符号 %
#要求第一个字母带有s的员工的信息
select*from emp where ename like '%s%'
#要求第二个字母带有m的员工的信息,使用_占位符操作
select*from emp where ename like '_M_T%'
#最后一个字母是N的
select*from emp where ename like '%N'
# S开头头的
select*from emp where ename like 'S%'
排序查询
order by 排序的关键字 升序 asc 降序 desc
根据员工的薪水排序(升序)
如果没有其他条件,只有一个排序的情况下,直接去掉where,并且排序一般都是放在最后执行;
#根据员工的薪水排序(升序)
select*from emp ORDER BY sal asc
#根据员工的薪水排序(降序)
select*from emp ORDER BY sal desc
#员工入职日期降序查询
select*from emp ORDER BY hiredate desc
#查询职位为MANAGER 的员工信息,并且按照薪资从高到低排序
# order by 一定放在最后
select *from emp where job='MANAGER' order by sal desc
聚合函数
SQL中存在一些聚合函数,这些特殊函数是不能直接在where后面当做条件使用的,一般使用方式为 放在返回值项(select *) 或者放在having关键字后
聚合函数包括:
#求最大值max
select MAX(sal) from emp ;
#求最小值 min
select min(sal) from emp;
#求和 sum
select sum(sal) from emp;
#求平均 avg
select avg(sal) from emp;
#求总数 count
select count(*) from emp;
去重复distinct
如果在返回值项目存在重复数据,那么可以使用distinct 关键字去除重复
#去重复(忽略人的情况下,查询公司一共有几个部门)
一般情况下,我们直接查询部门即可。这个只是做测试
# 查询不重复的字段值
select distinct deptno from emp;
分组查询 group by & having
将查询出的数据进行分组处理
关键字是 group by
#找出不同工作类别中的最高薪资 分组之后返会的查询字段一定是分组的列名或者聚合函数,
# 再加其他字段没有意义
select job, max(sal) from emp GROUP BY job
#找出不同工作类别中的最高薪资,显示的时候要求按照薪资从高到低显示
select job, max(sal) as m from emp GROUP BY job order by m desc
#求每个部门的平均薪资
select deptno,avg(sal) from emp GROUP BY deptno ;
#求每个岗位的最高薪资 ,除MANAGER之外
select job,max(sal) as m from emp GROUP BY job having job!='MANAGER'
ORDER BY m desc
注意:如果查询条件中,存在普通条件和分组或者排序,那么普通条件查询优先并且用where 执行,可以接and or等。但是不允许放在分组或者排序后用and 或者 or 等
找出每个工作岗位的平均薪水 ,要求显示平均薪水大于2000的
注意:where 条件中不能直接执行聚合函数 需要借助 having执行(放在分组后执行聚合函数)
#找出每个工作岗位的平均薪水 ,要求显示平均薪水大于2000的
select avg(sal) a,job from emp GROUP BY job having a>2000
顺序:
group by having order by
Limit关键字
在MySQL中,我们会使用limit关键字 做分页或者求前N的数
限制:
From 表名 limit n;
查询前n条
From 表名 limit m,n
从第m条开始查,查询n条
#前3条数据
select * from emp limit 3;
#查询从第4条开始,往后查3条
select* from emp limit 3,3;
# 分页查询,每一页显示5条
#第一页
select*from emp LIMIT 0,5;
#第二页
SELECT* from emp limit 5,5
## 页数index 每页显示n条
select *from emp limit (index-1)*n,n
子查询
将一个完整的SQL当做成另一个SQL的条件;<嵌套SQL>
在多表操作中,子查询是非常常见的一种查询方式;
#找出薪水比公司平均薪水高的员工,要求显示员工的名字和薪水
# 先查出平局薪资
SELECT avg(sal) a from emp;
# 将平均薪资作为查询条件
SELECT ename,sal from emp where sal>(SELECT avg(sal) a from emp);
#将平均薪资作为一张表
select ename, sal from emp ,(SELECT avg(sal) a from emp) avg
where emp.sal>avg.a
#查询每个部门最高薪资的,员工信息
#查出每个部门的最高薪资
select max(sal),deptno from emp GROUP BY deptno
# 查询每个部门最高薪资的,员工信息
select *from emp e ,
(select max(sal)m,deptno from emp GROUP BY deptno)max
where e.sal=max.m and e.deptno=max.deptno
数据库中常用的处理函数
lower 转换小写操作
upper 转换大写的操作
substr 字符串的截取
length 截取长度
round 四舍五入
replace 替代字符内容
select lower('HEELOhello')
select upper('Hhello')
select substr('hello',2,3)
select replace('man','人','*');
select round(3.5);
select length('hello')
select lower(ename) from emp;
结束---------------------------------之后提供练习的题