单表查询:

数据查询命令: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

mysql之select查询:练习的更多相关文章

  1. mysql DML select查询

    windows上的操作 1.从官网下载mysql 下载navicat,用来连接mysql的 2.打开运行启动mysql 3.在navicat上的连接打开新建连接 然后输入链接名,连接名就是用户名,自己 ...

  2. MySQL之select查询、function函数

    一.select查询 //查询某张表所有数据 select * from temp; //查询指定列和条件的数据 //查询name和age这两列,age等于22的数据 ; //as对列重命名 //as ...

  3. MySQL使用select查询时,在查询结果中增加一个字段并指定固定值

    假设需求是这样的: mysql> desc user; +-------+----------+------+-----+---------+----------------+ | Field ...

  4. mysql的select查询语句

    1.简单查询 mysql> select * from students; +------------+----------+------+------+ | id | sname | sex ...

  5. 转载《mysql 一》:mysql的select查询语句内在逻辑执行顺序

    原文:http://www.jellythink.com/archives/924 我的抱怨 我一个搞应用开发的,非要会数据库,这不是专门的数据库开发人员干的事么?话说,小公司也没有数 据库开发人员这 ...

  6. Mysql 在 select 查询时追加(添加)一个字段并指定值

    在特定时候,在 mysql 的查询结果中我们需要追加一个字段来实现某些特定的功能,这时我们可以用到以下语法来实现 值 as 字段比如我们需要给这个查询结果追加一个 xx 字段并赋值为 null ,可以 ...

  7. MYSQL—— 基础入门,select 查询涉及到的关键字组合详解(进阶篇)

    SELECT查询组合使用的关键字很多,首先将最简单常用的关键字进行区分及使用,后续再继续补充............ 以下所有的关键字组合使用,主要以两个表students与students_scor ...

  8. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  9. mysql 各种级联查询后更新(update select).

    mysql  各种级联查询后更新(update select). CREATE TABLE `tb1` (   `id` int(11) NOT NULL,   `A` varchar(100) de ...

随机推荐

  1. Leetcode 78. Subsets (backtracking) 90 subset

    using prev class Solution { List<List<Integer>> res = new ArrayList<List<Integer&g ...

  2. POJ-3067 Japan---树状数组逆序对变形

    题目链接: https://vjudge.net/problem/POJ-3067 题目大意: 日本岛东海岸与西海岸分别有N和M个城市,现在修高速公路连接东西海岸的城市,求交点个数. 解题思路: 记每 ...

  3. 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。

    寺庙和尚打水 设信号量mutex_gang, mutex_jing, gang_empty, gang_full, count分别表示使用缸互斥, 使用井互斥, 缸空, 缸满, 水桶总个数 semap ...

  4. memcache 基本操作

    输入 telnet  localhost 11211 步骤: 1.输入 set hans 0 0 3 回车 2. 输入 123  回车 3. get  hans 回车 删除操作,输入 delete h ...

  5. nginx架构分析之 模块化

    Nginx涉及到的模块分为核心模块.标准HTTP模块.可选HTTP模块.邮件服务模块以及第三方模块等五大类. 核心模块 核心模块是指Nginx服务器正常运行时必不可少的模块,它们提供了Nginx最基本 ...

  6. hadoop中compare函数

    在看hadoop  的二次排序的时候,改写了下, 加了第三个参数,  本来以为是在 public int compareTo(IntPair o) { System.out.println(" ...

  7. flexslider 图片轮播插件参数

    $(window).load(function() { $('.flexslider').flexslider({ animation: "fade", //String: Sel ...

  8. 在ubuntu中docker的简单使用(一)

    >>docker version 当运行docker version 命令出现Cannot connect to Docker daemon. Is the docker daemon r ...

  9. 关于var和ES6中的let,const的理解

    var的作用就不多说了,下面说说var的缺点: 1.var可以重复声明 var a = 1; var a = 5; console.log(a); //5 不会报错 在像这些这些严谨的语言来说,一般是 ...

  10. 你们知道SEO每天都在做什么吗?

    医院也有做SEO的,专门负责医院网站优化工作,那么医院的SEO每天都做什么呢?偶然见到一篇文章,转载来分享给大家.感觉写的很实在. 大凡做seo工作的人都知道seo工作者每天都要做大量的外链,像有些个 ...