zoukankan      html  css  js  c++  java
  • 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

    脑子不够用当然只能脚踏实地的做事情!
  • 相关阅读:
    Hive初识(一)
    图解HTTP总结(8)——确认访问用户身份的认证
    Android 7.0 照相 FileUriExposedException
    activity跳转的一些坑
    gopath配置
    android项目中记录
    一些趣味性总结(JAVA)
    http的response遇到illegalstateexception解决办法
    django demo
    Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决方法
  • 原文地址:https://www.cnblogs.com/qtclm/p/10081549.html
Copyright © 2011-2022 走看看