用到的数据库创建文件
创建方法:cmd窗口打开mysql之后source sql文件路径
创建数据库
create database if not exists db1 default charset utf8;
USE db1;
-- 部门表
CREATE TABLE DEPT(
DEPTNO INT PRIMARY KEY,
DNAME VARCHAR(14), -- 部门名称
LOC VARCHAR(13)-- 部门地址
)CHARSET=UTF8,ENGINE=INNODB;
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
-- 员工表
CREATE TABLE EMP(
EMPNO INT PRIMARY KEY, -- 员工编号
ENAME VARCHAR(10), -- 员工姓名
JOB VARCHAR(9), -- 员工工作
MGR INT, -- 员工直属领导编号
HIREDATE DATE, -- 入职时间
SAL DOUBLE, -- 工资
COMM DOUBLE, -- 奖金
DEPTNO INT -- 所在部门
); -- 关联dept表
INSERT INTO EMP VALUES(7369,'SMITH','CLERK',7566,"1980-12-17",800,NULL,20);
INSERT INTO EMP VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-03',3000,2000,20);
INSERT INTO EMP VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES(7844,'TURNERS','SALESMAN',7698,'1981-09-08',1500,50,30);
INSERT INTO EMP VALUES(7876,'ADAMS','CLERK',7566,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',1250,NULL,30);
INSERT INTO EMP VALUES(7902,'FORD','CLERK',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES(7934,'MILLER','CLERK',7782,'1981-01-23',1300,NULL,10);
-- 工资等级表
CREATE TABLE SALGRADE(
GRADE INT,-- 等级
LOSAL DOUBLE, -- 最低工资
HISAL DOUBLE
); -- 最高工资
INSERT INTO SALGRADE VALUES (1,500,1000);
INSERT INTO SALGRADE VALUES (2,1001,1500);
INSERT INTO SALGRADE VALUES (3,1501,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
所练习的全部查询语句
-- 查找部门中30员工的详细信息
SELECT*
FROM emp
WHERE DEPTNO=30
-- 找出从事职员工作的员工的编号,姓名,部门号
SELECT EMPNO 编号,ENAME 姓名,DEPTNO 部门号
FROM emp
WHERE JOB='CLERK'
-- 检索出奖金多于基本工资的员工信息
SELECT*
FROM emp
WHERE COMM>SAL
-- 检索奖金多于基本工资百分之60的员工信息
SELECT *
FROM emp
WHERE COMM>SAL*0.6;
-- 找出姓名中包含A的员工信息
-- %通配符,表示0~n个任意字符
SELECT *
FROM emp
WHERE ENAME like '%A%';
-- 找出姓名以a,b,s开头的员工信息
-- 通配符^表示从开头计算
-- []通配符表示取[]内任意字符
SELECT*
FROM emp
WHERE ENAME REGEXP '^[abs]';
-- 找出名字长度为7个字符的员工信息
-- LENGTH(str)函数获取字符串长度
SELECT *
FROM emp
WHERE LENGTH(ENAME)=7;
-- 名字中不包含R字符的员工信息
SELECT*
FROM emp
WHERE ENAME NOT LIKE '%R%';
-- 返回员工的详细信息并按姓名升序排序
-- 关键字ORDER BY,其中ASC升序,DESC降序
SELECT *
FROM emp
ORDER BY ENAME ASC;
-- 返回员工的信息并按姓名降序,工资升序排列
-- 先使用的排序约束条件放在前面
SELECT *
FROM emp
ORDER BY ENAME DESC,SAL+COMM ASC;
-- 计算员工的日薪(按30天)
SELECT SAL/30 日薪
FROM emp;
-- 找出获得奖金的员工的工作
SELECT JOB
FROM emp
WHERE COMM IS NOT NULL
GROUP BY JOB;
-- 找出奖金少于100或者没有获得奖金的员工的信息。
-- NULL不可用<判断,应用IS NULL
SELECT *
FROM emp
WHERE COMM<100 or COMM is NULL;
-- 找出10部门的经理、20部门的职员 的员工信息。
SELECT*
FROM emp
WHERE DEPTNO=10 AND JOB='MANAGER' OR DEPTNO=20 AND JOB='CLERK';
-- 找出10部门的经理、20部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息。
SELECT*
FROM emp
WHERE DEPTNO=10 AND JOB='MANAGER' OR DEPTNO=20 AND JOB='CLERK' OR SAL>2000;
-- 返回部门号及其本部门的最低工资。
SELECT DEPTNO as 部门,MIN(SAL) as 最低工资
FROM emp
GROUP BY DEPTNO;
-- 查询员工姓名和年薪,并且按年薪降序排序
SELECT ENAME 员工姓名,MGR 年薪
FROM emp
ORDER BY MGR DESC
-- 返回员工工作及其从事此工作的最低工资。
SELECT MIN(SAL) 最低工资,JOB
FROM emp
GROUP BY JOB;
-- 查找和SCOTT从事相同工作的员工信息
SELECT*
FROM emp
WHERE JOB=(
SELECT JOB
FROM emp
WHERE ENAME='SCOTT'
);
-- 工资水平多于JAMES的员工信息
SELECT *
FROM emp
WHERE SAL>(
SELECT SAL
FROM emp
WHERE ENAME='JAMES'
);
-- 返回工资大于平均工资的员工信息
SELECT*
FROM emp
WHERE SAL>(
SELECT AVG(SAL)
FROM emp
);
-- 返回销售部所有员工的姓名
SELECT ENAME
FROM emp
WHERE DEPTNO=(
SELECT DEPTNO
FROM dept
WHERE DNAME='SALES'
);
-- 返回工资高于30部门所有员工工资水平的员工信息。
SELECT*
FROM emp
WHERE SAL>(
SELECT AVG(SAL)
FROM emp
WHERE DEPTNO=30
);
-- 返回拥有员工的部门名、部门号。
-- 显示内连接
SELECT dept.DNAME 部门名,emp.DEPTNO
FROM emp
INNER JOIN dept on emp.DEPTNO=dept.DEPTNO;
-- 隐式内连接
SELECT dept.DNAME,emp.DEPTNO
FROM emp,dept
WHERE emp.DEPTNO=dept.DEPTNO;
-- 返回员工的姓名,所在部门和所在部门名称
SELECT emp.ENAME,dept.DEPTNO,dept.DNAME
FROM emp,dept
WHERE emp.DEPTNO=dept.DEPTNO;
-- 返回从事职员工作的姓名和所在的部门名称
SELECT ENAME,dept.DNAME
FROM emp,dept
WHERE emp.DEPTNO=dept.DEPTNO and emp.JOB='CLERK'
-- 返回部门号,部门名,部门所在位置及其每个部门的员工总数
SELECT d1.DEPTNO,d1.DNAME,d1.LOC,e.部门员工总数
FROM dept d1,(
SELECT DEPTNO,count(*) 部门员工总数
FROM emp
GROUP BY DEPTNO
)e
WHERE d1.DEPTNO=e.DEPTNO;
-- 返回员工职员或者销售员和所属经理的姓名
SELECT e1.ENAME 员工,e2.`经理` 所属经理
FROM emp e1,(
SELECT DEPTNO,ENAME 经理
FROM emp
WHERE JOB='MANAGER'
)e2
WHERE e1.DEPTNO=e2.DEPTNO AND e1.JOB!='MANAGER';
-- 返回员工的入职日期早于其经理入职日期的员工及经理姓名
SELECT e1.ENAME 员工,e2.ENAME 经理
FROM emp e1,emp e2
WHERE e1.DEPTNO=e2.DEPTNO AND e2.JOB='MANAGER' and e1.HIREDATE<e2.HIREDATE;
-- 返回最高工资和最低工资的职员信息
SELECT e1.EMPNO,e1.ENAME,e1.JOB,e1.MGR,e1.HIREDATE,e1.SAL,e1.COMM,e1.DEPTNO
FROM emp e1,(
SELECT MAX(SAL) 最高工资,MIN(SAL) 最低工资
FROM emp
)e2
WHERE e1.SAL=e2.`最低工资` OR e1.SAL=e2.`最高工资`;
-- 返回工资处于第四级别的员工的姓名和工资
SELECT ENAME,SAL
FROM salgrade s1,emp e1
WHERE e1.SAL>s1.LOSAL and e1.SAL<s1.HISAL and s1.GRADE=4;
-- 场景:查询平均工资高于2000置为名称和平均工资
SELECT JOB 职位名称,AVG(SAL) 平均工资
FROM emp
GROUP BY 职位名称
HAVING 平均工资>2000
/**
from之后的子查询通常是一张多行多列的为表
多行多列的子查询通常放在from之后where之前
伪表必须定义别名,否则无法执行查询
工作中通常不需要写having,因为它内存消耗很大,而是使用子查询,
将having后面的条件放在夫查询的from后面
父查询SELECT后面的列查询实际式查询了子查询的列别名
即通过FRom后面的语句生成一张临时表,然后在这个临时的表中查数据
**/
SELECT 职位名称,平均工资
FROM(
SELECT JOB 职位名称,AVG(SAL) 平均工资
FROM emp
GROUP BY 职位名称
)e
WHERE 平均工资>2000;
-- 查找部门编号,部门名字,部门地址,部门人数,部门平均工资
SELECT d.DEPTNO 部门编号,d.DNAME 部门名字,d.LOC 部门地址,e.部门人数,e.`平均工资`
FROM dept d,(
SELECT DEPTNO,count(*) 部门人数,AVG(SAL) 平均工资
FROM emp
GROUP BY DEPTNO
)e
WHERE d.DEPTNO=e.DEPTNO;
-- 查询所有在销售部工作的 员工标号,姓名,基本工资,奖金,职位,入职日期 部门最高和最低工资
SELECT e1.empno,e1.ename,e1.sal,e1.comm,e1.job,e1.HIREDATE,e2.`部门最低工资`,e2.`部门最高工资`
FROM emp e1,(
SELECT DEPTNO,max(SAL) 部门最高工资,min(SAL) 部门最低工资
FROM emp
GROUP BY DEPTNO
)e2
WHERE e1.DEPTNO=e2.DEPTNO and e1.DEPTNO=(
SELECT DEPTNO
FROM dept
WHERE dname='SALES'
)