mysql 语句 面试题
假设有一个“职工”表,表结构如下
职工号 |
姓名 |
年龄 |
月工资 |
部门号 |
电话 |
办公室 |
---|---|---|---|---|---|---|
1 |
张三 |
25 |
2500 |
1 |
1123 |
101 |
2 |
李四 |
26 |
1500 |
1 |
1234 |
102 |
3 |
王五 |
22 |
900 |
2 |
4567 |
103 |
4 |
刘秋 |
21 |
2000 |
2 |
34598 |
103 |
创建表格:
//创建表格
mysql> create table workes (-> id int not null auto_increment,-> name varchar(100) not null,-> age varchar(5) not null,-> salary int(11) not null,-> department int not null,-> telephone varchar(13) not null,-> office varchar(5) not null,-> primary key(id)-> )default charset=utf8;//插入数据
mysql> insert into workers (name,age,salary,department,telephone,office) values ("张三","25","2500",1,"1234567","101");
mysql> insert into workers (name,age,salary,department,telephone,office) values ("李四","26","1500",1,"5678990","102"),("王五","22","900",2,"7657875","103");
mysql> insert into workers (name,age,salary,department,telephone,office) values ("刘秋","21","2000",2,"8799765","103"),("井七","27","1900",1,"98765454","102");//查看数据内容
mysql> select * from workers;
+----+--------+-----+--------+------------+-----------+--------+
| id | name | age | salary | department | telephone | office |
+----+--------+-----+--------+------------+-----------+--------+
| 1 | 张三 | 25 | 2500 | 1 | 1234567 | 101 |
| 2 | 李四 | 26 | 1500 | 1 | 5678990 | 102 |
| 3 | 王五 | 22 | 900 | 2 | 7657875 | 103 |
| 4 | 刘秋 | 21 | 2000 | 2 | 8799765 | 103 |
| 5 | 井七 | 27 | 1900 | 1 | 98765454 | 102 |
+----+--------+-----+--------+------------+-----------+--------+
5 rows in set (0.00 sec)
一、问题:
查询每个部门中月工资最高的“职工号”, SQL查询语句如下:
SELECT 职工号 FROM 职工 AS A
WHERE职工.月工资 = (SELECT MAX(月工资) FROM 职工 AS B WHERE A.部门号 = B.部门号);
语句查询:
mysql> select id from workers AS A-> where A.salary = (select MAX(salary) from workers AS B-> where A.department = B.department);
+----+
| id |
+----+
| 1 |
| 4 |
+----+
2 rows in set (0.00 sec)
1:请简要的说明该查询语句对查询效率的影响(6分)
2:对该查询语句进行修改,使它既可以完成相同的功能,又可以提高查询效率。(8分)
回答:
1. 效率低。对于外层职工关系A 中的每一个记录,都要对内层职工关系B进行检索,所有效率不高。
2.
方法 1)使用临时表
SELECT MAX(月工资) as 最高工资,部门号 INTO temp FROM 职工 GROUP BY 部门号;
SELECT 职工号 FROM 职工,temp WHERE 月工资=最高工资 AND 职工.部门号 = temp.部门号;
//创建临时表
mysql> create TEMPORARY table temp (select MAX(salary) AS Most_Salary,department from workers group by department);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from temp;
+-------------+------------+
| Most_Salary | department |
+-------------+------------+
| 2500 | 1 |
| 2000 | 2 |
+-------------+------------+
2 rows in set (0.00 sec)//查询
mysql> select id from workers,temp where salary=Most_Salary and workers.department=temp.department;
+----+
| id |
+----+
| 1 |
| 4 |
+----+
2 rows in set (0.01 sec)
注意:在mysql 中不支持select MAX(salary) as Most_Salary,department into temp from workers GROUP BY department;可更改为create table temp (select MAX(salary) AS Most_Salary,department from workers group by department);
方法 2)
SELECT 职工号 FROM 职工,(SELECT MAX(月工资) as 最高工资,部门号 FROM 职工 GROUP BY 部门号) as DEPMAX
WHERE 月工资 = 最高工资 AND 职工.部门号 = DEPMAX.部门号;
mysql> select id from workers,(select MAX(salary) AS Most_Salary,department from workers group by department ) AS DEPMAX where salary=Most_Salary and workers.department=DEPMAX.department;
+----+
| id |
+----+
| 1 |
| 4 |
+----+
2 rows in set (0.00 sec)//列出多个属性
mysql> select id,workers.salary,workers.department from workers,(select Max(salary) as max_salary,department from workers group by department) as limittmp where workers.salary=limittmp.max_salary and workers.department=limittmp.department;
+----+--------+------------+
| id | salary | department |
+----+--------+------------+
| 1 | 2500 | 1 |
| 4 | 2000 | 2 |
+----+--------+------------+
2 rows in set (0.01 sec)
二、问题:
假设在“职工”表中的“年龄”和“月工资”字段上创建了索引,下列的查询语句可能不会促使查询优化器使用索引,从而降低了效率,请写出可以完成相同功能又可以提高查询效率的SQL语句。
select 姓名,年龄,月工资 from 职工 where 年龄 > 45 or 月工资 < 1000;
回答:
SELECT 姓名,年龄,月工资 FROM 职工
WHERE 年龄 > 45
UNION
SELECT 姓名,年龄,月工资 FROM 职工
WHERE月工资 < 1000;
使用UNION就可以促使 查询优化器使用索引。
mysql> select name,age,salary from workers where age>45 or salary <1000;
+--------+-----+--------+
| name | age | salary |
+--------+-----+--------+
| 王五 | 22 | 900 |
+--------+-----+--------+
1 row in set (0.01 sec)mysql> select name,age,salary from workers where age>45 UNION select name,age,salary from workers where salary <1000;
+--------+-----+--------+
| name | age | salary |
+--------+-----+--------+
| 王五 | 22 | 900 |
+--------+-----+--------+
1 row in set (0.00 sec)
三、问题
设有关系EMP(ENO,ENAME,SALARY,DNO),其中各属性的含义依次为职工号、姓名、工资和所在部门号,
以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。(回答下列题目)(20分)
1. 列出各部门中工资不低于600元的职工的平均工资。(10分)
2. 请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。(10分)
//创建表格
mysql> create table EMP (-> ENO int not null auto_increment,-> ENAME varchar(100) not null,-> SALARY int not null,-> DNO int not null,-> primary key(EMO)-> )default charset=utf8;//添加数据
mysql> insert into EMP (ENAME,SALARY,DNO) values ("李四","1500","1"),("王五","400","2");
mysql> insert into EMP (ENAME,SALARY,DNO) values ("张三","800","2"),("刘秋","900","1");// 查看数据内容
mysql> select * from EMP;
+-----+--------+--------+-----+
| ENO | ENAME | SALARY | DNO |
+-----+--------+--------+-----+
| 1 | 李四 | 1500 | 1 |
| 2 | 王五 | 400 | 2 |
| 3 | 张三 | 800 | 2 |
| 4 | 刘秋 | 900 | 1 |
+-----+--------+--------+-----+
4 rows in set (0.01 sec)//创建表格
mysql> create table DEPT (-> DNO int not null,-> DNAME varchar(100) not null,-> MANAGER int not null,-> primary key(DNO)-> )default charset=utf8;
//添加数据
mysql> insert into DEPT (DNO,DNAME,MANAGER) values (2,"销售部","3");
//查看数据内容
mysql> select * from DEPT;
+-----+-----------+---------+
| DNO | DNAME | MANAGER |
+-----+-----------+---------+
| 2 | 销售部 | 3 |
+-----+-----------+---------+
1 row in set (0.00 sec)
回答:
1)select DNO,avg(SALARY) from EMP where SALARY>=600 group by DNO;
2)摘抄的答案不能执行,验证的答案在代码框里面。
UPDATE EMP SET SALARY=SALARY*1.1 WHERE ENO IN
(SELECT ENO FROM EMP, DEPT
WHERE EMP.DNO=DEPT.DNO AND DNAME='销售部'AND SALARY<600);
或者
UPDATE EMP SET SALERY=SALERY*1.1 FROM EMP A,DEPT B
WHERE A.DNO = B.DNO AND B.DNAME="销售部" AND B.SALARY<600;
参考的链接:
https://blog.csdn.net/Ck_Max/article/details/86502848
https://blog.csdn.net/longgeaisisi/article/details/90694573
https://blog.csdn.net/elangsun/article/details/90709870 (有用)
嵌套公式:
UPDATE 表X SET A = 1, B = 2 WHERE C IN (SELECT * FROM (SELECT C FROM 表Y WHERE D = 3) ALLINFO) AND E = 5; 标蓝处再添加一层可将里边的查询提前执行,避免N*N次这样的慢查询.
//语句一
mysql> UPDATE EMP SET SALARY=SALARY*1.1 WHERE ENO IN -> (SELECT * from -> (SELECT ENO FROM EMP,DEPT WHERE DEPT.DNO=EMP.DNO AND DNAME="销售部"-> AND SALARY<600) ALLINFO);
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from EMP;
+-----+--------+--------+-----+
| ENO | ENAME | SALARY | DNO |
+-----+--------+--------+-----+
| 1 | 李四 | 1500 | 1 |
| 2 | 王五 | 484 | 2 |
| 3 | 张三 | 800 | 2 |
| 4 | 刘秋 | 900 | 1 |
+-----+--------+--------+-----+
4 rows in set (0.00 sec)//语句二
mysql> UPDATE EMP A,DEPT B SET SALARY=SALARY*1.1 -> WHERE A.DNO = B.DNO AND B.DNAME="销售部" AND A.SALARY<600;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from emp;
+-----+--------+--------+-----+
| ENO | ENAME | SALARY | DNO |
+-----+--------+--------+-----+
| 1 | 李四 | 1500 | 1 |
| 2 | 王五 | 532 | 2 |
| 3 | 张三 | 800 | 2 |
| 4 | 刘秋 | 900 | 1 |
+-----+--------+--------+-----+
4 rows in set (0.00 sec)
四、设职工---社团数据库有三个基本表:(20分)
职工(职工号,姓名,年龄,性别);
社会团体(编号,名称,负责人,活动地点);
参加(职工号,编号,参加日期);
其中:
1)职工表的主键为职工号。
2)社会团体表的主键为编号;外码为负责人,被参照表为职工表,对应属性为职工号。
3)参加表的职工号和编号为主键;职工号为外码,其被参照表为职工表,对应属性为职工号;编号为外码,其被参照表为社会团体表,对应属性为编号。
试用SQL语句表达下列操作:
1)定义职工表、社会团体表和参加表,并说明其主键和参照关系。
2)建立下列两个视图。
社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别);
参加人情况(职工号,姓名,社团编号,社团名称,参加日期)
3)查找参加唱歌队或篮球队的职工号和姓名。
4)求参加人数超过100人的社会团体的名称和负责人。
答:
1)定义职工表、社会团体表和参加表,并说明其主键和参照关系。
//1)职工表的主键为职工号。
mysql> CREATE TABLE 职工 (职工号 CHAR(10) NOT NULL,-> 姓名 CHAR(8) NOT NULL,-> 年龄 SMALLINT,-> 性别 CHAR(2),-> CONSTRAINT C1_PK PRIMARY KEY (职工号)-> );
Query OK, 0 rows affected (0.01 sec)//2)社会团体表的主键为编号;外码为负责人,被参照表为职工表,对应属性为职工号。
mysql> CREATE TABLE 社会团体(-> 编号 CHAR(8) NOT NULL,-> 名称 CHAR(12) NOT NULL,-> 负责人 CHAR(8),-> 活动地点 VARCHAR(50),-> CONSTRAINT C2_PK PRIMARY KEY (编号),-> CONSTRAINT C2_FK FOREIGN KEY (负责人) REFERENCES 职工(职工号)-> );
Query OK, 0 rows affected (0.02 sec)//3)参加表的职工号和编号为主键;职工号为外码,其被参照表为职工表,对应属性为职工号;编号为外码,其被参照表为社会团体表,对应属性为编号。
mysql> CREATE TABLE 参加 (-> 职工号 CHAR(8),-> 编号 CHAR(8),-> 参加日期 DATE,-> CONSTRAINT C3_PK PRIMARY KEY(职工号,编号),-> CONSTRAINT C3_FK_Z FOREIGN KEY(职工号) REFERENCES 职工(职工号),-> CONSTRAINT C3_FK_B FOREIGN KEY(编号) REFERENCES 社会团体(编号)-> );
Query OK, 0 rows affected (0.02 sec)
2)建立下列两个视图。
//社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别);
mysql> CREATE VIEW 社团负责人 (编号,名称,负责人职工号,负责人姓名,负责人性别)-> AS SELECT 编号,名称,负责人,姓名,性别-> FROM 社会团体,职工-> WHERE 社会团体.负责人=职工.职工号;
Query OK, 0 rows affected (0.02 sec)//参加人情况(职工号,姓名,社团编号,社团名称,参加日期);
mysql> CREATE VIEW 参加人情况 (职工号,姓名,社团编号,社团名称,参加日期)-> AS SELECT 参加.职工号,姓名,社会团体.编号,名称,参加日期-> FROM 职工,社会团体,参加 -> WHERE 职工.职工号=参加.职工号 AND 参加.编号=社会团体.编号;
Query OK, 0 rows affected (0.01 sec)mysql> show tables;
+--------------------------+
| Tables_in_cre_data_mysql |
+--------------------------+
| 参加 |
| 参加人情况 |
| 社会团体 |
| 社团负责人 |
| 职工 |
| DEPT |
| EMP |
| alter_tbl |
| clone_import_vegetables |
| import_vegetables |
| mysql_vegetables |
| workers |
+--------------------------+
12 rows in set (0.00 sec)
3)查找参加唱歌队或篮球队的职工号和姓名。
4)求参加人数超过100人的社会团体的名称和负责人。
mysql 语句 面试题相关推荐
- mysql语句面试题_mysql的sql面试题(1)
需要数据库表1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 2.课程表 Course(CID, ...
- mysql面试题sql语句_数据库MySQL经典面试题之SQL语句
数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex ...
- MySQL经典面试题--SQL语句
备注:建立下面的每一个题目对应的表,插入案例数据,然后执行需要的 SQL ,将结果复制到 word 文件中 MYSQL经典面试题,后面有建表过程和SQL执行语句 有道云连接 https://note ...
- 数据库MySQL经典面试题之SQL语句
学生表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`student_name` varchar(255) DEFAULT ...
- mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题
1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...
- MySQL常见面试题及答案汇总1000道(春招+秋招+社招)
MySQL面试题以及答案整理[最新版]MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面 ...
- MySQL查询面试题
2019独角兽企业重金招聘Python工程师标准>>> MySQL查询面试题 MySQL查询面试题[第一部分] [sql] view plain copy Student(S#,Sn ...
- 30道MySQL基础面试题
每天晚上 00:00 执行 mysql 数据备份,请写出 crontab 配置项 答案: 0 0 * * * mysqldump -uroot -p123456 --flush-logs 数据库名 & ...
- 100道MySQL数据库面试题解析
1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效如何字段类型是字符串,w ...
最新文章
- Linux课程第六天学习笔记
- 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建...
- SpringBoot的yml配置文件
- eclipse开发cocos2dx 3.2环境搭建之二: cocos2dx 3.2安装及测试运行 (An internal error occurred during: “C/C++ Indexe)
- openGauss 正式开源并成立开源社区
- 高通855比高通675贵多少钱,性能差距有多大?
- mysql sumif优化,sumif函数的使用方法
- sql 2005 中分页
- 【云速建站】网站的基本设置
- DHCP的IP地址租约、释放
- 多线程核心8-3:线程三大安全问题之发布与逸出
- AutoLayout进阶篇
- 使用Oracle sql_trace 工具
- Linux操作系统安装
- macOS Catalina(mac10.15.5系统)
- 计算机综述性论文范文例文,综述性论文范文例文(综述论文范文模板例文)
- 如何使用HTML获取当前电脑的时间
- 代码评审平台 phabricator-docker/phabricator docker 服务搭建及配置
- 对耳朵伤害最小的耳机类型?骨传导耳机对听力最小
- 对数正态分布的期望方差
热门文章
- 清明时节雨纷纷,祭祖的日子又悄然无息地到来了
- 360安全卫士和火绒之间的事
- 信号处理--sinc函数
- 金纳米颗粒上装载DNA四面体|金核(75-100nm左右)sio2壳层(3-5nm)产品描述/信息/详情
- Aidlux实践-快速实现街道人流量统计系统
- 传统家装有落差,VR全景家装让你体验新房落成效果
- 【⚠️windows删除文件夹抽风了⚠️】“错误0x80070091:目录不是空的”问题处理
- java-net-php-python-jspm广东阳光外国语学校新闻发布计算机毕业设计程序
- TCP/IP协议族在异构网络互联中的作用
- 将SSH密匙添加到云效并下载代码