创建表

CREATE TABLE DEPT(
DEPTNO int(2) PRIMARY KEY,
DNAME VARCHAR(14) ,
LOC VARCHAR(13) ) ; 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(4) primary key ,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR int(4),
HIREDATE DATE,
SAL decimal(7,2),
COMM decimal(7,2),
DEPTNO int(2),
foreign key (DEPTNO) references DEPT (DEPTNO)
); INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,'1985-5-1',2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,'1987-6-12',3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,'1987-6-13',1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,'1981-12-3', 950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,'1981-12-3' ,3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,'1982-1-23', 1300,NULL,10); CREATE TABLE BONUS
(
ENAME VARCHAR(10) ,
JOB VARCHAR(9) ,
SAL int,
COMM int
) ; CREATE TABLE SALGRADE
( GRADE int,
LOSAL int,
HISAL int ); INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

表结构

dept

emp

salgrade

bonus

=========================================

开始查询练习(单表查询)

1.查询所有岗位名称

select DISTINCT  JOB  from EMP ;

2.查询所有年薪超过30000的员工信息

select e.ENAME ,( e.SAL)*12 as totalsal from EMP e where (e.SAL)*12 > 30000;

3.查询所有没有奖金的员工信息 
select * from EMP where (COMM is NULL OR COMM = 0);

4.查询所有有奖金的员工信息

select * from EMP where (COMM is not NULL and comm !=0);

5.查询所有薪水在2000-4000范围内的员工信息 [not between]
select * from EMP where SAL BETWEEN 2000 AND 4000;

6.查询所有部门编号是10或30的员工信息  [not in]
select * from EMP where DEPTNO IN (10,30);

select * from EMP where emp.DEPTNO=10 or emp.DEPTNO=30;

7.查询姓名里面包含ALL的员工姓名

select ENAME from EMP WHERE ENAME LIKE ‘%ALL%’;

8.查询所有以”S”开头的同学 
select * from EMP WHERE ENAME LIKE ‘S%’;

9.查询第三个字母为A的员工姓名 (_为占位符号)
select ENAME from EMP WHERE ENAME LIKE '__A%';

10.查询所有员工信息,按照部门降序排列,部门内按照薪水升序排列 
select * from EMP ORDER BY DEPTNO DESC,SAL ASC;

11.查询雇员表中,姓名为SMITH的雇员,截止到今天共工作了多少周

SELECT ROUND (datediff(now(),HIREDATE)/7) AS  Weeks  FROM EMP WHERE ENAME = 'SMITH';

【mysql日期函数详细参考:https://www.cnblogs.com/ggjucheng/p/3352280.html】

MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

MySQL 为日期减去一个时间间隔:date_sub()

 
mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+
 

MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year); select date_add(@dt, interval -1 day); -- sub 1 day
 MySQL 时间戳(timestamp)转换、增、减函数:
 
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01 select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00 MySQL timestampadd() 函数类似于 date_add()。
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12 select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
 

mysql时区

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

12.查询‘SMITH’的领导姓名 
SELECT ENAME FROM EMP WHERE EMPNO = (SELECT MGR FROM EMP WHERE ENAME = ‘SMITH’);  推荐子查询

select a.* from emp b,emp a where b.ENAME='SMITH'and b.MGR=a.EMPNO


13.查询部门名称是‘SALES’的员工信息

select * from emp where emp.DEPTNO = (select d.DEPTNO from dept d where d.DNAME='SALES');

 

14.查询公司中薪水最高的员工信息

select * from emp e where e.SAL=(select max(SAL) from emp);

15.查询各部门的平均薪水及部门编号,要求只有员工姓名中包含 ‘A’才参与统计,只列出平均薪水>1500的,按照平均薪水降序排列 【group by 分组后的条件只能用 having】

select avg(e.sal),e.DEPTNO from emp e where e.ENAME like '%A%'group by e.DEPTNO having avg(e.sal)>1500 order by avg(e.sal) desc;

 

16.查询各部门最高薪水的员工信息

create view vi as select max(emp.SAL) sal, emp.DEPTNO from emp group by emp.DEPTNO;
select f.* from emp f ,vi v where f.SAL= v.sal and f.DEPTNO = v.DEPTNO; or 【in 双向匹配】 select * from EMP where (deptno,SAL) in (select deptno,MAX(sal) from emp GROUP BY DEPTNO);

17.查询薪水大于该部门平均薪水的员工信息 

 select * from emp f where f.sal > (select avg(e.sal)  from emp e where e.DEPTNO = f.DEPTNO  ) 

18.查询薪水等级为4的员工信息

select * from emp e where e.sal between (select g.LOSAL from salgrade g where g.GRADE=4) and (select g.HISAL from salgrade g where g.GRADE=4);

19.查询领导者是‘BLAKE’的员工信息

select * from emp e where e.MGR=(select f.EMPNO from emp f where f.ENAME='BLAKE');

20.查询不是领导的员工信息 【ifnull() ,not exists】

select * from emp e1 where not EXISTS (select * from emp e2 where e2.mgr = e1.empno);

or

select * from emp e where e.EMPNO not in (select ifnull(f.mgr,0) from emp f );

IFNULL(expr1,expr2)

如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。 是有问题的,0不是null

 

21.查询平均工资比10部门低的部门编号 

select  e.DEPTNO,avg(e.sal) from  emp e  group by  e.DEPTNO having avg(e.sal) < (select avg(f.sal) from emp f where f.deptno='10');

22.查询在纽约工作的所有员工 

select * from emp e where e.DEPTNO = (select d.DEPTNO from dept d where d.LOC='NEW YORK')

23.查询‘SALES’部门平均薪水的等级 

select s.GRADE from salgrade s where

(select avg(e.sal) avgsal from emp e where e.DEPTNO = (select d.DEPTNO from dept d where d.DNAME='SALES')) between s.LOSAL and s.HISAL;

24.查询10号部门的员工在整个公司中所占的比例 【dual】

select (select count(*) from emp e where e.DEPTNO='10')/(select count(*) from emp) FROM dual

25.每页显示5条。 limit[m,n] m起始页 n每页显示数
显示第一页内容:

select  EMP.* from emp where 1=1 limit 0,5

显示第二页的内容:

select * from emp where 1=1   limit 5,5;

26.查询所有领导的信息:要求使用exists关键字【exists 和 in的区别】

select e.* from emp e  where e.EMPNO in (select f.MGR from emp f);

select * from emp e1 where EXISTS (select * from emp e2 where e2.mgr = e1.empno);

“外层查询表小于子查询表,则用exists,外层查询表大于子查询表,则用in,如果外层和子查询表差不多,则爱用哪个用哪个。”

  

mysql基础(三)——中级查询的更多相关文章

  1. 04 mysql 基础三 (进阶)

    mysql 基础三 阶段一 mysql 单表查询 1.查询所有记录 select * from department; ​ select * from student; ​ select * from ...

  2. MySQL基础架构之查询语句执行流程

    这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的. 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条 ...

  3. mysql基础三(视图、触发器、函数、存储过程、事务、防注入)

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 -格式:CREATE ...

  4. mysql数据库(三):查询的其他用法

    一. 查询—IN的用法 语法:select ... from 表名 where 字段 a in (值b, 值c, 值d...) 等价于 select ... from 表名 where 字段a=值b ...

  5. MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)

    注:该MySql系列博客仅为个人学习笔记. 同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作 ...

  6. MySQL基础7-分页查询

    1.分页查询(MySQL特有的,oracle中没有) 栗子1: 每页最多3条记录:pageSize=3:第一页:SELECT * FROM product LIMIT 0,3第二页:SELECT * ...

  7. MySQL基础语句(查询)

    students表 id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 3 1 小军 M 88 4 1 小米 F 73 5 2 小白 F 81 ...

  8. 10. MySQL基础-02条件查询、排序查询

    2. 条件查询 语法 ​ select 查询列表 from 表名 where 筛选条件: 分类 按条件表达式筛选 简单的条件运算符:> < = != <> >= ⇐ 按逻 ...

  9. MySQL基础6-分组查询

    1.分组函数 需求20:查询所有商品平均零售价SELECT AVG(salePrice) FROM product 需求21:查询商品总记录数SELECT COUNT(id) count FROM p ...

随机推荐

  1. 解释JS变量作用域的范例

    JS的变量作用域只有两种:全局作用域与函数作用域. 用var声明的变量不能简单的说是属于函数作用域,应该是说属于其最近的作用域. var a = 10; function test(){ var a; ...

  2. 使用 D: 盘作为 Windows VM 上的数据驱动器

    如果应用程序需要使用 D 盘存储数据,请按照以下说明使用其他驱动器号作为临时磁盘. 切勿使用临时磁盘来存储需要保存的数据. 如果调整虚拟机大小或停止(解除分配)虚拟机,这可能会触发将虚拟机放置于新虚拟 ...

  3. 为 Azure Resource Manager 中的虚拟机设置 WinRM 访问权限

    Azure 服务管理中的 WinRM 与 Azure Resource Manager Note Azure 具有用于创建和处理资源的两个不同的部署模型:Resource Manager 和经典. 本 ...

  4. Windows7系统中怎么Ping端口?利用telnet命令Ping 端口的方法

    telnet www.baidu.com 80 端口打开的情况下,链接成功,则进入Telnet页面(全黑的),证明端口可用.

  5. EntityFramework Code-First 简易教程(三)-------数据库初始化

    现在我们来学习,当数据库初始化的时候,Code First怎样设置数据库的名字. 下面的图显示了数据库初始化的工作流程,根据传入给context基类的构造函数的参数来初始化: 根据上面的图,conte ...

  6. C# MVC 使用 CKEditor图片上传 提示“不正确的服务器响应”

    重点:看一下你使用的CKEditor版本 过程: 后台需要一款富文本编辑器.经过挑选后,最后选择了FCKEditor 的升级版 CKEditor .在官网下载了4.10.1版本. 经过一番配置后,富文 ...

  7. PyQt5--InputDiaglog

    # -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...

  8. PyQt5--CustomizeSignal

    # -*- coding:utf-8 -*- ''' Created on Sep 14, 2018 @author: SaShuangYiBing Comment: This example is ...

  9. Redis系列二:reids介绍

    一.什么是redis.redis有哪些特性.redis有哪些应用场景.redis的版本 1. 什么是redis redis是一种基于键值对(key-value)数据库,其中value可以为string ...

  10. 修改Lotus notes默认浏览器

    notes收到的邮件里面的链接,点了以后会自动在notes里打开,但notes很弱,加载页面总是有问题.怎么才能让他默认用ie浏览器打开呢,怎么设置,请教达人. 右下角有个office->Edi ...