• Sql50语句小练


    N多年前的练习库,偶尔看看、动动手、清爽一下:

      1 create database  company
      2 
      3 CREATE TABLE EMP
      4 (
      5 EMPNO numeric(5,0) NOT NULL primary key,--雇员的编号
      6 ENAME nvarchar(10) not null,--雇员的名字
      7 JOB nvarchar(9)not null,--雇员的的职位
      8 MGR numeric(5,0),--上级主管编号        
      9 HIREDATE datetime,--入职(受雇)日期    
     10 SAL numeric(7, 2),--薪金;
     11 COMM numeric(7, 2),--佣金;
     12 DEPTNO numeric(2,0)--部门编号 
     13 )
     14 go
     15 CREATE TABLE DEPT
     16 (
     17 DEPTNO numeric(2) primary key,--部门编号
     18 DNAME nvarchar(14) not null,--部门名称
     19 LOC部门所在地 nvarchar(13) --部门所在地
     20 );
     21 INSERT INTO EMP VALUES (7369, 'SMITH',  'CLERK',     7902,'2000-12-17', 800, NULL, 20);
     22 INSERT INTO EMP VALUES (7499, 'allen',  'SALESMAN',  7698,'2001-2-20', 1600,  300, 30);
     23 INSERT INTO EMP VALUES (7521, 'WARD',   'SALESMAN',  7698,'2001-2-22', 1250,  500, 30);
     24 INSERT INTO EMP VALUES (7566, 'JONES',  'MANAGER',   7839,'2001-4-2',  2975, NULL, 20);
     25 INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN',  7698,'2001-9-28',1250, 1400, 30);
     26 INSERT INTO EMP VALUES (7698, 'BLAKE',  'MANAGER',   7839,'2001-5-1',  2850, NULL, 30);
     27 INSERT INTO EMP VALUES (7782, 'CLARK',  'MANAGER',   7839,'2001-6-9', 2450, NULL, 10);
     28 INSERT INTO EMP VALUES (7788, 'scott',  'ANALYST',   7566,'2002-12-9',3000, NULL, 20);
     29 INSERT INTO EMP VALUES (7839, 'king',   'PRESIDENT', NULL,'2001-11-17',5000, NULL, 10);
     30 INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN',  7698,'2001-9-8', 1500,    0, 30);
     31 INSERT INTO EMP VALUES (7876, 'ADAMS',  'CLERK',     7788,'2003-1-12',1100, NULL, 20);
     32 INSERT INTO EMP VALUES (7900, 'JAMES',  'CLERK',     7698,'2001-3-12',950, NULL, 30);
     33 INSERT INTO EMP VALUES (7902, 'FORD',   'ANALYST',   7566,'2001-3-12',3000, NULL, 20);
     34 INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK',     7782,'2002-01-23',1300, NULL, 10);
     35 INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
     36 INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
     37 INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
     38 INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
     39 --左外链接
     40 select e.*,d.*,ename from EMP e left join DEPT d on e.DEPTNO=d.DEPTNO
     41 --右外链接
     42 select e.*,d.*,ename from EMP e right join DEPT d on e.DEPTNO=d.DEPTNO
     43 --全链接
     44 select e.*,d.*,ename from EMP e full join DEPT d on e.DEPTNO=d.DEPTNO
     45 --内链接
     46 select e.*,d.* from EMP e ,DEPT d where e.DEPTNO=d.DEPTNO 
     47 
     48 select e.*,d.* from EMP e inner join DEPT d  on e.DEPTNO=d.DEPTNO where SAL>1500
     49 --全链接/交叉链接
     50 select e.*,d.* from EMP e cross join DEPT d 
     51 --多表链接
     52 
     53  --查询EMP表中第6-10行数据(有主键且主键不一定连续)
     54  select * from emp
     55  select top 5* from EMP
     56  where EMPNO not in (select top 5 EMPNO from EMP)--not in刨除前5条
     57  
     58 
     59 --1、查询所有的雇员名字
     60 use company
     61 select ENAME from EMP
     62 
     63 --2、查询所有的部门
     64 SELECT DNAME FROM DEPT
     65 
     66 --3、查询没有佣金(COMM)的所有雇员信息
     67 select * from emp 
     68 SELECT * from emp where comm is null
     69 
     70 --4、查询薪金(SAL)和佣金(COMM)总数大于2000的所有雇员信息
     71  select * from EMP
     72  where SAL+COMM>2000
     73 
     74 --5、选择部门编号=30中的雇员
     75 SELECT * FROM EMP WHERE DEPTNO=30
     76 
     77 
     78 --6、列出所有Job办事员("CLERK")的姓名、编号和部门名称
     79 SELECT ENAME,EMPNO,DEPTNO FROM EMP WHERE JOB='CLERK'
     80 
     81 
     82 --7、找出佣金高于薪金的雇员
     83 select * from EMP where COMM>sal
     84 
     85 --8、找出佣金高于薪金的60%的雇员
     86 select * from EMP where COMM>(SAL*0.6)
     87 
     88 --9、找出部门10中所有经理和部门20中的所有办事员的详细资料
     89 select * from emp
     90 where DEPTNO=10 and job='manager' or  job='clerk' and DEPTNO=20
     91 
     92 --10、找出部门10中所有经理、部门20中所有办事员.
     93 select ENAME from emp
     94 where DEPTNO=10 and job='manager' or  job='clerk' and DEPTNO=20 
     95 go
     96 
     97 --既不是经理又不是办事员但其薪金>=2000的所有雇员的详细资料
     98 select * from EMP where job!='clark' and job!='manager' and SAL>=2000
     99 go
    100 
    101 --11、找出收取佣金的雇员的不同工作
    102 select e.JOB from EMP e where COMM is not null group by job
    103 
    104 --12、找出不收取佣金或收取的佣金低于100的雇员
    105 select * from EMP where COMM is null or COMM<100
    106 
    107 --13、找出早于8年之前受雇的雇员DATEADD(MONTH ,-8,HIREDATE )
    108 select  e.ENAME,e.HIREDATE from EMP e where HIREDATE<=DATEADD(YEAR ,-8,GETDATE())
    109 select  * from EMP
    110 --14、显示首字母大写的所有雇员的姓名
    111 alter table emp
    112 alter column ename varchar(20)
    113 collate chinese_prc_cs_as
    114 select e.ENAME from EMP e where e.ENAME like '[ABCDEFGH]%'
    115 
    116 --15、显示正好为5个字符的雇员姓名
    117 select e.ENAME from EMP e where e.ENAME like '_____'
    118 
    119 
    120 --16、显示带有'R'的雇员姓名 不区分大小写
    121 select e.ENAME from EMP e where e.ENAME like '%R%'
    122 
    123 --区分大小写
    124 
    125 --collate:指定排序规则的
    126 
    127 --修改表,设置大小写是否敏感, chinese_prc_ci_as 不区分大小写
    128 
    129 --区分大小写 chinese_prc_cs_as
    130 alter table emp
    131 alter column ename varchar(20)
    132 collate chinese_prc_cs_as--区分中国大陆地区大小写,默认不分大小写
    133 
    134 select ename from emp
    135 where ENAME like '[S]%'--[az]
    136 
    137 --17、显示不带有'R'的雇员姓名
    138 alter table emp
    139 alter column ename varchar(20)
    140 collate chinese_prc_cs_as
    141 select e.ENAME from EMP e where e.ENAME not like '%R%'
    142 
    143 
    144 
    145 --18、显示包含"A"的所有雇员的姓名及"A"在姓名字段中的位置
    146      -- 提示: 使用函数 charindex()  
    147 select e.ENAME ,CHARINDEX('A',ENAME) from EMP e where e.ENAME  like '%A%'
    148 
    149 
    150 
    151 
    152 --19、显示所有雇员的姓名,用a替换所有'A' Eg: select  replace('abc','a','x') 
    153 select REPLACE(ENAME,'A','a') from EMP e   
    154 
    155 
    156 --20、显示所有雇员的姓名的前三个字符,SUBSTRING(string,start_position,length)
    157 select e.ENAME,SUBSTRING(ename,1,3) from EMP e
    158 
    159 
    160 
    161 --21、显示雇员的详细资料,按姓名排序
    162 select * from emp e order by e.ENAME desc 
    163 
    164 
    165 
    166 
    167 --22、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
    168 select e.ENAME,e.HIREDATE from EMP e order by (hiredate) asc
    169 
    170 
    171 
    172 
    173 --23、显示所有雇员的姓名、工作和薪金,按工作降序顺序排序,
    174 --而工作相同的按薪金升序排序.
    175 select e.ENAME,e.JOB,e.SAL   from EMP e order by JOB desc ,SAL
    176 
    177 
    178 
    179 --24、显示在一个月为30天的情况下所有雇员的日薪金,忽略小数
    180     select e.ENAME,cast(sal/30  as int)from EMP e
    181 
    182 
    183 
    184 
    185 
    186 --25、找出在(任何年份的)2月受聘的所有雇员
    187 select * from EMP where month(hiredate) like '2'
    188 
    189 
    190 --26、对于每个雇员,显示其加入公司的天数
    191  select ENAME,DATEDIFF(day,hiredate,getdate()) 总天数 from EMP
    192 
    193 
    194 --27、列出至少有一个雇员的所有部门(编号)
    195 select * from EMP
    196 select DEPTNO from EMP group by DEPTNO having COUNT(*)>0
    197 
    198 --28、列出各种类别工作的最低工资
    199 select min(sal),job from EMP group by job 
    200 
    201 --29、列出各个部门的MANAGER(经理)的最低薪金
    202 select MIN(sal),deptno from EMP where JOB='manager' group by DEPTNO 
    203 
    204 
    205 --30、列出薪金高于公司平均水平的所有雇员(提示:子查询)
    206 --select EMP.* from EMP where SAL>1000
    207 select * from EMP where sal>(select AVG(sal) from EMP)
    208 
    209 --31、列出各种工作类别的最低薪金,并使最低薪金大于1500
    210 select min(SAL),JOB from EMP e where e.SAL>1500 group by JOB 
    211 
    212 --32、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇 日所在月排序,将最早年份的项目排在最前面$$$$$$$$$$$$$$$
    213 
    214 select YEAR(hiredate),MONTH(hiredate),DAY(hiredate) from EMP order by YEAR(hiredate) asc
    215 
    216 --33、显示所有雇员的姓名以及满8年服务年限的日期
    217 select  e.ENAME,e.HIREDATE ,year(hiredate)+8 as 满八年 from EMP e 
    218 
    219 --34、显示所有雇员的服务年限:总的年数或总的月数或总的天数
    220 select EMP.ENAME,DateDiff(year,HIREDATE,getdate()) 总年数 ,
    221        DateDiff(MONTH,HIREDATE,getdate()) 总月数,
    222        DateDiff(DAY,HIREDATE,getdate()) 总天数
    223   from EMP 
    224 
    225 
    226 
    227 --35、列出按计算的字段排序的所有雇员的年薪.即:按照年薪对雇 员进行排序,年薪指雇员每月的总收入总共12个月的累加
    228 
    229 select   e.ENAME,e.SAL*12 as 年薪   from  EMP e order by SAL asc
    230 
    231 --36、列出年薪前5名的雇员
    232 select   top 5 e.ENAME ,e.SAL,e.JOB from EMP e order by SAL desc
    233 
    234 
    235 
    236 --37、列出年薪低于10000的雇员
    237 --isnull(列名,0) :如果该列中有空值,就把空值当做0做计算
    238 
    239 select e.ENAME ,e.SAL from EMP e where SAL*12<10000
    240 
    241 
    242 
    243 --38、列出雇员的平均月薪和平均年薪
    244 select AVG(sal) 平均月薪 ,avg(SAL*12) 平均年薪 from EMP e
    245 
    246 
    247 --39、列出部门名称和这些部门的雇员,同时列出那些没有雇员的部门
    248 select   e.ENAME 雇员,d.DNAME 部门 from EMP e left join DEPT d on e.DEPTNO=d.DEPTNO
    249 
    250 
    251 
    252 
    253 --40、列出每个部门的信息以及该部门中雇员的数量
    254 SELECT D.DEPTNO,D.DNAME,D.LOC部门所在地,COUNT(EMPNO)
    255 FROM DEPT D left JOIN EMP E--inner join不能完全显示
    256 ON E.DEPTNO=D.DEPTNO 
    257 GROUP BY  D.DEPTNO,D.DNAME,D.LOC部门所在地 
    258 
    259 
    260 --41、列出薪金比"SMITH"多的所有雇员(子查询)
    261 SELECT EMP.ENAME FROM EMP
    262 SELECT e.ENAME   FROM EMP e where SAL>(select e.SAL from EMP e where e.ENAME='SMITH') 
    263 
    264 
    265 --42、列出所有雇员的姓名及其直接上级的姓名(自连接)$$$$$$$$$$$$$$$$$$$$$$$$$
    266       --自连接:就是一个表自己和自己连接,
    267       --注意一定要用表别名,区分它们
    268     select  e1.EMPNO,e1.ENAME as 员工姓名,e1.MGR,e2.EMPNO
    269     ,e2.ENAME as 领导姓名
    270      from EMP e1,EMP e2
    271       where e1.MGR=e2.EMPNO  
    272 
    273 
    274 
    275 --43、列出入职日期早于其直接上级的所有雇员
    276 select  a.ENAME,B.ename from emp a,EMP b where a.MGR=b.EMPNO  and a.HIREDATE>b.HIREDATE
    277 
    278 
    279 --44、列出所有办事员("CLERK")的姓名及其部门名称
    280 select e.ENAME ,e.JOB,d.DNAME from EMP e inner JOIN DEPT d ON e.DEPTNO=d.DEPTNO and e.JOB='clerk'
    281 --select * from EMP 
    282 
    283 
    284 --45、列出从事"SALES"(销售)工作的雇员的姓名,假定不知道 销售部的部门编号
    285  
    286   select e.ENAME ,e.JOB from EMP e inner join DEPT d on  e.DEPTNO =d.DEPTNO   --JOB='sales'  
    287 
    288 --46、列出与"SCOTT"从事相同工作的所有雇员
    289 
    290 select  e.ENAME,e.JOB  from EMP e where  job=(select JOB from EMP where ENAME='scott')  
    291 and e.ENAME<>'scott'
    292 
    293 
    294 --47、列出某些雇员的姓名和薪金,条件是他们的薪金等于部门30 中任何一个雇员的薪金
    295 select a.ename, a.sal from emp a,emp b where a.deptno<>30 and b.DEPTNO=30 and a.SAL=b.SAL
    296 
    297 --48、列出某些雇员的姓名和薪金,条件是他们的薪金高于部门30 中所有雇员的薪金
    298 --select  e.ENAME,e.SAL ,e.DEPTNO  from EMP e,EMP e1 where e.SAL >=(select e1.SAL from EMP where DEPTNO=30  ) 
    299 
    300 --49、列出从事同一种工作但属于不同部门的雇员的不同组合
    301 
    302   select ename,dname from EMP,dept where EMP.DEPTNO=DEPT.DEPTNO  group by dname,ename
    303   
    304    --on e.JOB=(select JOB from EMP e)-- inner join EMP d where e.JOB=d.JOB)    
    305 
    306 --50、列出所有雇员的雇员名称、部门名称和薪金
    307 select  e.ENAME 雇员,d.DNAME 部门,e.SAL 薪金  from EMP e left join DEPT d on e.DEPTNO=d.DEPTNO
    308 
    309 --51 回家作业:(分页)top+子查询
    310  --要求:用子查询实现,查询emp表中的第6到第10个员工(分页的基础)
    311  --(特别提醒:员工编号唯一,但不一定连续)
    View Code
  • 相关阅读:
    7月17日
    7月16日学习记录
    7月15日学习记录
    git 学习
    投稿相关
    ubuntu16.04 安装以及要做的事情
    python学习使用
    图像相关
    不识别移动硬盘
    深度学习
  • 原文地址:https://www.cnblogs.com/shiningleo007/p/12383121.html
Copyright © 2020-2023  润新知