MySQL基礎試題訓練

1.前言需要自己手動創建數據庫

2.提前準備:建表語句

use day0202;
-- 部門表
create table dept(
	deptno int primary key auto_increment, -- 部門編號
	dname varchar(14) ,	  -- 部門名字
	loc varchar(13)   -- 地址
) ;
-- 員工表
create table emp(
	empno int primary key auto_increment,-- 員工編號
	ename varchar(10), -- 員工姓名										-
	job varchar(9),	-- 崗位
	mgr int,	 -- 直接領導編號
	hiredate date, -- 僱傭日期,入職日期
	sal int, -- 薪水
	comm int,  -- 提成
	deptno int not null, -- 部門編號
	foreign key (deptno) references dept(deptno)
);
insert into dept values(10,'財務部','北京');
insert into dept values(20,'研發部','上海');
insert into dept values(30,'銷售部','廣州');
insert into dept values(40,'行政部','深圳');
insert into emp values(7369,'劉一','職員',7902,'1980-12-17',800,null,20);
insert into emp values(7499,'陳二','推銷員',7698,'1981-02-20',1600,300,30);
insert into emp values(7521,'張三','推銷員',7698,'1981-02-22',1250,500,30);
insert into emp values(7566,'李四','經理',7839,'1981-04-02',2975,null,20);
insert into emp values(7654,'王五','推銷員',7698,'1981-09-28',1250,1400,30);
insert into emp values(7698,'趙六','經理',7839,'1981-05-01',2850,null,30);
insert into emp values(7782,'孫七','經理',7839,'1981-06-09',2450,null,10);
insert into emp values(7788,'周八','分析師',7566,'1987-06-13',3000,null,20);
insert into emp values(7839,'吳九','總裁',null,'1981-11-17',5000,null,10);
insert into emp values(7844,'鄭十','推銷員',7698,'1981-09-08',1500,0,30);
insert into emp values(7876,'郭靖','職員',7788,'1987-06-13',1100,null,20);
insert into emp values(7900,'令狐沖','職員',7698,'1981-12-03',950,null,30);
insert into emp values(7902,'張無忌','分析師',7566,'1981-12-03',3000,null,20);
insert into emp values(7934,'楊過','職員',7782,'1983-01-23',1300,null,10);







3.具體需求與答案,自己訓練最好把答案刪除自行訓練

use day0202;
-- 1.列出至少有一個員工的所有部門。
#查詢所有的部門總數大於1的部門;
select deptno from emp group by deptno having count(deptno)>1;
#查詢對應的部門名稱
select dname from dept emp where deptno in (select deptno from emp group by deptno having count(deptno)>1);

-- 2.列出薪金比"劉一"多的所有員工。
#查詢劉一的薪資
select sal from emp where ename="劉一";
select * from emp where sal>(select sal from emp where ename="劉一");

-- 3.***** 列出所有員工的姓名及其直接上級的姓名。
#思路:先查看對應的員工id與上級id
select empno,mgr from emp ;
#查詢員工姓名查詢上級的id
select emp.ename as 上司 , e.ename as 員工 from  emp, (select empno,mgr,ename from emp ) as e where emp.empno =e.mgr;
#思路反思:
#1.根據員工表查詢員工的id上司的id 姓名
#2.建立條件讓找到上司id對應的員工
#精簡答案
select e1.ename,e2.ename from emp as e1,emp as e2
where e1.mgr=e2.empno;

-- 4.列出受僱日期早於其直接上級的所有員工。
select e1.ename,e2.ename from emp as e1 inner join emp as e2 on e1.empno=e2.mgr;

select e2.* from emp as e1 inner join emp as e2 on e1.empno=e2.mgr where e1.hiredate<e2.hiredate;
-- 5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。
select * from dept as d left join emp as e on d.deptno=e.deptno
-- 6.列出所有job爲“職員”的姓名及其部門名稱。
select e.ename ,d.dname from emp as e inner join dept as d on d.deptno=e.deptno where job="職員";
-- 7.列出最低薪金大於1500的各種工作。
select job from emp  group by job having  min(sal)>1500;
-- 8.列出在部門 "銷售部" 工作的員工的姓名,假定不知道銷售部的部門編號。
select deptno from dept where dname ="銷售部";
select ename as 姓名 ,empno as 編號 from emp where deptno in (select deptno from dept where dname ="銷售部");
-- 9.列出薪金高於公司平均薪金的所有員工。
select avg(sal) from emp ;
select * from emp where sal>(select avg(sal) from emp);
-- 10.列出與"周八"從事相同工作的所有員工。
#創建driver Manger的註冊驅動
#使用connection創建連接urlusernamepassword
#向數據庫發送sql語句
#
select job from emp where ename="周八";
select * from emp where job in (select job from emp where ename="周八");
-- 11.列出薪金等於部門30中員工的薪金的所有員工的姓名和薪金。
select ename , sal from emp  where deptno=30;
-- 12.列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金。
select max(sal) from emp where deptno =30; 
select ename ,sal from emp where sal>(select max(sal) from emp where deptno =30);
-- 13.列出在每個部門工作的員工數量、平均工資。
select count(deptno) ,avg(sal) from emp group by deptno having avg(sal);
-- 14.列出所有員工的姓名、部門名稱和工資。
select e.ename,d.dname,e.sal from emp as e inner join dept as d on e.deptno=d.deptno ;
-- 15.列出所有部門的詳細信息和部門人數。
select deptno, count(deptno) from emp group by deptno having count(deptno);
select d.*,e.c from dept as d left join (select deptno as dd, count(deptno) as c from emp group by deptno having count(deptno))as e on d.deptno=e.dd;
-- 16.列出各種工作的最低工資。
select job,min(sal) from emp group by job having min(sal); 
-- 17.列出各個部門的 經理 的最低薪金。
select deptno ,min(sal) from emp where job = "經理" group by deptno;
select*  from dept inner join (select deptno ,min(sal) from emp where job = "經理" group by deptno)as e on e.deptno =dept.deptno;
-- 18.列出所有員工的年工資,按年薪從低到高排序。 
select * ,sal*12+IFNULL(comm,0)*12 as 年薪 from emp ;
-- 19.查出emp表中薪水在3000以上(包括3000)的所有員工的員工號、姓名、薪水。
select empno , ename ,sal from emp where sal >=3000;
-- 20.查詢出所有薪水在'陳二'之上的所有人員信息。
select sal from emp where ename ="陳二";
select * from emp where sal>(select sal from emp where ename ="陳二");
-- 21.查詢出emp表中部門編號爲20,薪水在2000以上(不包括2000)的所有員工,顯示他們的員工號,姓名以及薪水,以如下列名顯示:員工編號 員工名字 薪水
select * from emp where deptno=20 and sal>2000;
-- 22.查詢出emp表中所有的工作種類(無重複)
select DISTINCT job from emp;
-- 23.查詢出所有獎金(comm)字段不爲空的人員的所有信息。
select * from emp where comm  is not null;
-- 24.查詢出薪水在800到2500之間(閉區間)所有員工的信息。(注:使用兩種方式實現and以及between and)
select * from emp where sal between 800 and 2500;
select * from emp where sal>=800 and sal<2500;
-- 25.查詢出員工號爲7521,7900,7782的所有員工的信息。(注:使用兩種方式實現,or以及in)
select * from emp where empno in (7521,7900,7782);
select * from emp where empno  =7521 or empno=7900 or empno=7782;
-- 26.查詢出名字中有“張”字符,並且薪水在1000以上(不包括1000)的所有員工信息。
select * from emp where ename like "%張%" and sal>1000;
-- 27.查詢出名字第三個漢字是“忌”的所有員工信息。
select * from emp where ename like "__忌";
-- 28.將所有員工按薪水升序排序,薪水相同的按照入職時間降序排序。
select * from emp  ORDER BY sal asc ,hiredate desc;
-- 29.將所有員工按照名字首字母升序排序,首字母相同的按照薪水降序排序。 order by convert(name using gbk) asc; 
select * from emp order by convert(ename USING gbk) asc ,sal desc;
-- 30.查詢出最早工作的那個人的名字、入職時間和薪水。
select min(hiredate) from emp;
select ename ,hiredate ,sal from emp where hiredate in(select min(hiredate) from emp);
-- 31.顯示所有員工的名字、薪水、獎金,如果沒有獎金,暫時顯示100.
#不會寫,判斷爲空加100
select ename ,sal ,comm+100 from emp  where comm if null ;


select ename,sal,ifnull(comm,100)
from emp;


-- 32.顯示出薪水最高人的職位。
select  max(sal) from emp; 
select job ,ename from emp  where sal in(select  max(sal) from emp);
-- 33.查出emp表中所有部門的最高薪水和最低薪水,部門編號爲10的部門不顯示。
select deptno,  min(sal), max(sal) from emp group by deptno HAVING deptno<> 10 ;
-- 34.刪除10號部門薪水最高的員工。
select max(sal)  from emp where deptno=10;
select empno from emp where sal=(select max(sal)  from emp where deptno=10);
delete from emp where empno=(select empno from emp where sal=(select max(sal)  from emp where deptno=10));


#標準答案
select empno from emp
where deptno=10 and sal>=all(select sal from emp where deptno=10);

delete from emp 
where empno = (select empno from (select empno from emp
				where deptno=10 
					and sal>=all(select sal from emp where deptno=10))  as temp);

-- 35.將薪水最高的員工的薪水降30%。
select max(sal)*(1-0.3) from emp ;

select empno from emp 
where sal >= all(select sal from emp);

update emp 
set sal=sal*(1-0.3)
where empno in (select temp.empno from (select empno from emp 
				where sal >= all(select sal from emp)) temp);


select * from emp;
-- 36.查詢員工姓名,工資和 工資級別(工資>=3000 爲3級,工資>2000 爲2級,工資<=2000 爲1級)
-- 語法:case when ... then ... when ... then ... else ... end
select ename ,sal,
case when sal>3000 then "3級"
			when sal>2000 then "2級"
			else "1級"
			end
			from emp;

select ename,
	case when sal>3000 then '3級' 
		 when sal>2000 then '2級'
		 else '1級'
	end
from emp;






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章