mysql之select查询:练习
单表查询:
数据查询命令:select 识别要查询的列 from识别要查询的表
select 运算符:
+ 、-、*、/、 加减乘除 等于= 不等于!= 或 <> 大于等于>= 小于等于<=
通配符:%表示多个字符 _表示一个字符 *代表所有
限定查询:where子句
#基本语法:SELECT 属性1,属性2,…. FROM 表名,SELECT识别要查询的列,FROM识别要查询的表
SELECT empno,ename,jobno,hiredate FROM test_emp
#通配符*:代表所有,可以使用*代表查询表中所有列
SELECT * FROM test_emp
#在test_job表中,查询所有的基本工资
SELECT sal FROM test_job
#在test_job表中查询所有工作的基本工资sal,并在所有查询出来的结果上加上100元
SELECT sal+100 FROM test_job
SELECT sal-100 FROM test_job
SELECT sal*2 FROM test_job
SELECT sal/2 FROM test_job
#限定查询,在test_emp表中,查询员工号是20161001员工的相关信息
SELECT * FROM test_emp WHERE empno=20161001
SELECT ename FROM test_emp WHERE empno=20161001
SELECT * FROM test_emp WHERE ename="董事长"
#WHERE子句也可以使用多个限定条件
#and
SELECT * FROM test_emp WHERE empno=20161001 AND ename="董事长"
SELECT * FROM test_emp WHERE empno=20162001 AND ename="董事长"
#or
SELECT * FROM test_emp WHERE empno=20162001 OR ename="董事长"
SELECT * FROM test_emp WHERE empno=20165001 OR ename="董事长"
#查询除了员工号是20161001外的所有员工(NOT逻辑运算符号)
SELECT * FROM test_emp WHERE NOT empno=20161001
SELECT 9000/2
SELECT 9000.00/2
SELECT ROUND(9000.00/2,2)
#数学运算符号
SELECT * FROM test_emp WHERE empno>20162001
SELECT * FROM test_emp WHERE empno>=20162001
SELECT * FROM test_emp WHERE empno<20162001
SELECT * FROM test_emp WHERE empno<=20162001
SELECT * FROM test_emp WHERE empno<100000000
SELECT * FROM test_emp WHERE empno>20162001 AND empno<20164001
#查询员工号不是20161001的其他员工
SELECT * FROM test_emp WHERE empno!=20161001
#between...and...查询员工号在20162001和20164001之间的所有员工信息
SELECT * FROM test_emp WHERE empno BETWEEN 20162001 AND 20164001
SELECT * FROM test_emp WHERE empno>=20162001 AND empno<=20164001
#between...and...查询2016年3月上旬入职的所有员工信息
SELECT * FROM test_emp WHERE hiredate BETWEEN 20160301 AND 20160310
SELECT * FROM test_emp WHERE hiredate>=20160301 AND hiredate<=20160310
SELECT * FROM test_emp WHERE hiredate BETWEEN "2016-03-01" AND "2016-03-10"
#like 匹配一个字符模式,通配符%代表若干个字符,通配符_代表一个字符
#查询员工号最后三位是001的员工的所有信息
SELECT * FROM test_emp WHERE empno LIKE "2016%001"
SELECT * FROM test_emp WHERE empno LIKE "2016_001"
SELECT * FROM test_emp WHERE empno LIKE "%001"
#in 匹配列出的值
#查询员工号是20161001和20162001的员工信息
SELECT * FROM test_emp WHERE empno IN(20161001,20162001)
SELECT * FROM test_emp WHERE empno=20161001 OR empno=20162001
#is null 匹配空格
SELECT * FROM test_emp WHERE mgr IS NULL
#distinct 去重复
SELECT deptno FROM test_emp
SELECT DISTINCT deptno FROM test_emp
#设置别名 AS
SELECT empno,ename,hiredate,deptno FROM test_emp
SELECT empno 员工号,ename 姓名,hiredate 入职日期,deptno 部门号 FROM test_emp
SELECT empno AS 员工号,ename AS 姓名,hiredate AS 入职日期,deptno AS 部门号 FROM test_emp
#根据部门号来排序 order by
SELECT * FROM test_emp
SELECT * FROM test_emp ORDER BY deptno
SELECT * FROM test_emp ORDER BY deptno DESC
SELECT * FROM test_emp ORDER BY deptno ASC
#order by 根据多个属性来排序
SELECT empno,ename,mgr,hiredate,deptno,jobno FROM test_emp ORDER BY deptno,jobno
SELECT empno,ename,mgr,hiredate,deptno,jobno FROM test_emp ORDER BY deptno,jobno DESC
SELECT empno,ename,mgr,hiredate,deptno,jobno FROM test_emp ORDER BY deptno DESC,jobno DESC
#统计函数
USE learn
#count 统计表中所有的行数或是记录数或是元组数
#统计test_emp表中总员人数
SELECT COUNT(*) FROM test_emp
SELECT COUNT(empno) FROM test_emp
SELECT COUNT(empno) AS 总人数 FROM test_emp
#AVG() 求平均值
#统计test_job表中,四个岗位基本工资的平均值
SELECT AVG(sal) FROM test_job
SELECT AVG(comm) FROM test_job
#sum()求和
#统计test_job表中,四个岗位基本工资的总和
SELECT SUM(sal) FROM test_job
SELECT SUM(comm) FROM test_job
#查询董事长的工资
SELECT sal+comm 月工资 FROM test_job WHERE jobno=1
#统计test_job表中,四个岗位的月工资总和
SELECT SUM(sal+comm) 月工资总和 FROM test_job
#统计test_job表中,四个岗位基本工资的最大值
SELECT MAX(sal) FROM test_job
#统计test_job表中,四个岗位奖金的最大值
SELECT MAX(comm) FROM test_job
#统计test_job表中,四个岗位中月工资的最大值
SELECT MAX(sal+comm) FROM test_job
#min():统计最小值
#统计test_job表中,四个岗位基本工资的最小值
SELECT MIN(sal) FROM test_job
#统计test_job表中,四个岗位奖金的最小值
SELECT MIN(comm) FROM test_job
#统计test_job表中,四个岗位中月工资的最小值
SELECT MIN(sal+comm) FROM test_job
#列值拼接函数GROUP_CONCAT()
SELECT GROUP_CONCAT(jobname) FROM test_job
#指定分隔符
SELECT GROUP_CONCAT(jobname SEPARATOR '+') FROM test_job
#统计test_emp表中,每个部门的员工人数
SELECT COUNT(empno) AS 部门人数 FROM test_emp GROUP BY deptno
SELECT deptno AS 部门号, COUNT(empno) AS 部门人数 FROM test_emp GROUP BY deptno
SELECT deptno AS 部门号, COUNT(empno) AS 部门人数 FROM test_emp GROUP BY deptno HAVING COUNT(empno)>2
#统计每个部门不同职位的员工人数
SELECT deptno AS 部门号,jobno AS 职位编号,COUNT(empno) AS 总人数
FROM test_emp GROUP BY deptno,jobno
#limit 限制查询结果显示
#显示查询结果的前2行
SELECT * FROM test_emp LIMIT 2
SELECT * FROM test_emp LIMIT 2,3
======================================================================================
#upper()将小写字符转成大写字符
SELECT UPPER("zhang")
#lower(x)将x中的大写字符转成小写字母
SELECT LOWER(ename) FROM emp
SELECT LOWER("ZHANG")
#length(x) 返回X的字符个数
#在length()函数中规定:一个英文占一个字符,一个数字占一个字符,一个中文字占3个字符
SELECT LENGTH(ename) FROM emp WHERE ename="orlando"
SELECT LENGTH(ename) FROM emp WHERE empno=1001
SELECT LENGTH(job),job FROM emp WHERE empno=1001
SELECT LENGTH("ZHang")
#char_length()规定:一个中文占一个字符,一个字母和一个数字也占一个字符
SELECT CHAR_LENGTH(job),job FROM emp WHERE empno=1001
SELECT CHAR_LENGTH(ename) FROM emp WHERE empno=1001
SELECT CHAR_LENGTH("你好smith")
#replace(x,char1,char2)将x中的char1替换成Char2;大小写字母敏感
#hello, l,x-》hexx0
SELECT REPLACE(ename,"I","a"),ename FROM emp WHERE empno=1001
SELECT REPLACE(ename,"I","abc"),ename FROM emp WHERE empno=1001
SELECT REPLACE("ZHANG","ZH","w")
#substring(x,start,[length]):在x中从start指定的位置开始,返回长度为length的字符。包括边界值
#smith,2,3: mit、 ith
SELECT SUBSTRING(ename,2,3) ename FROM emp WHERE empno=1001
SELECT ename 姓名, job 职位, deptno 部门号 FROM emp WHERE SUBSTRING(ename,2,1)="A"
SELECT ename 姓名, job 职位, deptno 部门号 FROM emp WHERE ename LIKE "_A%"
SELECT SUBSTRING("contraint",2,3)
#lpad()从单词的左边用指定的字符补全到指定的长度
#lpad(x,length,char):把x从左边用char补全到length长度
#smith,10,a:aaaaasmith
SELECT LPAD(ename,10,"a"),ename FROM emp WHERE empno=1001
SELECT LPAD("li",10,"a")
#rpad()从单词的右边补齐
#smith,10,a: smithaaaaa
SELECT RPAD(ename, 10,"a"),ename FROM emp WHERE empno=1001
SELECT RPAD("li",10,"a")
#left(x,length)从x的左边返回length个字符
#smith,2:sm
SELECT LEFT(ename,2) FROM emp WHERE empno=1001
SELECT LEFT("zhang",2)
#right(x,length)从x的右边返回length个字符
SELECT RIGHT(ename,2) FROM emp WHERE empno=1001
SELECT RIGHT("zhang",2)
#concat(x,y):字符拼接函数 --xy
#concat(smith,hello):smithhello
SELECT CONCAT(ename,"hello") FROM emp WHERE empno=1001
SELECT CONCAT(ename,job) FROM emp WHERE empno=1001
SELECT CONCAT(ename,empno) FROM emp WHERE empno=1001
SELECT CONCAT("hello","lidong")
#instr(x,char):在x中char字符第一次出现的位置
INSTR("smith","i"):3
SELECT INSTR(ename,"i") FROM emp WHERE empno=1001
SELECT INSTR("lidong","D")
、
#curdate():返回当前日期,year-month-day
SELECT CURDATE()
#curtime():返回当前时间 hour-min-second
SELECT CURTIME()
SELECT CURTIME(),CURDATE()
#now():返回当前的日期和时间
SELECT NOW()
#last_day(x)查询日期x所在月份的最后一天
SELECT LAST_DAY("1900-02-01")
SELECT LAST_DAY(20160201)
#data_add(x,interval n f):
SELECT DATE_ADD("2016-02-01",INTERVAL 2 YEAR)
SELECT DATE_ADD(20160229,INTERVAL 2 DAY)
SELECT DATE_ADD(20161231,INTERVAL 2 MONTH)
#date_format():返回用户指定的日期格式
SELECT DATE_FORMAT("2016-02-01 10:10:10","%Y-%m-%d")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%y")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%Y")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%Y-%m-%d %T")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%Y-%m-%d %W")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%c")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%m")
SELECT DATE_FORMAT("2016-02-01 10:10:10","%M")
================================================================================
#abs(x):返回X的绝对值
SELECT ABS(10)
SELECT ABS(-10)
#floor(x):返回小于等于X的最大整数
SELECT FLOOR(10.9)
SELECT FLOOR(0.1)
SELECT FLOOR(-10.9)
#celling(x):返回大于等于x的最小整数
SELECT CEILING(10.1)
SELECT CEILING(-10.1)
#mod(x,y):返回x%y x除以y取余数
SELECT MOD(10,3)
#round(x):返回x的整数部分(四舍五入)
SELECT ROUND(4.6)
SELECT ROUND(4.4)
SELECT ROUND(-4.6)
SELECT ROUND(-4.4)
#round(x,y):返回x精确到小数点后y位的结果(四舍五入)
SELECT ROUND(3.1415926, 4)
SELECT ROUND(3.141543,4)
#truncate(x,y):返回x精确到小数点后y位的结果(不四舍五入)
SELECT TRUNCATE(3.1415926,4)
#greatest(x1,x2,x3...xn):返回集合中的最大值
SELECT GREATEST(3.1,3.2,3.5,3.0,2.1)
#least(x1,x2,x3...xn):返回集合中的最小值
SELECT LEAST(-1,0,0.1)
#cast(x as type):转x转换成指定的数据类型
#四舍五入,数字
SELECT CAST(1.5 AS SIGNED)
#非四舍五入,字符串类型
SELECT CAST("1.5" AS SIGNED)
#convert(x,typt):转x转换成指定的数据类型
#非四舍五入,字符串类型
SELECT CONVERT("1.5",SIGNED)
#四舍五入,数字
SELECT CONVERT(1.5,SIGNED)
#if(条件语句,x,y):条件语句如果满足为真,则返回x;条件语句如果不满足为假,则返回y
SELECT IF(100>1,199,0)
SELECT IF(100<1,199,0)
SELECT IF(100=1,199,0)
SELECT IF(1=1,199,0)
#ifnull(x,y):条件语句x如果为空,则返回Y;条件语句X不为空,则返回x
SELECT IFNULL(10,1)
SELECT IFNULL(NULL,1)
SELECT IFNULL(0,1)
SELECT IFNULL("",1)
SELECT IFNULL(" ",1)
#nullif(x,y):如果x和y相等则返回null;如果x和y不相等,则返回x
SELECT NULLIF(0,0)
SELECT NULLIF(10,11)
SELECT NULLIF(10,10.0)
SELECT NULLIF("a","b")
SELECT NULLIF("a","a")
#case when expr then x else y end: 如果条件语句满足则返回x, 否则返回y,也就是说条件语句不满足则返回y
SELECT CASE
WHEN 10>1 THEN "true"
ELSE "false"
END
SELECT CASE
WHEN 10<1 THEN "true"
ELSE "false"
END
#case x when x1 then y1 when x2 then y2 else y3 end
SELECT CASE 1
WHEN 0 THEN "lidong"
WHEN 1 THEN "fananrun"
ELSE "huangjiahong"
END
#查询test_emp表中所有员工的员工姓名
#不加where子句表示查询所有的属性值
SELECT ename FROM test_emp
#查询test_job表中年薪大于4W的职位
SELECT jobname FROM test_job WHERE (sal+comm)*12>40000
#查询test_emp表中姓张的员工信息
# 提示:员工姓名中含有“张” 这个字
SELECT * FROM test_emp WHERE ename LIKE "%张%"
#查询test_emp表中财务部员工的人数
#财务部deptno是4
SELECT COUNT(empno) FROM test_emp WHERE deptno=4
#查询test_emp表中同一天入职的员工人数,根据入职时间来分组 group by
SELECT hiredate 入职时间, COUNT(empno) 员工人数 FROM test_emp GROUP BY hiredate
#查询test_emp表中最近刚入职的员工姓名
SELECT ename FROM test_emp ORDER BY hiredate DESC LIMIT 1
SELECT hiredate, ename FROM test_emp ORDER BY hiredate DESC LIMIT 1
#查询test_emp表中2016年6月前入职的员工姓名
SELECT ename FROM test_emp WHERE hiredate<20160601
SELECT ename FROM test_emp WHERE hiredate<=20160531
SELECT hiredate,ename FROM test_emp WHERE hiredate<20160601
#定义一个课程表,属性:课程编号,课程名称,学分,主键:课程名称,使用表级定义主键
CREATE TABLE class
(
id INT,
NAME VARCHAR(20),
xuefen INT,
PRIMARY KEY(NAME)
)
SHOW TABLES
DESC class
DROP TABLE class
SHOW TABLES
#定义一个课程表,属性:课程编号,课程名称,学分,主键:课程名称,使用列级定义主键
CREATE TABLE ach
(
id INT,
NAME VARCHAR(20) PRIMARY KEY,
xuefen INT
)
#定义一个成绩表,属性:学号,课程名称,成绩,主键:学号和课程名称
#如果主键由多个属性组成,则必须定义为表级约束
CREATE TABLE chengji
(
id INT,
NAME VARCHAR(20),
score INT,
PRIMARY KEY(id,NAME)
)
###-----------------------------------------------------------------
#1、查询test_emp表中名字长度超过3个字的员工姓名
#char_length(x):规定一个汉字占一个字符
#length(x):规定一个汉字占3个字符
SELECT ename FROM test_emp WHERE CHAR_LENGTH(ename)>3
SELECT ename FROM test_emp WHERE CHAR_LENGTH(ename)>=4
SELECT ename FROM test_emp WHERE ename LIKE "____%"
#2、查询test_emp表中所有员工的名字的第一个字
SELECT SUBSTRING(ename,1,1) FROM test_emp
SELECT DISTINCT SUBSTRING(ename,1,1) FROM test_emp
SELECT LEFT(ename,1) FROM test_emp
SELECT DISTINCT LEFT(ename,1) FROM test_emp
SELECT SUBSTR(ename,1,1) FROM test_emp
SELECT DISTINCT SUBSTR(ename,1,1) FROM test_emp
#3、查询test_emp表中员工‘总经理’入职月份的最后一天日期
SELECT LAST_DAY(hiredate) FROM test_emp WHERE ename="总经理"
#4. 查询test_emp表中员工‘总经理’入职前一天的日期
SELECT DATE_ADD(hiredate,INTERVAL -1 DAY) FROM test_emp WHERE ename="总经理"
#5.查询hdzl_job表中‘部门经理’这个职位的年薪(四舍五入统计有几万)
SELECT ROUND((sal+comm)*12/10000) FROM test_job WHERE jobname="部门经理"
SELECT ROUND((sal+comm)*12,-4) FROM test_job WHERE jobname="部门经理"
SELECT CAST((sal+comm)*12/10000 AS SIGNED) FROM test_job WHERE jobname="部门经理"
#6、查询test_job表中各个职位的年薪,如果是董事长按15薪统计,总经理按13薪统计
SELECT
CASE
WHEN jobname="董事长" THEN (sal+comm)*15
WHEN jobname="总经理" THEN (sal+comm)*13
ELSE (sal+comm)*12
END AS 年薪
FROM test_job
#第一种方式
SELECT
CASE
WHEN jobname="董事长" THEN (sal+comm)*15
WHEN jobname="总经理" THEN (sal+comm)*13
ELSE (sal+comm)*12
END AS 年薪
FROM test_job
#第二种方式
SELECT
CASE jobname
WHEN "董事长" THEN (sal+comm)*15
WHEN "总经理" THEN (sal+comm)*13
ELSE (sal+comm)*12
END 年薪
FROM test_job
#第三种方式
SELECT (sal+comm)*
CASE
WHEN jobname="董事长" THEN 15
WHEN jobname="总经理" THEN 13
ELSE 12
END AS 年薪
FROM test_job
#第四种方式
SELECT (sal+comm)*
CASE jobname
WHEN "董事长" THEN 15
WHEN "总经理" THEN 13
ELSE 12
END AS 年薪
FROM test_job
——————————————————————————————————
多表查询:
#1、查询员工“技术部张经理”的月工资
#test_emp a 和test_job b
#查询月工资b.sal+b.comm
#查询的条件:a.ename="技术部张经理"
#这两张表靠a.jobno=b.jobno
#内连接,方法1
SELECT IFNULL(b.sal,0)+IFNULL(b.comm,0) FROM test_emp a,test_job b
WHERE a.jobno=b.jobno AND a.ename="技术部张经理"
#内连接,方法2
SELECT IFNULL(b.sal,0)+IFNULL(b.comm,0) FROM test_emp a
INNER JOIN test_job b ON a.jobno=b.jobno
WHERE a.ename="技术部张经理"
#左连接
SELECT IFNULL(b.sal,0)+IFNULL(b.comm,0) FROM test_emp a
LEFT JOIN test_job b ON a.jobno=b.jobno
WHERE a.ename="技术部张经理"
#右连接
SELECT IFNULL(b.sal,0)+IFNULL(b.comm,0) FROM test_emp a
RIGHT JOIN test_job b ON a.jobno=b.jobno
WHERE a.ename="技术部张经理"
#子查询
SELECT IFNULL(sal,0)+IFNULL(comm,0) FROM test_job WHERE jobno=(SELECT jobno FROM test_emp WHERE ename="技术部张经理")
#2、查询工作地点为成都的员工姓名
#用到的表:test_emp a,test_dept b
#查询员工姓名:a.ename
#查询的条件:b.loc="成都"
#这两张表靠deptno并联 a.deptno=b.deptno
#内联接,方法1
SELECT a.ename,b.loc FROM test_emp a,test_dept b
WHERE a.deptno=b.deptno AND b.loc="成都"
#内联系,方法2
SELECT a.ename,b.loc FROM test_emp a
INNER JOIN test_dept b ON a.deptno=b.deptno
WHERE b.loc="成都"
#左连接
SELECT a.ename,b.loc FROM test_emp a
LEFT JOIN test_dept b ON a.deptno=b.deptno
WHERE b.loc="成都"
#右连接
SELECT a.ename,b.loc FROM test_emp a
RIGHT JOIN test_dept b ON a.deptno=b.deptno
WHERE b.loc="成都"
#子查询
SELECT ename FROM test_emp WHERE deptno IN (SELECT deptno FROM test_dept WHERE loc="成都")
#3、查询技术部的平均工资
#用到的表 test_emp a, test_job b, test_dept c
#查询平均工资:avg(ifnull(b.sal,0)+ifnull(b.comm,0))
#查询条件:技术部 c.dname="技术部"
#表的关联靠a.deptno=c.deptno, a.jobno=b.jobno
#内连接,方法1
SELECT AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) FROM test_emp a,test_job b,test_dept c
WHERE a.deptno=c.deptno AND a.jobno=b.jobno AND c.dname="技术部"
#内连接,方法2
SELECT AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) FROM test_emp a
INNER JOIN test_job b ON a.jobno=b.jobno
INNER JOIN test_dept c ON a.deptno=c.deptno
WHERE c.dname="技术部"
#左连接
SELECT AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) FROM test_emp a
LEFT JOIN test_job b ON a.jobno=b.jobno
LEFT JOIN test_dept c ON a.deptno=c.deptno
WHERE c.dname="技术部"
#右连接
SELECT AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) FROM test_emp a
RIGHT JOIN test_job b ON a.jobno=b.jobno
RIGHT JOIN test_dept c ON a.deptno=c.deptno
WHERE c.dname="技术部"
#4、查询“技术部王职员”的领导名字
#用到的表:test_emp a (普通员工),test_emp b (领导用的表)
#查询领导的名字 b.ename
#查询条件:技术部王职员 a.ename="技术部王职员"
#两个表靠a.mgr=b.empno
#内连接,方法1
SELECT b.ename FROM test_emp a,test_emp b
WHERE a.mgr=b.empno AND a.ename="技术部王职员"
#内连接,方法2
SELECT b.ename FROM test_emp a
INNER JOIN test_emp b ON a.mgr=b.empno
WHERE a.ename="技术部王职员"
#左连接
SELECT b.ename FROM test_emp a
LEFT JOIN test_emp b ON a.mgr=b.empno
WHERE a.ename="技术部王职员"
#右连接
SELECT b.ename FROM test_emp a
RIGHT JOIN test_emp b ON a.mgr=b.empno
WHERE a.ename="技术部王职员"
#子查询
SELECT ename FROM test_emp WHERE empno=(SELECT mgr FROM test_emp WHERE ename="技术部王职员")
#08)查询工资范围在[2500,3500]范围的员工的姓名,职位,入职日期,工资
#用到的表:emp a, salary b
#查询结果:a.ename,a.job,a.hiredate, b.sal
#查询条件:b.sal between 2500 and 3500
#两张表关联:a.empno=b.empno
SELECT a.ename,a.job,a.hiredate, b.sal FROM emp a, salary b
WHERE a.empno=b.empno AND b.sal BETWEEN 2500 AND 3500
SELECT a.ename,a.job,a.hiredate, b.sal FROM emp a
INNER JOIN salary b ON a.empno=b.empno
WHERE b.sal BETWEEN 2500 AND 3500
SELECT a.ename,a.job,a.hiredate, b.sal FROM emp a
LEFT JOIN salary b ON a.empno=b.empno
WHERE b.sal<=3500 AND b.sal>=2500
11)查询每个部门的平均工资(保留2位小数)
#用到的表:emp a,salary b,dept c
#查询结果:round(avg(ifnull(b.sal,0)+ifnull(b.comm,0)),2)
#查询条件:group by c.dname
#三张表的关联:a.empno=b.empno and a.deptno=c.deptno
SELECT c.dname, ROUND(AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)),2) FROM emp a
INNER JOIN salary b ON a.empno=b.empno
INNER JOIN dept c ON a.deptno=c.deptno
GROUP BY c.dname
12)查询'ALICE'在2017年3月28日的销售额
#查询用的表:emp a, salgrade b
#查询结果: b.sum
#查询条件:a.ename="ALICE" AND b.date="2017-03-28"
#两个表关联:a.empno=b.empno
SELECT a.ename,b.sum FROM emp a,salgrade b
WHERE a.empno=b.empno AND a.ename="ALICE" AND b.date="2017-03-28"
13)查询'SHARP'在2017年3月上旬的销售额
#用到的表:emp a, salgrade b
#查询结果:sum(ifnull(b.sum,0))
#查询条件:a.ename="SHARP" and b.date<=20170310 and b.date>=20170301
#两个表关联:a.empno=b.empno
SELECT SUM(IFNULL(b.sum,0)) FROM emp a, salgrade b
WHERE a.empno=b.empno AND a.ename="SHARP" AND b.date<=20170310 AND b.date>=20170301
SELECT SUM(IFNULL(SUM,0)) FROM salgrade
WHERE empno IN (SELECT empno FROM emp WHERE ename="SHARP") AND DATE BETWEEN 20170301 AND 20170310
SELECT SUM(IFNULL(SUM,0)) FROM salgrade
WHERE empno=(SELECT empno FROM emp WHERE ename="SHARP") AND DATE BETWEEN 20170301 AND 20170310
14)查询销售一部在3月下旬的销售额
#用到的表:emp a,salgrade b,dept c
#查询结果:sum(ifnull(b.sum,0))
#查询条件:b.date BETWEEN 20170321 AND 20170331 and c.dname="销售一部"
#三张表的关联:a.empno=b.empno and a.deptno=c.deptno
SELECT SUM(IFNULL(b.sum,0)) FROM emp a
INNER JOIN salgrade b ON a.empno=b.empno
INNER JOIN dept c ON a.deptno=c.deptno
WHERE b.date BETWEEN 20170321 AND 20170331 AND c.dname="销售一部"
17)查询每个部门的销售总额,返回大于25000000的记录
#用到的表:emp a,salgrade b,dept c
#查询结果:sum(ifnull(b.sum,0))
#查询条件:sum(ifnull(b.sum,0))>25000000,group by c.dname
#三张表的关联:a.empno=b.empno and a.deptno=c.deptno
SELECT c.dname, SUM(IFNULL(b.sum,0)) FROM emp a
INNER JOIN salgrade b ON a.empno=b.empno
INNER JOIN dept c ON a.deptno=c.deptno
GROUP BY c.dname
HAVING SUM(IFNULL(b.sum,0))>25000000
SELECT SUM(IFNULL(b.sum,0)) FROM emp a
INNER JOIN salgrade b ON a.empno=b.empno
GROUP BY a.deptno
HAVING SUM(IFNULL(b.sum,0))>25000000
18)查询3月20日单日销售额大于平均销售额的员工的姓名,部门号,销售额
#用到的表:emp a,dept b,salgrade c
#查询结果:a.ename,b.deptno,c.sum
#查询条件:date=20170320 and c.sum>avg(ifnull(c.sum,0))
#三张表的关联:a.empno=c.empno and a.deptno=b.deptno
SELECT a.ename,b.deptno,c.sum FROM emp a
INNER JOIN dept b ON a.deptno=b.deptno
INNER JOIN salgrade c ON a.empno=c.empno
WHERE DATE=20170320 AND c.sum>(SELECT AVG(IFNULL(SUM,0)) FROM salgrade)
19)查询3月收入大于自己部门平均收入的员工的姓名,工资,奖金
#用到的表:emp a, salary b
#查询结果:a.ename, b.sal,b.comm
#查询条件:收入大于自己部门平均收入
收入:ifnull(b.sal,0)+IFNULL(b.comm,0)
自己部门平均收入
SELECT AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) FROM salary b
INNER JOIN emp a ON a.empno=b.empno GROUP BY a.deptno
#两个表的关联:a.empno=b.empno
SELECT a.ename, b.sal,b.comm FROM emp a,salary b,
(SELECT deptno,AVG(IFNULL(b.sal,0)+IFNULL(b.comm,0)) avgsalary FROM salary b
INNER JOIN emp a ON a.empno=b.empno GROUP BY a.deptno) avgsal
WHERE a.empno=b.empno AND a.deptno=avgsal.deptno AND IFNULL(b.sal,0)+IFNULL(b.comm,0)>avgsal.avgsalary
20)查询3月销售额在6-10位的员工的姓名,部门号,销售额
#用到的表:emp a, salgrade b
#查询结果:a.ename,a.deptno,b.sum
#查询条件:order by date desc limit 5,5
#关联:a.empno=b.empno
SELECT a.ename,a.deptno,b.sum FROM emp a
INNER JOIN salgrade b ON a.empno=b.empno
ORDER BY DATE DESC LIMIT 5,5
#用到的表:emp a, salgrade b
#查询结果:a.ename,a.deptno,sum(ifull(b.sum,0))
#查询条件:group by empno order by sum(ifull(b.sum,0)) desc limit 5,5
#关联:a.empno=b.empno
SELECT a.ename,a.deptno,SUM(IFNULL(b.sum,0)) FROM emp a
INNER JOIN salgrade b ON a.empno=b.empno
GROUP BY b.empno
ORDER BY SUM(IFNULL(b.sum,0)) DESC
LIMIT 5,5
21)查询销售二部每个员工的姓名,工资,奖金
#用到的表:emp a,salary b,dept c
#查询结果:a.ename,b.sal,b.comm
#查询条件:c.dname="销售二部"
#三张表的关联:a.empno=b.empno and a.deptno=c.deptno
SELECT a.ename,b.sal,b.comm FROM emp a
RIGHT JOIN salary b ON a.empno=b.empno
RIGHT JOIN dept c ON a.deptno=c.deptno
WHERE c.dname="销售二部"
SELECT a.ename,b.sal,b.comm FROM emp a,salary b,dept c
WHERE a.empno=b.empno AND a.deptno=c.deptno AND c.dname="销售二部"
22)查询奖金为空的员工的姓名,职位,部门号
#用到的表:emp a,salary b
#查询结果:a.ename,a.job,a.deptno
#查询条件:b.comm is null
#表的关联:a.empno=b.empno
SELECT a.ename,a.job,a.deptno FROM emp a
INNER JOIN salary b ON a.empno=b.empno
WHERE b.comm IS NULL
23)查询每个员工及其经理的姓名,没有经理的员工也查询出来
#用到的表:emp a,emp b
#查询结果:a.ename,b.ename
#查询条件:a.mgr=b.empno
#两个表的关联:a.empno=b.empno
SELECT a.ename,b.ename FROM emp a
LEFT JOIN emp b ON a.mgr=b.empno