数据库sql语句练习巩固与强化

一、SQL简介

SQL:结构化查询语句,是一种总专门用来与数据库通信的语言。

SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。SQL尽管看上去简单,但他实际上是一种强有力的的语言,灵活使用其语言的元素,可以进行非常复杂和高级的数据库操作,接下来让我们进入学习!

 

SQL基本语法

SELECT...FROM      从...查询

WHERE...      使用什么样的条件

GROUP BY...      (sql的重点)按什么进行分组

HAVING...      做分组时按什么条件过滤,与where条件类似,但是能提供另外的子句,就是having子句

ORDER BY...      按什么来排序

二、简单说说使用group by语句需要知道的一些重要规定

  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚合函数),如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。
  • 除了聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
  • CROUP BY几句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制

三、HAVING和WHERE的差别

  1. where过滤行,having过滤分组。
  2. where在数据分组之前进行过滤,having是在分组之后过滤。
  3. where和having也会同时使用。

比如:假设要查询过去10个月内具有2个或者2个以上订单的顾客,为了达到这一点,可以增加一天where语句,过滤出过去10个月下过的订单,然后在使用having过滤出具有2个或者2个以上的订单。

为了更好的理解,请求下面的例子:列出具有2个商品(含)以上、价格为10(含)以上的产品的供应商。

select vend_id,count(*) as num_prods 
form product 
where prod_price>=10
group by vend_id
having count(*)>=2

这条语句与上面的例子很像,第一行使用聚集函数的基本select,where子句过滤prod_price至少为10的行,然后按vend_id分组,having子句过滤技术为2或者2个以上的分组。

四、sql的基本操作与进阶

现在具有两个表,一个是部门表,另一个员工表,它们的表结构如下:

第一步,建表:

emp(员工表)

create table emp(
       empno int(11) primary key comment '员工号',
       ename varchar(32) comment '员工姓名',
       job varchar(32) comment '工种',
       mgr varchar(32) comment '经理',
       hiredate number(10) comment '入职日期',
       sal int(11) comment '薪水',
       comm int(11) comment '奖金',
       deptno int(11) comment '部门编号',
       foreign key(deptno) references dept(deptno)
)

dept(部门表)

create table dept(
       deptno int(11) primary key comment '部门编号',
       dname varchar(32) comment '部门名称',
       loc varchar(32) comment '地点'
)

第二步,插入数据:

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, '行政部' ,'天津市');
select * from dept


insert into emp values(1, '关羽羽', 'CLERK' ,'刘备备', 20011109, 2000, 1000, 3);
insert into emp values(2, 'SMITH', 'CLERK' ,'刘备备', 20120101, 2000, 800, 6);
insert into emp values(3, '刘备备', 'MANAGER' ,'宋祖英', 20080808, 9000, 4000, 3);
insert into emp values(4, 'TOM', 'ENGINEER' ,'Steve', 20050612, 3000, 1000, 1);
insert into emp values(5, 'Steve', 'MANAGER' ,'宋祖英', 20110323, 80000, 9000, 1);
insert into emp values(6, '张飞飞', 'CLERK' ,'刘备备', 20101010, 2000, 1000, 3);
insert into emp values(7, 'SCOTT', 'CLERK' ,'刘备备', 20071204, 2000, 1000, 3);
insert into emp values(8, '宋祖英', 'Boss' ,'无', 20060603, 2000, 1000, 8);
insert into emp values(9, '曹仁人', 'SALESMAN' ,'曹操操', 20120130, 2000, 1000, 2);
insert into emp values(10, '曹操操', 'MANAGER' ,'宋祖英',20090815, 2000, 1000, 2);
insert into emp values(11, '酱油哥', 'HAPI' ,'XXX',20090215, 3, 1, 2);

题目:

       1、列出至少有一个员工的所有部门。

             select deptno,dname loc from dept where deptno in (select deptno from emp);

  2、列出薪金比“SMITH”多的所有员工。(大于最大薪水SMITH员工)

             select empno,ename,sal from emp where emp.sal>(select sal from emp emp1 where emp1.ename = 'SMITH')

  3、列出所有员工的姓名及其直接上级的姓名。

             select a.ename,b.ename as mgr from emp a,emp b where a.mgr=b.ename;

             解析:这里使用表的自连接方式,以a表中经理的编号与b表中的员工号连接起来,目的将员工与经理一一对应上。最后               显示的就是员工对应经理的详细信息

  4、列出受雇日期早于其直接上级的所有员工。

            select a.empno, a.ename from emp a,emp b where a.mgr=b.ename and a.hiredate<b.hiredate;

 

       5、列出部门名称和这些部门的员工信息,包括那些没有员工的部门。

            正确:select dname,e.* from dept d LEFT JOIN emp e on d.deptno = e.deptno(使用left join)

            错误:select dname,e.* FROM dept d,emp e WHERE d.deptno = e.deptno; (只选出了也有员工的部门)

  6、列出所有job为“CLERK”(办事员)的姓名及其部门名称。

            select ename,dname,job from emp e join dept d on e.deptno=d.deptno where e.job='CLERK';

  7、列出最低薪金大于1500的各种工作。

             正确:select job from emp GROUP BY job having min(sal)>1500;

             错误:select job FROM emp WHERE sal>1500

  8、列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。

 

  9、列出薪金高于公司平均薪金的所有员工。

  10、列出与“SCOTT”从事相同工作的所有员工。

  11、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。

  12、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。

  13、列出在每个部门工作的员工数量、平均工资和平均服务期限。

  14、列出所有员工的姓名、部门名称和工资。

  15、列出从事同一种工作但属于不同部门的员工的一种组合。

  16、列出所有部门的详细信息和部门人数。

  17、列出各种工作的最低工资。

  18、列出各个部门的MANAGER(经理)的最低薪金(job为MANAGER)。

  19、列出所有员工的年工资,按年薪从低到高排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值