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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM