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数据 ...
随机推荐
- Jquery Uploadify使用参数详解
开始上传 $('#uploadify_1').uploadifyUpload(); 1 uploader uploadify.swf文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...
- You don't have permission to access
局域网内配置Discuz,web端访问server端,出现以下反馈: Forbidden You don't have permission to access / on this server. 网 ...
- Python实现Table To Point代码 分类: Python 2015-07-31 18:45 3人阅读 评论(0) 收藏
</pre><pre name="code" class="python"><span style="font-fami ...
- (ubuntu ufw)My firewall is blocking network connections from the docker container to outside
Maybe this is due to the current version, but the current answer doesn't work on my system (Docker 0 ...
- iptables,lokkit,ebtables,arptables---logrotate
iptables,lokkit,ebtables,arptables logrotate 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链. 1.PREROUTING ...
- Linux 系统默认运行级别设定
#vi /etc/inittab,将 id:5:initdefault: 改为 id:3:initdefault: Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不 ...
- mysql 数据操作 多表查询 多表连接查询 内连接
内连接:只连接匹配的行 只取两张表共同的部分,相当于利用where 过滤条件从笛卡尔积结果中筛选出了正确的结果 select * from 左表 inner join 要连接的表 on 条件 #dep ...
- java-信息安全(十八)java加密解密,签名等总结
一.基本概念 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥, 密码分析:分析密文从而推断出明文或秘钥的过程 主动攻击:入侵密码系统,采用伪造,修改,删除等手段 ...
- A题:Common Substrings(KMP应用)
原题链接 注意:2号和3号get_next()函数中next[i]赋值时的区别,一个是0,一个是1,且不能互换 #include<cstdio> #include<cstring&g ...
- vim tab设置为4个空格
为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法: 1. vim /etc/vimrc 1 set ts=4 2 set sw=4 2. vim /etc/vimrc 1 ...