**SQL****查询基础练习**

SQL**查询基础练习**

1. 目标

熟悉常用的DQL语言

熟练常用的多表查询

熟练多表聚合

2. 创建数据表

3. DQL**数据查询**

CREATE TABLE employee

(

id INT,

NAME VARCHAR(20),

sex VARCHAR(10),

salary FLOAT

);

INSERT INTO employee VALUES(1,'zhangsan','male',2000),(2,'lisi','male',1000),

(3,'xiaohong','female',4000);

CREATE TABLE student(

id INT,

NAME VARCHAR(20),

chinese INT,

english INT,

math INT

);

INSERT INTO student(id, NAME, chinese, english, math)

VALUES (1, '张小明', 89, 78, 90),(2, '李进', 67, 53, 95),(3, '王五', 87, 78, 77),

(4, '李一', 88, 98, 92),(5, '李来财', 82, 84, 67),(6, '张进宝', 55, 85, 45),(7, '黄

蓉', 75, 65, 30),(7, '黄蓉', 75, 65, 30);

# 部门表

 

CREATE TABLE DEPT(

DEPTNO INT PRIMARY KEY, -- 部门编号

DNAME VARCHAR(14) , -- 部门名称

LOC VARCHAR(13) -- 部门地址

) ;

INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),

(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');

-- 查询表中所有学生的信息。

SELECT * FROM student;

-- 查询表中所有学生的姓名和对应的英语成绩。select name,

-- 过滤表中重复数据。

-- 统计每个学生的总分。

-- 在所有学生总分数上加10分特长分。

-- 使用别名表示学生分数。

-- 查询英语成绩大于90分的同学

-- 查询总分大于200分的所有同学

-- 查询英语分数在 80-90之间的同学。

-- 查询英语分数不在 80-90之间的同学。

-- 查询数学分数为89,90,91的同学。

-- 查询所有姓李的学生英语成绩。

-- 查询数学分80并且语文分80的同学。

-- 查询英语80或者总分200的同学

CREATE TABLE emp(

empno INT,

ename VARCHAR(50),

job VARCHAR(50),

mgr INT, -- 上级领导编号

hiredate DATE,-- 入职日期

sal INT,

comm INT, -- 奖金

deptno INT -- 部门编号

) ;

INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),

(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30),

(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30),

(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20),

(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30),

(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30),

(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10),

(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20),

(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10),

(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30),

(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20),

(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30),

(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20),

(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

-- 1、按员工编号升序排列不在10号部门工作的员工信息

-- 2、查询姓名第二个字母不是”A”且薪水大于800元的员工信息,按年薪降序排列

-- 3、求每个部门的平均薪水

-- 4、求各个部门的最高薪水-- 5、求每个部门每个岗位的最高薪水

-- 6、求平均薪水大于2000的部门编号

-- 7、将部门平均薪水大于1500的部门编号列出来,按部门平均薪水降序排列

-- 工资等级表

CREATE TABLE SALGRADE

(

GRADE INT, -- 工资等级

LOSAL DOUBLE, -- 最低工资

HISAL DOUBLE ); -- 最高工资

INSERT INTO SALGRADE VALUES (1,700,1200),(2,1201,1400),(3,1401,2000),

(4,2001,3000),(5,3001,9999);

-- 练习:

-- 0、求最高薪水的员工信息

-- 求大于平均薪水的员工信息

-- 1、查询部门和所属的员工

-- 2、工资水平多于smith的员工信息。

-- 3、返回员工和所属上级的姓名。

-- 4、返回雇员的雇佣日期早于其领导雇佣日期的员工及其领导姓名。

-- 5、返回从事clerk工作的员工姓名和所在部门名称。

-- 6、返回部门号,部门名称及其本部门的最低工资

-- 7、返回销售部(sales)所有员工的姓名。

-- 8、返回与SCOTT从事相同工作的员工。

# 答案

use day07;

CREATE TABLE employee

(

id INT,

NAME VARCHAR(20),

sex VARCHAR(10),

salary FLOAT

);

INSERT INTO employee

VALUES (1, 'zhangsan', 'male', 2000),

(2, 'lisi', 'male', 1000),

(3, 'xiaohong', 'female', 4000);

CREATE TABLE student

(

id INT,

NAME VARCHAR(20),

chinese INT,english INT,

math INT

);

INSERT INTO student(id, NAME, chinese, english, math)

VALUES (1, '张小明', 89, 78, 90),

(2, '李进', 67, 53, 95),

(3, '王五', 87, 78, 77),

(4, '李一', 88, 98, 92),

(5, '李来财', 82, 84, 67),

(6, '张进宝', 55, 85, 45),

(7, '黄蓉', 75, 65, 30),

(7, '黄蓉', 75, 65, 30);

CREATE TABLE emp

(

empno INT,

ename VARCHAR(50),

job VARCHAR(50), -- 岗位

mgr INT, -- 上级领导编号

hiredate DATE,-- 入职日期

sal INT, -- 月薪

comm INT, -- 奖金

deptno INT -- 部门编号

);

INSERT INTO emp

VALUES (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, NULL, 20),

(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30),

(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30),

(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, NULL, 20),

(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30),

(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, NULL, 30),

(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, NULL, 10),

(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20),

(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000, NULL, 10),

(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30),

(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, NULL, 20),

(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, NULL, 30),

(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, NULL, 20),

(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, NULL, 10);

CREATE TABLE SALGRADE

(

GRADE INT, -- 工资等级

LOSAL DOUBLE, -- 最低工资

HISAL DOUBLE

); -- 最高工资

INSERT INTO SALGRADE

VALUES (1, 700, 1200),

(2, 1201, 1400),

(3, 1401, 2000),

(4, 2001, 3000),

(5, 3001, 9999);

# 部门表

CREATE TABLE dept

(

DEPTNO INT PRIMARY KEY, -- 部门编号

DNAME VARCHAR(14), -- 部门名称LOC VARCHAR(13) -- 部门地址

);

INSERT INTO dept

VALUES (10, 'ACCOUNTING', 'NEW YORK'),

(20, 'RESEARCH', 'DALLAS'),

(30, 'SALES', 'CHICAGO'),

(40, 'OPERATIONS', 'BOSTON');

-- 查询表中所有学生的信息。

SELECT *

FROM student;

-- 查询表中所有学生的姓名和对应的英语成绩。

SELECT NAME '名字', english '英语成绩'

FROM student;

-- 过滤表中重复数据。

SELECT DISTINCT *

FROM student;

-- 统计每个学生的总分。

SELECT NAME '名字', (chinese + english + math) '总成绩'

FROM student;

-- 在所有学生总分数上加10分特长分。

SELECT NAME '名字', (chinese + english + math + 10) '总成绩'

FROM student;

-- 使用别名表示学生分数。

-- 查询英语成绩大于90分的同学

SELECT *

FROM student

WHERE english > 90;

-- 查询总分大于200分的所有同学

SELECT *

FROM student

WHERE (chinese + english + math) > 200;

-- 查询英语分数在 80-90之间的同学。

SELECT *

FROM student

WHERE english BETWEEN 80 AND 90;

-- 查询英语分数不在 80-90之间的同学。

-- 方法1

SELECT *

FROM student

WHERE NOT (english BETWEEN 80 AND 90);

-- 方法2

SELECT *

FROM student

WHERE english >90 or english<80;

-- 查询数学分数为89,90,91的同学。

SELECT *

FROM student

WHERE math IN (90, 89, 91);

-- 查询所有姓李的学生英语成绩。

SELECT NAME, english

FROM studentWHERE NAME LIKE '李%';

-- 查询数学分80并且语文分80的同学。

SELECT *

FROM student

WHERE chinese = 80

AND math = 80;

-- 查询英语98或者总分大于200的同学

SELECT *

FROM student

WHERE english = 98

OR (chinese + english + math) > 200;

-- 1、按员工编号升序排列不在10号部门工作的员工信息

select *

from emp

where deptno <> 10

order by empno;

-- 2、查询姓名第二个字母不是”A”且薪水大于800元的员工信息,按年薪降序排列

select *

from emp

where sal > 800

and ename not like '_A%'

order by 12*sal + IFNULL(comm, 0) desc; 工资需要加上奖金

-- 3、求每个部门的平均薪水

SELECT deptno, avg(sal)

from emp

group by deptno

order by deptno;

-- 4、求各个部门的最高薪水

SELECT deptno, max(sal)

from emp

group by deptno

order by deptno;

-- 5、求每个部门每个岗位的最高薪水 ----------有问题 不能用两个条件分组

SELECT deptno, job, max(sal)

from emp

group by deptno, job

order by deptno, job;

-- 6、求平均薪水大于2000的部门编号

select deptno

from emp

group by deptno

having avg(sal) > 2000;

-- 7、将部门平均薪水大于1500的部门编号列出来,按部门平均薪水降序排列

select deptno

from emp

group by deptno

having avg(sal) > 1500

order by avg(sal) desc;

-- 0、求最高薪水的员工信息

select *

from emp

where sal = (

select max(sal) as maxsalfrom emp

);

-- 求大于平均薪水的员工信息

select *

from emp

where sal > (

select avg(sal) as avgsal

from emp

);

-- 1、查询部门和所属的员工

SELECT *

FROM dept d,

emp e

WHERE d.deptno = e.deptno;

-- 2、工资水平多于smith的员工信息。

SELECT *

FROM emp

WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');

-- 3、返回员工和所属上级的姓名。

select * from emp;

SELECT e.ename as '员工姓名', m.ename as '所属上级姓名'

FROM emp e,

emp m

WHERE e.mgr = m.empno;

-- 4、返回雇员的雇佣日期早于其领导雇佣日期的员工及其领导姓名。

SELECT e.ename, m.ename

FROM emp e,

emp m

WHERE e.mgr = m.empno

AND e.HIREDATE < m.HIREDATE;

-- 5、返回从事clerk工作的员工姓名和所在部门名称。

SELECT ename, dname

FROM dept d,

emp e

WHERE d.deptno = e.deptno

AND job = 'clerk';

-- 6、返回部门号,部门名称及其本部门的最低工资   第一遍做错了 不关联查询没法查询寻min(sal)

SELECT e.deptno, d.dname, MIN(sal) as '本部门最低工资'

FROM emp e,

dept d

WHERE d.deptno = e.deptno

GROUP BY e.deptno;

-- 7、返回销售部(sales)所有员工的姓名。

SELECT e.ename

FROM emp e

where e.job = 'SALESMAN';

-- 8、返回与SCOTT从事相同工作的员工。

SELECT e.ename

FROM emp e

where e.job = (

select t.job

from emp twhere t.ename = 'SCOTT'

);

原文地址:https://www.cnblogs.com/shan13936/p/13702723.html