sql语句练习-基础篇
本文内容源自改编http://blog.csdn.net/ochangwen/article/details/51297893,
- 针对mysql数据库做了语法更改
- 个人觉得原版有些不合理之处,改了部分表结构
开始,初始化表结构与数据
- 表1,部门表
create table dept(
deptno int(10) primary key,#主键
dname varchar(30),#部门名称
loc varchar(30)#所在地
);
-表2,员工表
create table emp(
empno int(10) primary key,#empno 员工号
ename varchar(30),#ename 员工姓名
job varchar(30),#job 工作
mgr int(10),#mgr 上级编号
hiredate int(10),#hiredate 受雇日期
sal int(10),#sal 薪金
comm int(10),#comm 佣金
deptno int(10),#deptno 部门编号
foreign key(deptno) references dept(deptno)
);
- 插入以及其他语句
insert into dept values(1, '技术部' ,'南泥湾');
insert into dept values(2, 'SALES' ,'深圳市');
insert into dept values(3, '事业部' ,'北京市');
insert into dept values(4, '服务部' ,'延安');
insert into dept values(5, '生产部' ,'南京市');
insert into dept values(6, '宣传部' ,'上海市');
insert into dept values(7, '打杂部' ,'广州市');
insert into dept values(8, '司令部' ,'重庆市');
insert into dept values(9, '卫生部' ,'长沙市');
insert into dept values(10, '文化部' ,'武冈市');
insert into dept values(11, '娱乐部' ,'纽约');
insert into dept values(12, '管理部' ,'伦敦');
insert into dept values(13, '行政部' ,'天津市');
insert into emp values(1, '关羽羽', 'CLERK' ,8, 20011109, 2000, 1000, 3);
insert into emp values(2, 'SMITH', 'CLERK' ,1, 20120101, 2000, 800, 6);
insert into emp values(3, '刘备备', 'MANAGER' ,0, 20080808, 9000, 4000, 3);
insert into emp values(4, 'TOM', 'ENGINEER' ,5, 20050612, 3000, 1000, 1);
insert into emp values(5, 'Steve', 'MANAGER' ,8, 20110323, 80000, 9000, 1);
insert into emp values(6, '张飞飞', 'CLERK' ,1, 20101010, 2000, 1000, 3);
insert into emp values(7, 'SCOTT', 'CLERK' ,1, 20071204, 2000, 1000, 3);
insert into emp values(8, '老板', 'Boss' ,0, 20060603, 2000, 1000, 8);
insert into emp values(9, '曹仁人', 'SALESMAN' ,10, 20120130, 2000, 1000, 2);
insert into emp values(10, '曹操操', 'MANAGER' ,8,20090815, 2000, 1000, 2);
insert into emp values(11, '酱油哥', 'HAPI' ,0,20090215, 3, 1, 2);
drop table emp;
drop table dept;
练习语句与答案
1、列出至少有一个员工的所有部门。
select * , (select count(*) from emp e where e.deptno = d.deptno) c from dept d having c > 0
-- 方法1:有一个代表员工有关联字段数据
select d.* from dept d where exists (select 1 from emp e where e.deptno = d.deptno)
-- 方法2:得到各个部门员工数量,count > 0
select d.* from dept d where EXISTS (select 1 from emp e where e.deptno = d.deptno having count(e.deptno) > 1);-- sql02
select d.* from dept d where d.deptno in (select e.deptno from emp e GROUP BY e.deptno having count(e.deptno) > 1);-- sql03
注:sql01是查询最少一个员工,sql02,sql03是查询大于1的2种写法!
2、列出薪金比“SMITH”多的所有员工。(大于最大薪水SMITH员工)
select * from emp e where e.sal > (select sal from emp where ename = "SMITH")
3、列出所有员工的姓名及其直接上级的姓名。
select e2.ename,e1.ename from emp e1,emp e2 where e1.empno = e2.mgr
4、列出受雇日期早于其直接上级的所有员工。
select e2.empno ,e2.ename from emp e1,emp e2
where e1.hiredate < e2.hiredate and e1.empno = e2.mgr
5、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。
select * from dept d LEFT JOIN emp p on d.deptno = p.deptno
6、列出所有job为“CLERK”(办事员)的姓名及其部门名称。
select e.ename,d.dname from emp e,dept d where e.job = "CLERK" and e.deptno = d.deptno
7、列出薪金大于1500的各种工作。
select distinct(e.job) from emp e where e.sal > 1500
select e.job from emp e where e.sal > 1500 group by e.job
select e.job from emp e where e.sal > 1500 group by e.job having COUNT(e.job) = 1
8、列出在部门“SALES”(技术部)工作的员工的姓名,假定不知道销售部的部门编号。
select e.ename,d.dname from emp e,dept d where e.job = "CLERK" and e.deptno = d.deptno
select e.ename from emp e where exists (select 1 from dept d where d.dname = "技术部" and e.deptno = d.deptno)
9、列出薪金高于公司平均薪金的所有员工。
select e.ename from emp e where e.sal > (select AVG(es.sal) from emp es)
10、列出与“SCOTT”从事相同工作的所有员工。
select e.ename from emp e where e.job = (select job from emp where ename = "SCOTT") and e.ename != "SCOTT"
11、列出薪金等于"技术部"中员工的薪金的所有员工的姓名和薪金。
select e.ename and e.sal from emp e where e.sal in (select e.sal from dept d ,emp e where d.dname = "技术部" and e.deptno = d.deptno)
select e1.ename and e1.sal from emp e1 where exists (select 1 from dept d ,emp e where d.dname = "技术部" and e.deptno = d.deptno and e1.empno = e.empno)
12、列出薪金高于在"技术部"工作的所有员工的薪金的员工姓名和薪金。
select e.ename and e.sal from emp e where e.sal in (select e.ename,max(e.sal) from dept d ,emp e where d.dname = "技术部" and e.deptno = d.deptno)
13、列出在每个部门工作的员工数量、平均工资.
select d.dname, c,a from dept d left join (select e.deptno deptno,count(e.empno) c,avg(sal+comm) a from emp e group by e.deptno) t on d.deptno = t.deptno
14、列出所有员工的姓名、部门名称和工资。
select e.ename,d.dname,e.sal+e.comm sum from emp e left join dept d on d.deptno = e.deptno GROUP BY e.empno
15、列出从事同一种工作但属于不同部门的员工的一种组合。
select e1.ename,e1.job,e1.deptno ,e2.ename,e2.job,e2.deptno from emp e1 ,emp e2 where e1.job = e2.job and e1.deptno != e2.deptno limit 0,1
16、列出所有部门的详细信息和部门人数。
select d.* ,count(e.deptno) from dept d left join emp e on d.deptno = e.deptno group by e.deptno
select d.* ,( select count(*) from emp e where d.deptno = e.deptno) p from dept d
17、列出各种工作的最低工资。
select e.job,min(e.sal+e.comm) from emp e group by e.job
18、列出各个部门的MANAGER(经理)的最低薪金(job为MANAGER)。
select e.deptno,e.job,min(e.sal+e.comm) from emp e where e.job = "MANAGER" group by e.deptno;
19、列出所有员工的年工资,按年薪从低到高排序。
select e.ename ,(e.sal+e.comm) y from emp e order by y
sql语句练习-基础篇的更多相关文章
- SQL语句总结基础篇
创建数据库 CREATE DATABASE 数据库名称; 删除数据库 DROP DATABASE 数据库名称; 创建新表 create table 表名(列 类型 ,列 类型 ,..); 根据已有的表 ...
- 讲讲Linq to SQL映射(基础篇)
讲讲Linq to SQL映射(基础篇) 这篇主要讲Linq to SQL基于属性的映射.即映射数据库,映射表,映射列,映射关系,映射存储过程, 映射函数.然而创建这种映射有三种方法,他们分别是OR ...
- mysql基本sql语句大全(基础用语篇)
1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...
- SQL手工注入基础篇
0.前言 本篇博文是对SQL手工注入进行基础知识的讲解,更多进阶知识请参考进阶篇(咕咕),文中有误之处,还请各位师傅指出来.学习本篇之前,请先确保以及掌握了以下知识: 基本的SQL语句 HTTP的GE ...
- SQL系列总结——基础篇(三)
之前的两篇文章SQL系列总结:<基础篇一>, <基础篇二>已经介绍了一些基本的数据库知识.现在让我们来从头开始构建一个数据库.到管理数据库和对象. 架构开始! 1.创建 ...
- SQL语句汇总(终篇)—— 表联接与联接查询
上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需要用到表联接. 和之前的UNION组合查询不同,UNION是将不同的表组合起来,也就是纵向联接,说白了就是竖着拼起来. ...
- 常用经典SQL语句大全(基础)
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sqlserver --- 创 ...
- sql语句复习(基础-提升-技巧-经典数据开发案例-sql server配置)
1 基础 1.说明:创建数据库 CREATE DATABASE database-name charset=utf8 2.说明:删除数据库 drop database dbname 3.说明:备份sq ...
- 数据库之SQL语句查询基础
人的一生要疯狂一次,无论是为一个人,一段情,一段旅途,或一个梦想. 人没有梦想是荒废的,是漫无目的的,拥有梦想你会飞的更远. 下面我就来为大家介绍一下SQL语句的查询基础,以下使用MySchool数据 ...
随机推荐
- csrf_token之全局认证与局部认证
1.settings.py没有注释到csrf.当post请求的方式会报错. 接下来就解决问题! 1. django中间件 最多5个 - process_request 请求 - process_vie ...
- [Gradle] 输出构建 APK 的版本名到文件
android { // 输出版本名到 build 目录下的 version_name.txt 文件 applicationVariants.all { variant -> project.t ...
- Process Monitor分析某个应用行为
1.打开Process Mointor 2.点击filter-->filter 在弹出的对话框中Architecture 下拉框,选择Process Name 填写要分析的应用程序名字. 点 ...
- The Backpropagation Algorithm
https://page.mi.fu-berlin.de/rojas/neural/chapter/K7.pdf 7.1 Learning as gradient descent We saw in ...
- gitlab-runner ---CI
gitlab-runner: https://segmentfault.com/a/1190000007180257 https://mp.weixin.qq.com/s?__biz=MjM5MTA1 ...
- redis cluster 集群畅谈(二)
上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入.读写分离.实 ...
- 七夕节---hdu1215(打表求因子和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215 给你一个数n(1<=n<=50w)求n的所有因子和, 由于n的范围比较大,所以要采用 ...
- php版本管理工具composer安装及使用
类似于web前端有gulp,webpack,grunt.php也有专门的包安装管理和安装工具,即composer. composer官网:https://getcomposer.org 中文 ...
- SSL默认端口时,用http://ip:port/访问出错(转)
add by zhj: 其实就是保证https访问的port与服务器监听的port是同一port 原文:http://blog.csdn.net/ikmb/article/details/386370 ...
- Office 2003 2007 2010 配置进度 正在配置 解决方案 (转载)
在安装过Office2003.2007 或者2010之后,如果没有选择全部的组件,或者是因为安装到非系统盘,有时候打开 Office 文档的时候就会出现正在配置Office,或者Office配置进度的 ...