第一题

CREATE TABLE `table1` (`name` VARCHAR(20) DEFAULT NULL,`kecheng` VARCHAR(20) DEFAULT NULL,`fenshu` INT(10) DEFAULT NULL
);INSERT INTO table1(NAME,kecheng,fenshu) VALUES('张三','语文',81);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('张三','数学',75);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('李四','语文',76);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('李四','数学',76);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('王五','语文',81);
INSERT INTO table1(NAME,kecheng,fenshu) VALUES('王五','数学',100);

#求出每门课都大于80分的学生姓名

第一种方法:

SELECT NAME FROM table1 GROUP BY NAME
HAVING MIN(fenshu)>80

第二种方法:

SELECT NAME FROM table1 GROUP BY NAME
HAVING COUNT(1)=SUM(CASE WHEN fenshu>80 THEN 1 ELSE 0 END)

第三种方法:

SELECT NAME FROM table1 GROUP BY NAME
HAVING NAME NOT IN (SELECT NAME FROM table1 WHERE fenshu<=80)

第二题

CREATE TABLE `table2` (`语文` INT(10) DEFAULT NULL,`数学` INT(10) DEFAULT NULL,`英语` INT(10) DEFAULT NULL
);
INSERT INTO table2(语文,数学,英语) VALUES(58,70,80);

有一张表,3个字段是语文,数学,英语, 有1条记录分别表示语文68,数学70,英语80, 得出结果分数变等级(>=80分是优秀, >=60分是及格, <60是不及格)

SELECT CASE WHEN 语文>=80 THEN '优秀' WHEN 语文>=60 THEN '及格' WHEN 语文<60 THEN '不及格' END 语文,
CASE WHEN 数学>=80 THEN '优秀' WHEN 数学>=60 THEN '及格' WHEN 数学<60 THEN '不及格' END 数学,
CASE WHEN 英语>=80 THEN '优秀' WHEN 英语>=60 THEN '及格' WHEN 英语<60 THEN '不及格' END 英语
FROM table2

第三题

CREATE TABLE `table3` (`date` VARCHAR(20) DEFAULT NULL,`result` VARCHAR(10) DEFAULT NULL
)

#查询出来的结果:
#date 胜 负
#2011-02-01 2 1
#2011-02-02 1 1

SELECT DATE,
(SELECT COUNT(1) FROM table3 WHERE DATE=t.date AND result='胜') AS 胜,
(SELECT COUNT(1) FROM table3 WHERE DATE=t.date AND result='负') AS 负
FROM table3 t GROUP BY DATE

第四题

#1 2005001 张三 0001 数学 69
#2 2005002 李四 0001 数学 89
#3 2005001 张三 0001 数学 69

CREATE TABLE IF NOT EXISTS `student_test` (id INT UNSIGNED AUTO_INCREMENT,stu_id VARCHAR(10) NULL,NAME VARCHAR(10) NULL,couser_id VARCHAR(10) NULL,couser VARCHAR(10) NULL,score DECIMAL(10,2) NULL,PRIMARY KEY (id)
)
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005001','张三','0001','数学',69);
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005002','李四','0001','数学',89);
INSERT INTO student_test(id,stu_id,NAME,couser_id,couser,score) VALUES(NULL,'2005001','张三','0001','数学',69);

#删除冗余字段, 保留ID最小的那个

DELETE FROM student_test WHERE id NOT IN (SELECT * FROM (SELECT MIN(id) FROM student_test GROUP BY stu_id,NAME,couser_id,couser,score) s
)

第五题

CREATE TABLE IF NOT EXISTS `product` (id INT UNSIGNED AUTO_INCREMENT,NAME VARCHAR(10) NULL,STATUS VARCHAR(10) NULL,PRIMARY KEY (id)
)
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'苹果','好吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'梨','难吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'橘子','好吃');
INSERT INTO product(id,NAME,STATUS) VALUES(NULL,'葡萄',NULL);

#现在需要把status的‘好吃’更新为‘0’,‘难吃’更新为‘1’

UPDATE product SET STATUS=(CASE WHEN STATUS='好吃' THEN '0' WHEN STATUS='难吃' THEN '1' END)
1

第六题

1) 创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话

CREATE TABLE IF NOT EXISTS `t_student` (stu_id INT UNSIGNED AUTO_INCREMENT,NAME VARCHAR(10) NULL,age INT NULL,gender VARCHAR(2) NULL,address VARCHAR(50) NULL,phone VARCHAR(11) NULL,PRIMARY KEY (stu_id)
);

#2) 修改学生表的结构,添加一列信息,学历

ALTER TABLE t_student ADD COLUMN `education` VARCHAR(20) NOT NULL;

#3) 修改学生表的结构,删除一列信息,家庭住址

ALTER TABLE t_student DROP COLUMN address;

#4) 向学生表添加如下信息:

INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'A',22,'男','123456','小学');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'B',21,'男','119','中学');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'C',23,'男','110','高中');
INSERT INTO t_student(stu_id,NAME,age,gender,phone,education) VALUES(NULL,'D',18,'女','114','大学');

#5) 修改学生表的数据,将电话号码以11开头的学员的学历改为“大专”

UPDATE t_student SET education='大专' WHERE phone LIKE '11%';

#6) 删除学生表的数据,姓名以C开头,性别为‘男’的记录删除

DELETE FROM t_student WHERE NAME LIKE 'C%' AND gender='男';

#7) 查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号示出来

SELECT stu_id,NAME FROM t_student WHERE age<22 AND education='大专'

#8) 查询学生表的数据,查询所有信息,列出前25%的记录

SELECT * FROM t_student WHERE stu_id<=(SELECT COUNT(*) FROM t_student)*0.25;

#9) 查询出所有学生的姓名,性别,年龄降序排列

SELECT NAME,gender,age FROM t_student ORDER BY age DESC;

#10) 按照性别分组查询所有的平均年龄

SELECT gender,AVG(age) FROM t_student GROUP BY gender;

第七题

CREATE TABLE IF NOT EXISTS test1(a DECIMAL(10,2) NOT NULL,b DECIMAL(10,2) NOT NULL,c DECIMAL(10,2) NOT NULL,d VARCHAR(10) NOT NULL
)
INSERT INTO test1(a,b,c,d) VALUES(0.5,1.5,2.0,'A1');
INSERT INTO test1(a,b,c,d) VALUES(1.5,0.5,0.5,'A1');
INSERT INTO test1(a,b,c,d) VALUES(0.5,0.5,1.5,'A1');
INSERT INTO test1(a,b,c,d) VALUES(1.5,1.5,1.5,'B1');
INSERT INTO test1(a,b,c,d) VALUES(0.5,2.0,2.0,'B1');
INSERT INTO test1(a,b,c,d) VALUES(1.5,2.0,0.5,'B1');

统计a,b,c三列大于1的个数

SELECT
SUM(CASE WHEN a > 1 THEN 1 ELSE 0 END) a,
SUM(CASE WHEN b > 1 THEN 1 ELSE 0 END) b,
SUM(CASE WHEN c > 1 THEN 1 ELSE 0 END) c
FROM test1;

按a分组, 用b排序取top1
其实用hive或者Oracle很简单了, 直接用row_number即可
方法一

SELECT test1.*
FROM test1
JOIN (SELECT a,MAX(b) maxb FROM test1 GROUP BY a) t
ON test1.b=t.maxb
GROUP BY a

方法二

SELECT a, SUBSTRING_INDEX(GROUP_CONCAT(b ORDER BY b DESC),',',1) b,
SUBSTRING_INDEX(GROUP_CONCAT(c ORDER BY b DESC),',',1) c,
SUBSTRING_INDEX(GROUP_CONCAT(d ORDER BY b DESC),',',1) d
FROM test1 GROUP BY a;

用到了下面的两个函数:

group_concat(v)

先看看它的语法:

group_concat([DISTINCT] 要连接的字段 [ORDER BY ASC/DESC 排序字段] [SEPARATOR
‘分隔符’])

举例:

select GROUP_CONCAT(c ORDER BY b DESC) from test1 group a
#解析: 按a进行分组, 把c字段的值打印在一起, 逗号分割(默认), 并且c字段按b排序

substring_index(v1, v2, v3) – 将v1按照v2进行分割取下标为v3的值

从表中随机取出3条数据
下面这种方法虽然可以取出随机记录, 但是不推荐, 数据量大的话会很慢很慢

SELECT * FROM test1 ORDER BY RAND() LIMIT 3

可以使用下面这种方法

SELECT *
FROM (SELECT test1.*, RAND() r FROM test1) t
ORDER BY t.r LIMIT 3

第八题
Table表有三个字段ID,Name,Location, 请以两种方式写出SQL语句删除表中ID以及Name都重复的记录.

CREATE TABLE table4(ID INT NOT NULL,NAME VARCHAR(10) NOT NULL,Location VARCHAR(12) NOT NULL
);INSERT INTO table4(ID,NAME,Location) VALUES(1,'zhangsan','bj');
INSERT INTO table4(ID,NAME,Location) VALUES(1,'zhangsan','bj');
INSERT INTO table4(ID,NAME,Location) VALUES(2,'lisi','bj');
INSERT INTO table4(ID,NAME,Location) VALUES(3,'wangwu','sh');

第一种方法

DELETE FROM table4 WHERE (id,NAME) IN (
SELECT * FROM (SELECT id,NAME FROM table4 GROUP BY ID,NAME HAVING COUNT(1)>1) t)

第二种方法

DELETE FROM table4 WHERE (id,NAME) IN (
SELECT * FROM(
SELECT id,NAME FROM table4 t1 WHERE ((SELECT COUNT(1) FROM table4 t2 WHERE t1.ID=t2.ID AND t1.Name=t2.Name)>1
)
) tmp)

第九题

现有BOOKS表, 查询所有图书中价格小于60元的作者有多少本图书在售

CREATE TABLE books(bno INT NOT NULL,bname VARCHAR(10) NOT NULL,author VARCHAR(10) NOT NULL,price DECIMAL(10,2) NOT NULL
)
INSERT INTO books VALUES(1,'倚天屠龙记','金庸',12.99);
INSERT INTO books VALUES(2,'雪山飞狐','金庸',64.99);
INSERT INTO books VALUES(3,'东方不败','金庸',12.99);
INSERT INTO books VALUES(4,'仙逆','耳根',72.99);
INSERT INTO books VALUES(5,'求魔','耳根',12.99);

答案:
使用子查询查出图书价格小于60的作者有哪些, 然后按照作者分组, 查询这些作者的图书数量.

SELECT author,COUNT(1) FROM books GROUP BY author HAVING author IN
(SELECT DISTINCT(author) FROM books WHERE price<60)

第十题

表中有A,B,C三列, 用SQL语句实现, 依次取A,B,C中第一个不为空的值

CREATE TABLE table_null(A VARCHAR(10),B VARCHAR(10),C VARCHAR(10)
)INSERT INTO table_null VALUES(NULL,NULL,NULL);
INSERT INTO table_null VALUES('abc',NULL,NULL);
INSERT INTO table_null VALUES(NULL,'ccc',NULL);
INSERT INTO table_null VALUES(NULL,NULL,'ddd');

答案:
分别按照每一个字段分组, 所有为NUll的分为一组, 然后取不为null的第一条即可.

SELECT * FROM
(SELECT A FROM table_null GROUP BY A LIMIT 1,1) t1 JOIN
(SELECT B FROM table_null GROUP BY B LIMIT 1,1) t2 JOIN
(SELECT C FROM table_null GROUP BY C LIMIT 1,1) t3

第十一题

有一张表stu_score, 所有课程都>=90则特优, 所有课程都>=80则优秀, 都>=60则及格, 否则挂科.

CREATE TABLE stu_score(kecheng VARCHAR(10),stu_id INT,score INT
)
INSERT INTO stu_score VALUES('001',1,90);
INSERT INTO stu_score VALUES('002',1,92);
INSERT INTO stu_score VALUES('001',2,80);
INSERT INTO stu_score VALUES('002',2,92);
INSERT INTO stu_score VALUES('001',3,76);
INSERT INTO stu_score VALUES('002',3,92);
INSERT INTO stu_score VALUES('001',4,50);
INSERT INTO stu_score VALUES('002',4,92);

答案:
按照学号分组, 使用 CASE WHEN 判断最小分数 MIN(score) 是否满足条件.

SELECT stu_id, (CASE WHEN MIN(score)>=90 THEN '特优' WHEN MIN(score)>=80 THEN '优秀' WHEN MIN(score)>=60 THEN '及格' ELSE '挂科' END) stat
FROM stu_score GROUP BY stu_id

第十二题

运用SQL实现数据转换
转换前:


转换后:

CREATE TABLE test33(grade_id INT,subject_name VARCHAR(10),max_score INT
)
INSERT INTO test33 VALUES(1,'语文',98);
INSERT INTO test33 VALUES(2,'数学',95);
INSERT INTO test33 VALUES(2,'政治',87);
INSERT INTO test33 VALUES(5,'语文',97);
INSERT INTO test33 VALUES(5,'数学',100);
INSERT INTO test33 VALUES(5,'政治',92);

答案:

SELECT 年级,
SUM(CASE WHEN  语文 IS NULL THEN 0 ELSE 语文 END) 语文,
SUM(CASE WHEN  数学 IS NULL THEN 0 ELSE 数学 END) 数学,
SUM(CASE WHEN  政治 IS NULL THEN 0 ELSE 政治 END) 政治
FROM
(
(SELECT
(CASE grade_id WHEN 1 THEN '一年级' WHEN 2 THEN '二年级' WHEN 5 THEN '五年级' END) 年级,
(CASE subject_name WHEN '语文' THEN max_score ELSE NULL END) 语文,
(CASE subject_name WHEN '数学' THEN max_score ELSE NULL END) 数学,
(CASE subject_name WHEN '政治' THEN max_score ELSE NULL END) 政治
FROM test33
)  UNION (
SELECT
(CASE grade_id WHEN 1 THEN '一年级' WHEN 2 THEN '二年级' WHEN 5 THEN '五年级' END) 年级,
(CASE subject_name WHEN '语文' THEN max_score ELSE NULL END) 语文,
(CASE subject_name WHEN '数学' THEN max_score ELSE NULL END) 数学,
(CASE subject_name WHEN '政治' THEN max_score ELSE NULL END) 政治
FROM test33
)  UNION (
SELECT
(CASE grade_id WHEN 1 THEN '一年级' WHEN 2 THEN '二年级' WHEN 5 THEN '五年级' END) 年级,
(CASE subject_name WHEN '语文' THEN max_score ELSE NULL END) 语文,
(CASE subject_name WHEN '数学' THEN max_score ELSE NULL END) 数学,
(CASE subject_name WHEN '政治' THEN max_score ELSE NULL END) 政治
FROM test33
)
) t1 GROUP BY 年级

第十三题

A表与B表结构相同, 现在想用B表的数据更新A表的用户姓名, 存在就更新, 不存在就添加.
表A

CREATE TABLE A(user_id VARCHAR(10),user_name VARCHAR(20)
)
CREATE TABLE B(user_id VARCHAR(10),user_name VARCHAR(20)
)

答案:
mysql有这样的语法: ON DUPLICATE KEY UPDATE 对唯一索引或主键索引可以实现更新.

#给B表添加唯一索引

ALTER TABLE B ADD UNIQUE KEY user_name(user_name)

#存在相同的user_name就执行UPDATE

INSERT INTO B (user_id,user_name) SELECT user_id,user_name FROM A
ON DUPLICATE KEY UPDATE user_id=VALUES(user_id),user_name=VALUES(user_name)

下面列几个常见的Hive必考HQL
#1. 级联求和问题 #######################

select a.username, a.month, max(a.salSum), sum(b.salSum) as salSum
from (select username, month, sum(salary) as salSum from t_salary_detail group by username,month) ajoin(select username, month, sum(salary) as salSum from t_salary_detail group by username,month) bon a.username=b.username
where a.month>=b.month
group by a.username,a.month;

#2. 连续3个月都有销售额的商家 #######################

select shopid,count(flag) as cnt
from (select shopid,dt,sale,rn,date_sub(to_date(dt),rn) as flag from (select shopid,dt,sale,row_number() over(partition by shopid order by dt) as rn from t_jd) tmp) tmp2
group by shopid,flag having cnt>=3

#3. 求TOPN问题 #######################

--统计每日最热门页面的top10
select month,day,request,request_count, od
from (select month,day,request,request_count,row_number() over(distribute by concat(month,day) sort by request_count desc) as odfrom (select month,day,request,count(1) as request_count from ods_weblog_detailwhere datestr='20130918' group by request,month,day having request is not null) b) c where od<=10

#4. 行转列, 列转行问题 #######################

–当前有用户人生阶段表lifeStage, 有用户唯一ID字段uid,用户人生阶段字段stage,其中stage字段内容为各个人生阶段标签按照英文逗号分割的拼接内容,
–如:计划买车,已买房, 并且每个用户的内容不同, 请使用hive sql统计每个人生阶段的用户量.
–考察点: lateral view使用, explode函数

select stage_someone,count(distinct uid) as uids
from lifeStagelateral view explode(split(stage,',')) lifeStage_tmp as stage_someone
group by stage_someone;

–和上一题相同的数据场景, 但是lifeStage中每行数据存储一个用户的人生阶段数据
–如: 一行数据uid是43, stage内容为计划买车, 另一行数据uid字段为43,stage字段为已买房, 请输出类似于uid为43,stage字段为计划买车,已买房这样的新整合数据.
–考察点: collect_set函数, concat_ws函数

select uid,concat_ws(',',collect_set(stage_someone)) as stage
from lifestage_multline
group by uid

#5. 多表关联的基础上, 行转列与列转行问题 #######################

–权限组表(g)中记录了组id和组名称,用户表(u)记录了用户id和用户名称,权限表(gu)是权限组表和用户表的关系,记录了每一个权限组与用户的对应关系
–题目是根据gt和ut表将gu表中的所有id转换为名称

create table gu_trans as
select t.gname as gname,concat_ws(',',collect_set(t.uname)) as uname
from(select g.gname,u.unamefrom(select gid,s_uidfrom gu lateral view explode(split(uid,',')) b as s_uid) tmp join g on tmp.gid=g.gidjoin u on tmp.s_uid=u.uid) t
group by t.gname

Mysql常见的面试总结相关推荐

  1. MySQL常见的面试经典108题

    前言: 大家都知道,无论你面试任何一个厂MySQL基本上是面试必问的题.经过无数次面经过后我总结了以下108道MySQL常见的面试题,望对大家有帮助!​ 目录 以下完整题目答案资料已存如文档,需要的朋 ...

  2. MySQL 常见面试知识点

    之前简单总结了一下MySQL的场景面试知识点 1.讲下MVCC原理 2.MySQL高可用架构介绍 3.OSC(在线更改表结构)原理 4.MySQL性能调优有哪些关键点/经验 5.MySQL在线备份方案 ...

  3. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

    转载地址: 阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com 说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化 ...

  4. sql基础教程亚马逊_针对Amazon,Apple,Google的常见SQL面试问题

    sql基础教程亚马逊 SQL is used in a wide variety of programming jobs. It's important to be familiar with SQL ...

  5. 厉害了,3万字的MySQL精华总结 + 面试100问!

    这是我的第 202 期分享 作者 | 派大新 来源 | JavaKeeper(ID:JavaKeeper) 分享 | Java中文社群(ID:javacn666) ❝ 写在之前:不建议那种上来就是各种 ...

  6. 可能是全网最好的MySQL重要知识点 | 面试必备

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 标题有点标题党的意思,但希望你在看了文章之后不会有这个想法--这篇文章是作者对之前总结的 M ...

  7. MySQL数据库,面试总结

    MySQL数据库,面试总结 1.B+,为什么要用,B+树实现,page block 2.索引,聚簇索引,覆盖索引,顺序索引 3.读写锁select for update 4.Acid 不同隔离性带来的 ...

  8. Java常见的面试算法题:实现两个线程交替打印1到100的数

    Java常见的面试算法题:实现两个线程交替打印1到100的数 思路: 这是涉及到多个线程打印的问题,一定会用到锁的(synchronized),故这就是一个多线程打印的典型案例. 代码实现: pack ...

  9. 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)

    常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...

最新文章

  1. java中冒号是什么意思_css样式表有哪些?css双冒号是什么意思
  2. 【BZOJ】3143: [Hnoi2013]游走
  3. 数据挖掘十大经典算法原理
  4. 谷歌浏览器32位安装包_谷歌团队新作!只需下载3M安装包,就能让你的手机浏览器跟踪眼球运动...
  5. 15款免费的Wi-Fi安全测试工具
  6. ong拼音汉字_汉语拼音ong的发音方法
  7. java.lang.ClassCastException: com.sun.proxy.$Proxy7 cannot be cast to comms.service.message
  8. How to Write a simple UEFI EDKII Application:如何编写一个UEFI简单的应用程序[5]
  9. 联想服务器win7系统安装教程,一键安装联想win7系统步骤指南
  10. JAVA API (application programming interface)
  11. JVM(6)之 二次标记
  12. 5G手机占比逼近四成,华为和小米将加速5G普及
  13. 超级好的6款办公软件,你用过几款呢?
  14. android8.1 source build/envsetup.sh分析 增加删除lunch
  15. Java怎样快速入门?该如何学Java?
  16. 雷蛇输出设备切换至THX无声音的解决方案
  17. 深度学习笔记(三)—— 反向传播[Back Propagation] 计算图[Computational Graph]
  18. 钢筋符号!每天学一点,进步惊人!收藏不会错!
  19. iTOP-4412开发板-10.1寸屏幕硬件修改支持排线和HDMI
  20. 初学者Cocos(TypeScritp)简单实现2048游戏

热门文章

  1. SAP Commerce Cloud Product Action 导出的层级结构设计
  2. SAP Fiori 页面的周期性动态刷新功能的实现步骤
  3. 控制SAP Spartacus shipping address页面spinner显示的逻辑
  4. SAP Spartacus单元测试用例中Component构造函数的调用上下文
  5. SAP Spartacus基于travis的持续集成
  6. Windows 10下安装Docker Desktop
  7. SAP Data Intelligence API执行出错的排错之道
  8. Service Agent在Hybris ASM里给一个客户移除了某个优惠券,背后发生了什么
  9. 介绍一个好用的Chrome扩展,能高效管理cookie
  10. hybris backoffice创建product遇到的synchronization问题和解答