日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql常见的面试总结

發布時間:2023/12/19 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql常见的面试总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一題

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常见的面试总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。