zoukankan      html  css  js  c++  java
  • 018.查询练习50题(sql实例)

    CREATE TABLE EMP
    (
    EMPNO numeric(5,0) NOT NULL primary key,--雇员的编号
    ENAME nvarchar(10) not null,--雇员的名字
    JOB nvarchar(9)not null,--雇员的的职位
    MGR numeric(5,0),--上级主管编号
    HIREDATE datetime,--入职(受雇)日期
    SAL numeric(7, 2),--薪金;
    COMM numeric(7, 2),--佣金;
    DEPTNO numeric(2,0)--部门编号
    )

    CREATE TABLE DEPT
    (
    DEPTNO numeric(2) primary key,--部门编号
    DNAME nvarchar(14) not null,--部门名称
    LOC部门所在地 nvarchar(13) --部门所在地
    );
    INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 7902,'2000-12-17', 800, NULL, 20);
    INSERT INTO EMP VALUES (7499, 'allen', 'SALESMAN', 7698,'2001-2-20', 1600, 300, 30);
    INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698,'2001-2-22', 1250, 500, 30);
    INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839,'2001-4-2', 2975, NULL, 20);
    INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,'2001-9-28',1250, 1400, 30);
    INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,'2001-5-1', 2850, NULL, 30);
    INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,'2001-6-9', 2450, NULL, 10);
    INSERT INTO EMP VALUES (7788, 'scott', 'ANALYST', 7566,'2002-12-9',3000, NULL, 20);
    INSERT INTO EMP VALUES (7839, 'king', 'PRESIDENT', NULL,'2001-11-17',5000, NULL, 10);
    INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,'2001-9-8', 1500, 0, 30);
    INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,'2003-1-12',1100, NULL, 20);
    INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,'2001-3-12',950, NULL, 30);
    INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,'2001-3-12',3000, NULL, 20);
    INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,'2002-01-23',1300, NULL, 10);
    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');
    SELECT *FROM EMP

    --1、查询所有的雇员名字
    SELECT ENAME FROM EMP

    --2、查询所有的部门
    SELECT DISTINCT JOB FROM EMP --DISTINCT 隐藏重复的行

    --3、查询没有佣金(COMM)的所有雇员信息
    SELECT * FROM EMP
    WHERE COMM IS NULL

    --4、查询薪金(SAL)和佣金(COMM)总数大于2000的所有雇员信息
    SELECT * FROM EMP
    WHERE SAL+ISNULL(COMM,0)>2000
    提示:isnull(列名,0) :如果该列中有空值,就把空值当做0做计算
    --5、选择部门编号=30中的雇员
    SELECT * FROM DEPT
    WHERE DEPTNO=30

    --6、列出所有Job办事员("CLERK")的姓名、编号和部门名称
    SELECT ENAME,EMPNO,DNAME FROM EMP,DEPT
    WHERE EMP.DEPTNO=DEPT.DEPTNO AND JOB='CLERK'

    --7、找出佣金高于薪金的雇员
    SELECT ENAME FROM EMP
    WHERE COMM>SAL

    --8、找出佣金高于薪金的60%的雇员
    SELECT ENAME FROM EMP
    WHERE COMM>0.6 * SAL
    --9、找出部门10中所有经理和部门20中的所有办事员的详细资料
    SELECT *FROM EMP
    WHERE JOB='MANAGER' AND DEPTNO=10 OR JOB='CLERK' AND DEPTNO =20

    --10、既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
    SELECT *FROM EMP
    WHERE JOB!='MANAGER' AND SAL>=2000 OR JOB!='CLERK' AND SAL>=2000

    --11、找出收取佣金的雇员的不同工作
    SELECT DISTINCT JOB FROM EMP
    WHERE COMM IS NOT NULL

    --12、找出不收取佣金或收取的佣金低于100的雇员
    SELECT ENAME FROM EMP
    WHERE COMM IS NULL OR COMM<100

    --13、找出早于8年之前受雇的雇员
    SELECT ENAME FROM EMP
    WHERE GETDATE()-HIREDATE>8

    --14、显示首字母大写的所有雇员的姓名
    --区分大小写:collate:指定排序规则的
    --修改表,设置大小写是否敏感, chinese_prc_ci_as 不区分大小写
    --区分大小写 chinese_prc_cs_as
    alter table emp
    alter column ename varchar(20)
    collate chinese_prc_cs_as

    select ename from emp
    where ENAME like '[A]%'

    --15、显示正好为5个字符的雇员姓名
    SELECT ENAME FROM EMP
    WHERE ENAME LIKE '_____'

    --16、显示带有'R'的雇员姓名 不区分大小写
    SELECT ENAME FROM EMP
    WHERE ENAME LIKE '%R%'

    --17、显示不带有'R'的雇员姓名
    SELECT ENAME FROM EMP
    WHERE ENAME NOT LIKE '%R%'

    --18、显示包含"A"的所有雇员的姓名及"A"在姓名字段中的位置
    -- 提示: 使用函数 charindex()
    SELECT ENAME,CHARINDEX('A',ENAME) FROM EMP
    WHERE ENAME LIKE '%A%'

    --19、显示所有雇员的姓名,用a替换所有'A'
    提示:replace()
    SELECT ENAME,REPLACE(ENAME,'A','a') FROM EMP



    --20、显示所有雇员的姓名的前三个字符
    提示:left()
    SELECT ENAME,LEFT(ENAME,3)FROM EMP

    --21、显示雇员的详细资料,按姓名排序
    --ORDER BY 排序
    SELECT * FROM EMP
    ORDER BY ENAME

    --22、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
    SELECT ENAME,HIREDATE FROM EMP
    ORDER BY HIREDATE ASC

    --23、显示所有雇员的姓名、工作和薪金,按工作降序顺序排序,
    --而工作相同的按薪金升序排序.
    SELECT ENAME,JOB,SAL FROM EMP
    ORDER BY JOB DESC,SAL ASC --如果第一个排序条件重复,则继续用第二个排序

    --24、显示在一个月为30天的情况下所有雇员的日薪金,忽略小数
    SELECT ENAME,SAL/30, CAST(SAL/30 AS INT) FROM EMP
    --CAST(xx AS 转换成什么类型)

    --25、找出在(任何年份的)2月受聘的所有雇员
    提示:month()取月,year()获取年,day()取天,datepart()获取日期时➹的某个部分
    SELECT ENAME,HIREDATE FROM EMP
    WHERE MONTH(HIREDATE)=2


    --26、对于每个雇员,显示其加入公司的天数
    提示:datediff(day,hiredate,getdate())
    获取两个时间的差值.(单位可选)
    SELECT ENAME ,DATEDIFF(DAY,HIREDATE,GETDATE())FROM EMP

    --27、列出至少有一个雇员的所有部门
    SELECT DEPTNO,COUNT(EMPNO) 人数 FROM EMP
    GROUP BY DEPTNO
    HAVING COUNT(EMPNO) IS NOT NULL

    --28、列出各种类别工作的最低工资
    SELECT JOB,MIN(SAL+ISNULL(COMM,0)) 最低工资 FROM EMP
    GROUP BY JOB

    --29、列出各个部门的MANAGER(经理)的最低薪金

    SELECT DEPTNO 部门名称,MIN(SAL) 最低薪金 FROM EMP
    WHERE JOB='MANAGER'
    GROUP BY DEPTNO

    --30、列出薪金高于公司平均水平的所有雇员
    SELECT ENAME 雇员名称 FROM EMP
    WHERE SAL>(SELECT AVG(SAL)FROM EMP)

    --31、列出各种工作类别的最低薪金,并显示最低薪金大于1500
    SELECT JOB,MIN(SAL) FROM EMP
    GROUP BY JOB
    HAVING MIN(SAL)>1500

    --32、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇 日所在月排序,将最早年份的项目排在最前面$$$$$$$$$$$$$$$
    SELECT ENAME,MONTH(HIREDATE),YEAR(HIREDATE)FROM EMP
    ORDER BY MONTH(HIREDATE) ,YEAR(HIREDATE)ASC

    --33、显示所有雇员的姓名以及满8年服务年限的日期
    SELECT ENAME,HIREDATE FROM EMP
    WHERE DATEDIFF(YEAR,HIREDATE,GETDATE())>=8
    --DATEDIFF(年/月/日,字段,GETDATE()) 时间差值

    --34、显示所有雇员的服务年限:总的年数或总的月数或总的天数
    SELECT ENAME AS 姓名,DATEDIFF(YEAR,HIREDATE ,GETDATE())AS 工作年数,
    DATEDIFF(MONTH,HIREDATE,GETDATE())AS 工作月数,DATEDIFF(DAY,HIREDATE,GETDATE())AS 工作天数
    FROM EMP

    --35、列出按计算的字段排序的所有雇员的年薪.即:按照年薪对雇 员进行排序,年薪指雇员每月的总收入总共12个月的累加
    SELECT ENAME ,SAL*12 FROM EMP
    ORDER BY SAL*12 ASC


    --36、列出年薪前5名的雇员
    SELECT TOP 5 ENAME, SAL*12 AS 年薪 FROM EMP
    ORDER BY SAL*12 DESC

    --37、列出年薪低于10000的雇员
    SELECT ENAME ,SAL*12 AS 年薪 FROM EMP
    WHERE SAL*12<10000

    --38、列出雇员的平均月薪和平均年薪
    SELECT CAST( AVG(SAL)AS INT)AS 平均月薪,CAST( AVG(SAL*12)AS INT)AS 平均年薪 FROM EMP

    --39、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门
    SELECT DNAME,ENAME FROM EMP RIGHT JOIN DEPT
    ON EMP.DEPTNO=DEPT.DEPTNO

    --40、列出每个部门的信息以及该部门中雇员的数量
    SELECT DEPT.DEPTNO,DNAME,LOC部门所在地,COUNT(EMPNO) 雇员数量 FROM EMP RIGHT JOIN DEPT
    ON EMP.DEPTNO=DEPT.DEPTNO
    GROUP BY DNAME,LOC部门所在地,DEPT.DEPTNO

    --41、列出薪金比"SMITH"多的所有雇员
    SELECT * FROM EMP
    SELECT A.ENAME,A.SAL FROM EMP AS A,EMP AS B
    WHERE A.SAL>B.SAL AND B.ENAME='SMITH'--自连接 当同一列的值相互之间进行比较时
    ORDER BY A.SAL ASC

    --42、列出所有雇员的姓名及其直接上级的姓名(自连接)$$$$$$$$$$$$$$$$$$$$$$$$$
    --自连接:就是一个表自己和自己连接,
    --注意一定要用表别名,区分它们
    --EG1:
    SELECT a.EMPNO AS 雇员,a.ENAME,a.mgr,b.EMPNO,b.ENAME AS 上级
    FROM EMP a,EMP b
    WHERE a.MGR=b.EMPNO

    --EG2:
    SELECT a.EMPNO AS 雇员,b.ENAME AS 上级
    FROM EMP a,EMP b
    WHERE a.MGR=b.EMPNO

    --EG3:
    SELECT a.ENAME 雇员,b.ENAME AS 上级
    FROM EMP a left join EMP b
    ON a.MGR=b.EMPNO

    --43、列出入职日期早于其直接上级的所有雇员$$$$$$$$$$$$$$$$$$$$$$$$$
    SELECT A.ENAME FROM EMP AS A,EMP AS B
    WHERE A.MGR=B.EMPNO AND A.HIREDATE<B.HIREDATE

    --44、列出所有办事员("CLERK")的姓名及其部门名称
    SELECT * FROM EMP,DEPT
    -- 用内连接查询
    --EG1:
    SELECT EMP.ENAME,DEPT.DNAME FROM EMP JOIN DEPT
    ON EMP.JOB='CLERK' AND EMP.DEPTNO=DEPT.DEPTNO
    --EG2:
    SELECT ENAME,DNAME FROM EMP,DEPT
    WHERE EMP.DEPTNO=DEPT.DEPTNO AND EMP.JOB='CLERK'

    --45、列出从事"SALES"(销售)工作的雇员的姓名,假定不知道 销售部的部门编号
    --EG1:
    SELECT EMP.ENAME FROM EMP JOIN DEPT
    ON EMP.DEPTNO=DEPT.DEPTNO AND DNAME='SALES'
    --EG2:
    SELECT ENAME FROM EMP,DEPT
    WHERE EMP.DEPTNO=DEPT.DEPTNO AND DEPT.DNAME='SALES'

    --46、列出与"SCOTT"从事相同工作的所有雇员
    --SELECT DISTINCT EMP.ENAME FROM EMP LEFT JOIN DEPT
    --ON EMP.DEPTNO=DEPT.DEPTNO

    --SELECT DISTINCT * FROM EMP
    SELECT B.ENAME FROM EMP AS A JOIN EMP AS B
    ON A.DEPTNO=B.DEPTNO AND A.ENAME='SCOTT'AND B.ENAME!=A.ENAME
    JOIN DEPT
    ON DEPT.DEPTNO=A.DEPTNO

    --47、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30 中任何一个雇员的薪金

    --48、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30 中所有雇员的薪金

    --49、列出从事同一种工作但属于不同部门的雇员的不同组合
    SELECT DISTINCT A.ENAME, B.ENAME FROM EMP AS A,EMP AS B
    WHERE A.JOB=B.JOB AND A.DEPTNO!=B.DEPTNO

    关注90後梦想大师,梦想从未止步.
  • 相关阅读:
    C#处理JPEG头信息
    利用WebSocket传输数组或者Blob的方案
    System.Collections命名空间下的所有接口及结构图
    C#生成影像金字塔
    C# DEM数据转换为JPEG
    C# 数值型数据转换为字节数组
    c语言实现bitmap的基本操作
    大数据spark 视频的免费连接
    Android开源应用【转】
    linux c程序中获取shell脚本输出 [转]
  • 原文地址:https://www.cnblogs.com/harveylv/p/6327002.html
Copyright © 2011-2022 走看看