當前位置:首頁 » 編程語言 » mysql面試資料庫sql題目
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

mysql面試資料庫sql題目

發布時間: 2022-10-02 19:46:31

Ⅰ mysql面試題

  1. select sname from s left join c on s.sname=c.cname where cteacher !='小美' group by sname;

  2. 第二天 題目太含糊了 不做了

Ⅱ 15個 MySQL 基礎面試題,DBA 們准備好了嗎

問題1:你如何確定 MySQL 是否處於運行狀態?
答案: 在Debian 上運行命令 service mysql status,然後看輸出即可。
在 RedHat 或者 centos 上運行命令 service mysqld status,然後看看輸出即可。

問題2:如何開啟或停止 MySQL 服務?
答案:運行命令 service mysqld start 開啟服務;
運行命令 service mysqld stop 停止服務。

問題3:如何通過 Shell 登入 MySQL?
答案:運行命令 mysql -u用戶名 -p登陸密碼

問題4:如何列出所有資料庫
答案:運行命令 show databases;

問題5: 如何切換到某個資料庫並在上面工作?
答案:(1)運行命令 use database_name;
(2)進入名為 database_name 的資料庫。

問題6:如何列出某個資料庫內所有表?
答案:在當前資料庫運行命令 show tables;

問題7:如何獲取表內所有 Field 對象的名稱和類型?
答案:運行命令 describe 表名;
簡寫為desc 表名;

問題8:如何刪除表?
答案:運行命令 drop table 表名;

問題9:如何刪除資料庫?
答案:運行命令 drop database 資料庫名;

問題10:如何查看錶內所有數據?
答案:運行命令 select * from 表名;

問題11:如何從表(比如 oc_users )中獲取一個 field 對象(比如 uid)的所有數據?
答案:運行命令 select uid from oc_users;

問題12:假設你有一個名為 『xyz』 的表,它存在多個欄位,如 『createtime』和 『engine』,
名為 engine 的欄位由 『Memoty』 和 『MyIsam』 兩種數值組成。
如何只列出 『createtime』 和 『engine』 這兩列,並且 engine 的值為 『MyIsam』?
答案:運行命令 select create_time, engine from xyz where engine = 「MyIsam」 ;

問題13:如何列出表 『xrt』 內 name 域值為 『tecmint』,web_address 域值為 『tecmint.com』 的所有數據?
答案:運行命令 select * from xrt where name = 「tecmint」 and web_address = 「tecmint.com」 ;

問題14:如何列出表 『xrt』 內 name 域值不為 『tecmint』,web_address 域值為 『tecmint.com』 的所有數據?
答案:運行命令 select * from xrt where name != 「tecmint」 and web_address = 「tecmint.com」;

問題15:如何知道表內行數?
答案:運行命令 select count(*) from 表名;

Ⅲ sql面試題50題(mysql版)

--插入學生表測試數據
insert into Student values(༽' , '趙雷' , 񟬶-01-01' , '男');
insert into Student values(༾' , '錢電' , 񟬶-12-21' , '男');
insert into Student values(༿' , '孫風' , 񟬶-05-20' , '男');
insert into Student values(ཀ' , '李雲' , 񟬶-08-06' , '男');
insert into Student values(ཁ' , '周梅' , 񟬷-12-01' , '女');
insert into Student values(ག' , '吳蘭' , 񟬸-03-01' , '女');
insert into Student values(གྷ' , '鄭竹' , 񟬵-07-01' , '女');
insert into Student values(ང' , '王菊' , 񟬶-01-20' , '女');
--課程表測試數據
insert into Course values(༽' , '語文' , ༾');
insert into Course values(༾' , '數學' , ༽');
insert into Course values(༿' , '英語' , ༿');
--教師表測試數據
insert into Teacher values(༽' , '張三');
insert into Teacher values(༾' , '李四');
insert into Teacher values(༿' , '王五');
--成績表測試數據
insert into Score values(༽' , ༽' , 80);
insert into Score values(༽' , ༾' , 90);
insert into Score values(༽' , ༿' , 99);
insert into Score values(༾' , ༽' , 70);
insert into Score values(༾' , ༾' , 60);
insert into Score values(༾' , ༿' , 80);
insert into Score values(༿' , ༽' , 80);
insert into Score values(༿' , ༾' , 80);
insert into Score values(༿' , ༿' , 80);
insert into Score values(ཀ' , ༽' , 50);
insert into Score values(ཀ' , ༾' , 30);
insert into Score values(ཀ' , ༿' , 20);
insert into Score values(ཁ' , ༽' , 76);
insert into Score values(ཁ' , ༾' , 87);
insert into Score values(ག' , ༽' , 31);
insert into Score values(ག' , ༿' , 34);
insert into Score values(གྷ' , ༾' , 89);
insert into Score values(གྷ' , ༿' , 98);

-- 1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
select c.*,a.s_score as 01課程score,b.s_score as 02課程score from
score a,score b
left join student c
on b.s_id = c.s_id
where a.s_id = b.s_id and a.c_id = ༽' and b.c_id = ༾' and a.s_score > b.s_score;

-- 2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
select a.* ,b.s_score as 01課程,c.s_score as 02課程 from student a
join score b
on a.s_id=b.s_id and b.c_id = ༽'
left join score c
on b.s_id = c.s_id and c.c_id = ༾'
where b.s_score < c.s_score ;

-- 3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.s_id,a.s_name,round(avg(b.s_score),2) as 平均成績 from student a
join score b
on a.s_id = b.s_id
group by b.s_id having 平均成績 >= 60;
備註:round[avg(成績),1]里,round是四捨五入函數,1代表保留1位小數

-- 4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
-- (包括有成績的和無成績的)
select b. ,round(avg(a.s_score),2) as 平均成績 from
student b
left join score a on b.s_id = a.s_id group by a.s_id having 平均成績 < 60
union
select b.
,0 as 平衡成績 from student b where b.s_id not in (select s_id from score);

-- 5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
select a.s_id,a.s_name,count(b.c_id) as 選課總數 ,sum(b.s_score) as 總分 from student a
left join score b
on a.s_id = b.s_id group by s_id ;

-- 6、查詢"李"姓老師的數量
select count(*) as 李姓老師數量 from teacher where t_name like '李%'

-- 7、查詢學過"張三"老師授課的同學的信息
select a.* from student a join score b
on a.s_id = b.s_id
where b.c_id in (select c.c_id from course c
join teacher d on c.t_id = d.t_id where d.t_name = '張三');

-- 8、查詢沒學過"張三"老師授課的同學的信息
select a.* from student a left join score b on a.s_id = b.s_id where a.s_id not in
(select s_id from score where c_id =
(select c_id from course where t_id =
(select t_id from teacher where t_name = '張
三'))) group by a.s_id;

-- 9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select a.s_id from score a join score b on a.s_id = b.s_id
where a.c_id = ༽' and b.c_id = ༾');

-- 10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
select * from student where s_id in
(select s_id from score where c_id = ༽' )
and s_id not in (select s_id from score where c_id = ༾' );

-- 11、查詢沒有學全所有課程的同學的信息
select * from student where s_id not in
(select s_id from score group by s_id having count(c_id) = 3);

-- 12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息
select distinct a.* from student a left join score b
on a.s_id = b.s_id where b.c_id in
(select c_id from score where s_id = ༽') and a.s_id != ༽' ;
注意:distinct是去重的

-- 13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息
select * from student where s_id in
(select s_id from score group by s_id having count(c_id) =
(select count(c_id) from score where s_id = ༽') and s_id not in
(select s_id from score where c_id not in
(select c_id from score where s_id = ༽')) and s_id != ༽');

-- 14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
select s_name from student where s_id not in
(select s_id from score where c_id in
(select c_id from course where t_id in
(select t_id from teacher where t_name ='張三')));

-- 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where s_score < 60 group by s_id having count(1) >=2;
或者試試
select a.s_id ,b.s_name,round(avg(a.s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id
where a.s_score < 60 group by a.s_id having count(*) >=2;

-- 16、檢索"01"課程分數小於60,按分數降序排列的學生信息
select a.* ,b.c_id ,b.s_score from student a
left join score b on a.s_id = b.s_id
where b.c_id = ༽' and b.s_score < 60
order by b.s_score desc;

-- 17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
select a.s_name ,
sum(case when b.c_id = ༽' then s_score else null end ) as 語文,
sum(case when b.c_id = ༾' then s_score else null end ) as 數學,
sum(case when b.c_id = ༿' then s_score else null end ) as 英語,
round(avg(s_score),2) as 平均成績
from student a left join score b on a.s_id = b.s_id group by a.s_name
order by 平均成績 desc;

-- 18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
--及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
select b.c_id,b.c_name,
max(a.s_score) as 最高分,
min(a.s_score) as 最低分,
round(avg(a.s_score),2) as 平均分,
round(sum(case when a.s_score>= 60 then 1 else 0 end)/count(s_id),2) as 及格率 ,
round(sum(case when a.s_score>= 70 and a.s_score <80 then 1 else 0 end)/count(s_id),2) as 中等率,
round(sum(case when a.s_score>= 80 and a.s_score <90 then 1 else 0 end)/count(s_id),2) as 優良率,
round(sum(case when a.s_score>= 90 then 1 else 0 end)/count(s_id),2) as 優秀率
from score a
left join course b
on a.c_id = b.c_id group by b.c_id;

-- 19、按各科成績進行排序,並顯示排名
第一種:
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2;

如果看不懂用第二種方法:
SELECT a.c_id,a.s_id,a.s_score,COUNT(b.s_score)+1 AS 排名
FROM score a LEFT JOIN score b ON a.s_score<b.s_score AND a.c_id = b.c_id
GROUP BY a.c_id,a.s_id,a.s_score ORDER BY a.c_id,排名,a.s_id ASC

-- 20、查詢學生的總成績並進行排名
set @rank:=0;
select * ,(@rank:=@rank+1) as rank from
(select s_id ,sum(s_score) as 總成績 from score
group by s_id order by 總成績 desc) tb1;

-- 21、查詢不同老師所教不同課程平均分從高到低顯示
select a.c_id, d.t_name,round(avg(a.s_score)) as 平均分 from score a
left join student b on a.s_id = b.s_id
left join course c on a.c_id = c.c_id
left join teacher d on c.t_id = d.t_id group by a.c_id
order by 平均分 desc;

-- 22、查詢所有課程的成績第2名到第3名的學生信息及該課程成績
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 = 2 or 排名 =3;

-- 23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],(85-70],(70-60],(0-60]及所佔百分比
select b.c_id,b.c_name ,
sum(case when a.s_score >=85 then 1 else 0 end) as 100-85 ,
concat(round(100 sum(case when a.s_score >=85 then 1 else 0 end)/count( ),2), '%') as 百分比,
sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end) as 85-70 ,
concat(round(100 sum(case when a.s_score <85 and a.s_score >=70 then 1 else 0 end)/count( ),2),'%') as 百分比,
sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end) as 70-60 ,
concat(round(100 sum(case when a.s_score <70 and a.s_score >=60 then 1 else 0 end)/count( ),2) ,'%')as 百分比,
sum(case when a.s_score <60 and a.s_score >=0 then 1 else 0 end) as 60-0 ,
concat(round(100 sum(case when a.s_score <60 and a.s_score >=0 then 1
else 0 end)/count(
),2),'%') as 百分比
from score a left join course b on a.c_id = b.c_id group by b.c_id;

-- 24、查詢學生平均成績及其名次
select tb1.*,(@rank:=@rank +1 ) as rank from
(select s_id ,round(avg(s_score),2) as 平均成績 from score
group by s_id order by 平均成績 desc) tb1,(select @rank:=0) b;

-- 25、查詢各科成績前三名的記錄
set @pre_c_id:= ༽'
set @rank:=0;
select b.s_name,tb2.s_id ,tb2.c_id,tb2.s_score,tb2.排名 from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2 join student b on tb2.s_id = b.s_id where 排名 <4;

-- 26、查詢每門課程被選修的學生數
select c_id ,count(s_id) as 選修人數 from score group by c_id;

-- 27、查詢出只有兩門課程的全部學生的學號和姓名
select a.s_id ,b.s_name from score a left join student b on a.s_id = b.s_id group by s_id having count(*) = 2;

-- 28、查詢男生、女生人數
select sum(case s_sex when '男' then 1 else 0 end) as 男生人數,
sum(case s_sex when '女' then 1 else 0 end) as 女生人數 from student;

-- 29、查詢名字中含有"風"字的學生信息
select * from student where s_name like '%風%'

-- 30、查詢同名同性學生名單,並統計同名人數
--略,不想寫

-- 31、查詢1990年出生的學生名單
select * from student where s_birth like 񟬶%'

-- 32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
select c_id ,round(avg(s_score),2) as 平均成績 from score group by c_id order by 平均成績 desc, c_id asc;

-- 33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
select a.s_id,b.s_name ,round(avg(s_score),2) as 平均成績 from score a
left join student b on a.s_id = b.s_id group by a.s_id having 平均成績>=85;

-- 34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
select b.s_name ,a.s_score from score a
left join student b on a.s_id = b.s_id
where a.c_id=(select c_id from course where c_name = '數學')and a.s_score < 60;

-- 35、查詢所有學生的課程及分數情況;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name

-- 36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
select b.s_name,
sum(case when a.c_id = ༽' then a.s_score else null end) as 語文,
sum(case when a.c_id = ༾' then a.s_score else null end) as 數學,
sum(case when a.c_id = ༿' then a.s_score else null end) as 英語
from score a right join student b on a.s_id = b.s_id group by b.s_name having 語文>= 70 or 數學>= 70 or 英語>= 70 ;

-- 37、查詢不及格的課程
select a.s_id,a.c_id,b.c_name,a.s_score from score a
left join course b on a.c_id = b.c_id where a.s_score<60;

--38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名;
select a.s_id,b.s_name from score a left join student b on a.s_id = b.s_id where a.c_id = ༽' and a.s_score>=80;

-- 39、求每門課程的學生人數
select c_id,count(*) as 學生人數 from score group by c_id ;

-- 40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
select a.*,b.c_id,max(b.s_score) as 最高成績 from student a
right join score b on a.s_id = b.s_id
group by b.c_id
having b.c_id = (select c_id from course
where t_id = (select t_id from teacher where t_name = '張三'));

-- 41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
--(這題我搞不清題目是什麼意思,是指查找學生個體參加了的所有課程的成績各不相同的那個學生信息呢?還是所有課程之間做對比呢,我更傾向於理解為前者)

--理解為前者的寫法
select * from
(select * from score group by s_id,s_score) tb1
group by s_id having count(*) = 1;

--理解為後者的寫法
select distinct a.s_id,a.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score;

-- 42、查詢每門課程成績最好的前兩名
set @pre_c_id:= ༽'
set @rank:=0;
select tb2.s_id ,tb2.c_id,tb2.s_score from
(select *,(case when tb1.c_id = @pre_c_id then @rank:=@rank+1 else @rank:=1 end) as 排名,
(case when @pre_c_id = tb1.c_id then @pre_c_id else @pre_c_id:=tb1.c_id end ) as pre_c_id
from
(select * from score order by c_id,s_score desc) tb1 )tb2
join student b on tb2.s_id = b.s_id where 排名 <3;

-- 43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人相同,按課程號升序排列
select c_id ,count(*) as 選修人數 from score group by c_id having 選修人數>5 order by 選修人數 desc , c_id asc;

-- 44、檢索至少選修兩門課程的學生學號
select s_id from score group by s_id having count(*) >= 2;

-- 45、查詢選修了全部課程的學生信息
select * from student where s_id in
(select s_id from score group by s_id having count(*) = 3)

--46、查詢各學生的年齡
select s_name ,(date_format(now(),'%Y')-date_format(s_birth,'%Y') + (CASE when date_format(now(),'%m%d')>=date_format(s_birth,'%m%d') then 0 else 1 end)) as age
from student

-- 47、查詢本周過生日的學生
---(實現得並不完全,因為例如出生月日為『01-01』在每一年可能會輸入不同周)
select * from student where week(date_format(s_birth,'%m%d'))=week(date_format(now(),'%m%d')) ;

-- 48、查詢下周過生日的學生
select * from student
where week(date_format(s_birth,'%m%d'))=week(date_format(date_add(now(),interval 7-dayofweek(now())+1 day),'%m%d'));

-- 49、查詢本月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(now(),'%m')

-- 50、查詢下月過生日的學生
select * from student where date_format(s_birth,'%m') = date_format(date_add(now(),interval 1 month),'%m')

Ⅳ 哪位大俠可以提供一些mysql資料庫的題庫,一定要帶答案的!將感激不盡!!

一、不定項選擇題(共40題,每小題2.5分,總分100分)
1. 資料庫管理系統的發展歷經了如下那些模型階段( ACDE )
A. 層次模型 B. 結構模型 C. 關系模型
D. 網狀模型 E.對象模型
2. 關系型資料庫的核心單元是( B )
A. 對象 B. 表
C. 行 D. 列
3. 對於關系型資料庫來說,表之間存在下面那些關系( ABC )
A. 一對一關系 B. 一對多關系
C. 多對多關系 D. 繼承關系
4. 在SQL中,下面對於數據定義語言(DDL)描述正確的是( D )。
A. DDL關心的是資料庫中的數據 B. 完成數據的增、刪、改、查操作
C. 控制對資料庫的訪問 D. 定義資料庫的結構
5. MySQL是一種( C )資料庫管理系統。
A. 層次型 B. 網路型 C. 關系型 D. 對象型
6. SQL中,下列操作有語法錯誤的是( B )
A. AGE IS NOT NULL B. NOT(AGE IS NULL)
C. SNAME=『王五』 D. SNAME=『王%』
7. SQL中,下列關於創建、管理資料庫的操作語句不正確的是( CDE )
A. CREATE DATABASE Instant B. USE Instant C. NEW DATABASE Instant
D. Connection Instant E. Delete DATEBASE Instant
8. 在MySQL中,不存在的數據類型是( F )。
A. INT B. TEXT C. DECIMAL
D. VARCHAR E. DATETIME F. VARCHAR2
9. 在MySQL中,下列關於創建資料庫表的描述正確的是( C )。
A. 在創建表時必須設定列的約束
B. 在刪除表的時候通過外鍵約束連接在一起的表會被一同刪除
C. 在創建表時必須設置列類型
D. 通過CREATE TABLE new_t SELECT * FROM old_t復製表的同時,表的約束能夠一起被復制到新表中
10. 根據數據完整性實施的方法,可以將其分為( ACDF )
A. 實體完整性 B. 表完整性 C.域完整性
D. 引用完整性 E. 記錄完整性 F.用戶自定義完整性
11. 下面關於域完整性的方法,不正確的是( A )。
A. 主鍵約束 B. 外鍵約束 C.檢查約束
D. 非空約束 E. 默認值
12. 下面關於創建和管理索引正確的描述是( C )。
A. 創建索引是為了便於全表掃描
B. 索引會加快DELETE、UPDATE和INSERT語句的執行速度
C. 索引被用於快速找到想要的記錄
D. 大量使用索引可以提高資料庫的整體性能
13. SQL中,「AGE IN(20,22)」的語義是( D )。
A. AGE<=22 AND AGE >=20 B. AGE <22 AND AGE >20
C. AGE =20 AND AGE =22 D. AGE =20 OR AGE =22
14. 有一個關系:學生(學號,姓名,系別),規定學號的值域是8個數字組成的字元串,這一規則屬於( C )
A. 實體完整性約束 B. 參照完整性約束
C. 用戶自定義完整性約束 D. 關鍵字完整性約束
15. 下面SQL是來源於考試成績表t_exam:學號stuId、科目編號subId、成績score,考試日期:ex_date。有以下sql,它表示的意思是:( B )
Select stu_id,subId,count(*) as x
From t_exam
Where ex_date=』2008-08-08』
Group stu_id,subId
Having count(*)>1
Order by x desc
A. 找出』2008-08-08』這天某科考試2次及以上的學生記錄
B. 找出』2008-08-08』這天,某科考試2次及以上的學生記錄,考試次數多的放在前面
C. 找出』2008-08-08』這天,某科考試2次及以上的學生記錄,考試次數少的放在前面
D. 根據學號和學科分組,找出每個人考試科數,最後考試次數多的放在前面
16. EMP表如下所示,下面哪些SQL語句的返回值為3:( BD )
EMP
雇員號 雇員名 部門號 工資
001 張山 022000
010 王宏達01 1200
056 馬林生02 1000
101 趙敏 04
A. select count(*) from emp
B. select count(distinct 部門號) from emp
C. select count(*) from emp group by 雇員號
D. select count(工資) from emp
17. 下面那一項不是SELECT語句對數據的操作:( D )
A. 投影 B. 聯接 C. 並 D. 級聯
18. 下面關於SQL數據查詢操作描述正確的有:( ABD )
A. 投影操作是選擇對表中的哪些列進行查詢操作
B. 使用DISTINCT關鍵字可以過濾查詢中重復的記錄
C. 在模糊查詢中,通配符「%」表示匹配單個字元,而「_」表示匹配零個或多個字元
D. 在MySQL中使用LIMIT關鍵字限制從資料庫中返回記錄的行數
19. 在SQL語言中,條件「BETWEEN 20 AND 30」表示年齡在20到30之間,且( A )。
A. 包括20歲和30歲 B. 不包括20歲和30歲
C. 包括20歲,不包括30歲 D. 不包括20歲,包括30歲
20. SQL語言中,刪除EMP表中全部數據的命令正確的是( C )。
A. delete * from emp B. drop table emp
C. truncate table emp D. 沒有正確答案
21. 有關索引的說法錯誤的是( AD )
A. 索引的目的是為增加數據操作的速度
B. 索引是資料庫內部使用的對象
C. 索引建立得太多,會降低數據增加刪除修改速度
D. 只能為一個欄位建立索引
22. 下列哪個關鍵字在Select語句中表示所有列( A )
A. * B. ALL C. DESC D. DISTINCT
23. 在表中設置外鍵實現的是哪一類數據完整性( B )
A. 實體完整性 B. 引用完整性
C. 用戶定義的完整性 D. 實體完整性、引用完整性和用戶定義的完整性
24. 下面正確表示Employees表中有多少非NULL的Region列的SQL語句是( B )
A. SELECT count(* ) from Employees
B. SELECT count(ALL Region) from Employees
C. SELECT count(Distinct Region) from Employees
D. SELECT sum(ALL Region) from Employees
25. 下面可以通過聚合函數的結果來過濾查詢結果集的SQL子句是( C )
A. WHERE子句 B. GROUP BY子句
C. HAVING 子句 D. ORDER BY子句
26. t_score(stu_id,sub_id,score),即成績表(學號,科目編號,成績)。學生如果某科沒有考試,則該科成績錄入null。能夠獲取各位學生的平均成績的選項是( A )
A. select avg(nvl(socre,0)) from score group by stu_id
B. select stu_id,avg(sorce) from score
C. select stu_id,avg(score) from score
D. select stu_id,sum(score)/count(score) from score
27. 若要求查找S表中,姓名的第一個字為'王'的學生學號和姓名。下面列出的SQL語句中,哪個是正確的( B )
A. SELECT Sno,SNAME FROM S WHERE SNAME=′王%′
B. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王%′
C. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王_′
D. 全部
28. 若要求「查詢選修了3門以上課程的學生的學生號」,正確的SQL語句是( B )
A. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT(*)> 3
B. SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT(*)> 3)
C. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT(*)> 3
D. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(*)>= 3
29. 對下面的查詢語句描述正確的是( D )
Select StudentID,Name,
(select count(*) from StudentExam
where StudentExam.StudentID = Student.StudentID) as ExamsTaken
from Student
order by ExamsTaken desc
A. 從Student表中查找StudentID和Name,並按照升序排列
B. 從Student表中查找StudentID和Name,並按照降序排列
C. 從Student表中查找StudentID、Name和考試次數
D. 從Student表中查找StudentID、Name,並從StudentExam表中查找與StudentID一致的學生考試次數,並按照降序排列

30. 下面題基於學生-課程資料庫中的三個基本表:
學生信息表:s(sno, sname, sex, age, dept) 主鍵為sno
課程信息表:c(cno, cname, teacher) 主鍵為cno
學生選課信息表:sc(sno, cno, grade) 主鍵為(sno, cno)
「從學生選課信息表中找出無成績的學生信息」的SQL語句是( C d )

A.

SELECT * FROM sc WHERE grade=NULL

B.

SELECT * FROM sc WHERE grade IS 『 』

C.

SELECT * FROM sc WHERE grade IS NULL

D.

SELECT * FROM sc WHERE grade =『 』

31. 當子查詢返回多行時,可以採用的解決辦法是( C )。
A. 使用聚合函數 B. Where條件判斷
C. 使用IN運算符 D. 使用Group by進行分組
32. 下面關於在子查詢中使用運算符描述不正確的是( D )。
A. 使用IN運算符用於查找欄位值屬於某一組值的行
B. 使用Exists運算符用於測試子查詢是否返回行,如果返回其值就為真
C. 使用ALL運算符用於測試子查詢結果集的所有行是否滿足指定的條件
D. 使用Any運算符用於測試子查詢結果集中的一行或多行不滿足指定的條件
33. 下面關於組合查詢描述不正確的是( D )。
A. 從一個表中獲取的數據必須和其它表中的數據具有相同的列數
B. 兩個表中相對應的列必須具有相同的數據類型
C. UNION的結果集列名與第一個SELECT語句的結果集中的列名相同
D. UNION的結果集列名與第二個SELECT語句的結果集中的列名相同
E. UNION ALL運算符返回每個數據集的所有成員
34. 下面關於聯接的描述正確的是( A )。
A. 內聯接使用比較運算符根據每個表共有的列值來匹配兩個表中的行
B. 左外聯接結果集包含從右邊的表返回的所有行
C. 右外聯接結果集包含從左邊的表返回的所有行
D. 全外聯接返回左表和右表中的所有匹配的行
35. 下面關於資料庫設計過程正確的順序描述是( C )。
A. 需求收集和分析、邏輯設計、物理設計、概念設計
B. 概念設計、需求收集和分析、邏輯設計、物理設計
C. 需求收集和分析、概念設計、邏輯設計、物理設計
D. 需求收集和分析、概念設計、物理設計、邏輯設計
36. ER圖屬於下面哪一種資料庫設計模型( B )。
A. 物理數據模型
B. 概念數據模型
C. 邏輯數據模型
D. 需求模型
37. 非主鍵必須完全依賴於主鍵列,這屬於下列範式的內容( BC )
A. 1NF B. 2NF C. 3NF D. 都沒有的
38. 如果一個欄位的數據必須來源另一個表的主鍵,那麼要在這個欄位上建立( B )。
A. PK(主鍵) B. FK(外鍵) C. UK(唯一鍵) D. 復合主鍵
39. 根據三個範式的定義,下面哪個選項的設計是正確的( C )
職工編號 姓名 工種 車間 車間主任
1001 李寧 車工 一車間 周傑
1002 王海 銑工 一車間 周傑
1003 趙亮 鉗工 二車間 吳明
1001 李寧 鉗工 二車間 吳明
A. 員工表、工種表、車間表
B. 員工表、工種表、車間表、車間主任表
C. 員工表、工種表、車間表、員工工種表、員工車間表
D. 以上設計均不正確

40. 下列說法中,哪些是正確的( BD )
A. RDBMS是資料庫管理系統的簡稱
B. 各行記錄都不能重復,是第二範式要求的
C. 在資料庫設計中一定要滿足第三範式
D. 索引越多,查詢越快,數據更新越慢

Ⅳ 「春招系列」MySQL面試核心25問(附答案)

篇幅所限本文只寫了MySQL25題,像其他的Redis,SSM框架,演算法,計網等技術棧的面試題後面會持續更新,個人整理的1000餘道面試八股文會放在文末給大家白嫖,最近有面試需要刷題的同學可以直接翻到文末領取。

如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序添加到當前索引節點的後續位置,當一頁寫滿,就會自動開辟一個新的頁。如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置, 頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE(optimize table)來重建表並優化填充頁面。

Server層按順序執行sql的步驟為:

簡單概括:

可以分為服務層和存儲引擎層兩部分,其中:

服務層包括連接器、查詢緩存、分析器、優化器、執行器等 ,涵蓋MySQL的大多數核心服務功能,以及所有的內置函數(如日期、時間、數學和加密函數等),所有跨存儲引擎的功能都在這一層實現,比如存儲過程、觸發器、視圖等。

存儲引擎層負責數據的存儲和提取 。其架構模式是插件式的,支持InnoDB、MyISAM、Memory等多個存儲引擎。現在最常用的存儲引擎是InnoDB,它從MySQL 5.5.5版本開始成為了默認的存儲引擎。

Drop、Delete、Truncate都表示刪除,但是三者有一些差別:

Delete 用來刪除表的全部或者一部分數據行,執行Delete之後,用戶需要提交(commmit)或者回滾(rollback)來執行刪除或者撤銷刪除,會觸發這個表上所有的delete觸發器。

Truncate 刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器,TRUNCATE比Delete更快,佔用的空間更小。

Drop 命令從資料庫中刪除表,所有的數據行,索引和許可權也會被刪除,所有的DML觸發器也不會被觸發,這個命令也不能回滾。

因此,在不再需要一張表的時候,用Drop;在想刪除部分數據行時候,用Delete;在保留表而刪除所有數據的時候用Truncate。

隔離級別臟讀不可重復讀幻影讀 READ-UNCOMMITTED 未提交讀 READ-COMMITTED 提交讀 REPEATABLE-READ 重復讀 SERIALIZABLE 可串列化讀

MySQL InnoDB 存儲引擎的默認支持的隔離級別是 REPEATABLE-READ (可重讀)

這里需要注意的是 :與 SQL 標准不同的地方在於InnoDB 存儲引擎在 REPEATABLE-READ(可重讀)事務隔離級別 下使用的是 Next-Key Lock 鎖 演算法,因此可以避免幻讀的產生,這與其他資料庫系統(如 SQL Server)是不同的。所以 說InnoDB 存儲引擎的默認支持的隔離級別是 REPEATABLE-READ(可重讀) 已經可以完全保證事務的隔離性要 求,即達到了 SQL標準的SERIALIZABLE(可串列化)隔離級別。

因為隔離級別越低,事務請求的鎖越少,所以大部分資料庫系統的隔離級別都是READ-COMMITTED(讀取提交內 容):,但是你要知道的是InnoDB 存儲引擎默認使用 REPEATABLE-READ(可重讀)並不會有任何性能損失

InnoDB 存儲引擎在分布式事務 的情況下一般會用到SERIALIZABLE(可串列化)隔離級別。

主要原因:B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷,而且在資料庫中基於范圍的查詢是非常頻繁的,而B樹只能中序遍歷所有節點,效率太低。

文件與資料庫都是需要較大的存儲,也就是說,它們都不可能全部存儲在內存中,故需要存儲到磁碟上。而所謂索引,則為了數據的快速定位與查找,那麼索引的結構組織要盡量減少查找過程中磁碟I/O的存取次數,因此B+樹相比B樹更為合適。資料庫系統巧妙利用了局部性原理與磁碟預讀原理,將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入,而紅黑樹這種結構,高度明顯要深的多,並且由於邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性。

最重要的是,B+樹還有一個最大的好處:方便掃庫。

B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支持range-query非常方便,而B樹不支持,這是資料庫選用B+樹的最主要原因。

B+樹查找效率更加穩定,B樹有可能在中間節點找到數據,穩定性不夠。

B+tree的磁碟讀寫代價更低:B+tree的內部結點並沒有指向關鍵字具體信息的指針(紅色部分),因此其內部結點相對B 樹更小。如果把所有同一內部結點的關鍵字存放在同一塊盤中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多,相對來說IO讀寫次數也就降低了;

B+tree的查詢效率更加穩定:由於內部結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引,所以,任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當;

視圖是一種虛擬的表,通常是有一個表或者多個表的行或列的子集,具有和物理表相同的功能 游標是對查詢出來的結果集作為一個單元來有效的處理。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。

而在 MySQL 中,恢復機制是通過回滾日誌(undo log)實現的,所有事務進行的修改都會先記錄到這個回滾日誌中,然後在對資料庫中的對應行進行寫入。當事務已經被提交之後,就無法再次回滾了。

回滾日誌作用:1)能夠在發生錯誤或者用戶執行 ROLLBACK 時提供回滾相關的信息 2) 在整個系統發生崩潰、資料庫進程直接被殺死後,當用戶再次啟動資料庫進程時,還能夠立刻通過查詢回滾日誌將之前未完成的事務進行回滾,這也就需要回滾日誌必須先於數據持久化到磁碟上,是我們需要先寫日誌後寫資料庫的主要原因。

InnoDB

MyISAM

總結

資料庫並發會帶來臟讀、幻讀、丟棄更改、不可重復讀這四個常見問題,其中:

臟讀 :在第一個修改事務和讀取事務進行的時候,讀取事務讀到的數據為100,這是修改之後的數據,但是之後該事務滿足一致性等特性而做了回滾操作,那麼讀取事務得到的結果就是臟數據了。

幻讀 :一般是T1在某個范圍內進行修改操作(增加或者刪除),而T2讀取該范圍導致讀到的數據是修改之間的了,強調范圍。

丟棄修改 :兩個寫事務T1 T2同時對A=0進行遞增操作,結果T2覆蓋T1,導致最終結果是1 而不是2,事務被覆蓋

不可重復讀 :T2 讀取一個數據,然後T1 對該數據做了修改。如果 T2 再次讀取這個數據,此時讀取的結果和第一次讀取的結果不同。

第一個事務首先讀取var變數為50,接著准備更新為100的時,並未提交,第二個事務已經讀取var為100,此時第一個事務做了回滾。最終第二個事務讀取的var和資料庫的var不一樣。

T1 讀取某個范圍的數據,T2 在這個范圍內插入新的數據,T1 再次讀取這個范圍的數據,此時讀取的結果和和第一次讀取的結果不同。

T1 和 T2 兩個事務都對一個數據進行修改,T1 先修改,T2 隨後修改,T2 的修改覆蓋了 T1 的修改。例如:事務1讀取某表中的數據A=50,事務2也讀取A=50,事務1修改A=A+50,事務2也修改A=A+50,最終結果A=100,事務1的修改被丟失。

T2 讀取一個數據,T1 對該數據做了修改。如果 T2 再次讀取這個數據,此時讀取的結果和第一次讀取的結果不同。

悲觀鎖,先獲取鎖,再進行業務操作,一般就是利用類似 SELECT … FOR UPDATE 這樣的語句,對數據加鎖,避免其他事務意外修改數據。當資料庫執行SELECT … FOR UPDATE時會獲取被select中的數據行的行鎖,select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

樂觀鎖,先進行業務操作,只在最後實際更新數據時進行檢查數據是否被更新過。Java 並發包中的 AtomicFieldUpdater 類似,也是利用 CAS 機制,並不會對數據加鎖,而是通過對比數據的時間戳或者版本號,來實現樂觀鎖需要的版本判斷。

分庫與分表的目的在於,減小資料庫的單庫單表負擔,提高查詢性能,縮短查詢時間。

通過分表 ,可以減少資料庫的單表負擔,將壓力分散到不同的表上,同時因為不同的表上的數據量少了,起到提高查詢性能,縮短查詢時間的作用,此外,可以很大的緩解表鎖的問題。分表策略可以歸納為垂直拆分和水平拆分:

水平分表 :取模分表就屬於隨機分表,而時間維度分表則屬於連續分表。如何設計好垂直拆分,我的建議:將不常用的欄位單獨拆分到另外一張擴展表. 將大文本的欄位單獨拆分到另外一張擴展表, 將不經常修改的欄位放在同一張表中,將經常改變的欄位放在另一張表中。對於海量用戶場景,可以考慮取模分表,數據相對比較均勻,不容易出現熱點和並發訪問的瓶頸。

庫內分表 ,僅僅是解決了單表數據過大的問題,但並沒有把單表的數據分散到不同的物理機上,因此並不能減輕 MySQL 伺服器的壓力,仍然存在同一個物理機上的資源競爭和瓶頸,包括 CPU、內存、磁碟 IO、網路帶寬等。

分庫與分表帶來的分布式困境與應對之策 數據遷移與擴容問題----一般做法是通過程序先讀出數據,然後按照指定的分表策略再將數據寫入到各個分表中。分頁與排序問題----需要在不同的分表中將數據進行排序並返回,並將不同分表返回的結果集進行匯總和再次排序,最後再返回給用戶。

不可重復讀的重點是修改,幻讀的重點在於新增或者刪除。

視圖是虛擬的表,與包含數據的表不一樣,視圖只包含使用時動態檢索數據的查詢;不包含任何列或數據。使用視圖可以簡化復雜的 sql 操作,隱藏具體的細節,保護數據;視圖創建後,可以使用與表相同的方式利用它們。

視圖不能被索引,也不能有關聯的觸發器或默認值,如果視圖本身內有order by 則對視圖再次order by將被覆蓋。

創建視圖:create view xxx as xxxx

對於某些視圖比如未使用聯結子查詢分組聚集函數Distinct Union等,是可以對其更新的,對視圖的更新將對基表進行更新;但是視圖主要用於簡化檢索,保護數據,並不用於更新,而且大部分視圖都不可以更新。

B+tree的磁碟讀寫代價更低,B+tree的查詢效率更加穩定 資料庫索引採用B+樹而不是B樹的主要原因:B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷,而且在資料庫中基於范圍的查詢是非常頻繁的,而B樹只能中序遍歷所有節點,效率太低。

B+樹的特點

在最頻繁使用的、用以縮小查詢范圍的欄位,需要排序的欄位上建立索引。不宜:1)對於查詢中很少涉及的列或者重復值比較多的列 2)對於一些特殊的數據類型,不宜建立索引,比如文本欄位(text)等。

如果一個索引包含(或者說覆蓋)所有需要查詢的欄位的值,我們就稱 之為「覆蓋索引」。

我們知道在InnoDB存儲引 擎中,如果不是主鍵索引,葉子節點存儲的是主鍵+列值。最終還是要「回表」,也就是要通過主鍵再查找一次,這樣就 會比較慢。覆蓋索引就是把要查詢出的列和索引是對應的,不做回表操作!

舉例

學號姓名性別年齡系別專業 20020612李輝男20計算機軟體開發 20060613張明男18計算機軟體開發 20060614王小玉女19物理力學 20060615李淑華女17生物動物學 20060616趙靜男21化學食品化學 20060617趙靜女20生物植物學

主鍵為候選鍵的子集,候選鍵為超鍵的子集,而外鍵的確定是相對於主鍵的。

Ⅵ MySQL資料庫面試題:A表有10條數據B表有9條數據用左鏈接一共能查出多少條數據

10條數據,左連接就是把左邊的表當成主表,即不管右邊有多少數據,都會展示左邊的10條

Ⅶ 面試題目(sql)

1、忍不住想說一句,因為第一題中的欄位類型是
【日期型】,而各種資料庫操作日期型數據有不同的方法,沒有一種共通的方法,所以脫離了資料庫而言沒有一種共通的sql。
2、select
ID,NAME,ADDRESS,PHONE,LOGDATE
from
T
where
ID
in(
select
ID
from
T
group
by
NAME
having
count(*)>1)
order
by
NAME;
3、delete
from
T
where
ID
not
in
(select
min(id)
from
T
group
by
name);
4、update
T
set
T.ADDRESS=(select
E.ADDRESS
from
E
where
E.NAME=T.NAME),
T.PHONE=(select
E.PHONE
from
E
where
E.NAME=T.NAME);
5、這個不同的資料庫也有不同的處理方法,不能脫離資料庫談了。
如:SqlServer或者access可以使用
top
oracle可以使用
rownum

---
以上,希望對你有所幫助。

Ⅷ 大數據分析師面試必備:java與mysql解析

【導讀】作為大數據工程師,其必須要掌握的基礎知識就是java與mysql的關系、交互和連接,作為基礎,也是面試考官經常會考的內容,為了幫助大家都能順利通過考試,今天小編就來和大家嘮一嘮java與mysql的關系、交互和連接,好了,開始今天的內容大數據分析師面試必備:java與mysql解析。

1. SQL語言四大類:

DQL 數據查詢語言 select

DML 數據操作語言 insert、update、delete

DDL 數據界說語言 create、alter

DCL 數據控制語言 grant許可權

2. mysql資料庫中的decimal類型(是數值型,不能存放字元串):

舉例:decimal(18,0) 常用於身份證號碼,但是帶x的不可以。

舉例:decimal(5,2)

狀況一:假設小數點前面是3位,後邊是2位,正常狀況。

狀況二:5指的是小數點前後不能超過5位,小數點後有必要是2位。

3. mysql中InnoDB和MyISAM引擎的差異:

innodb支撐:事務和主外鍵

myisam不支撐:事務和主外鍵

4. 【不需要背誦,選擇題考點】向mysql中,a向表中添加數據的幾種寫法,題目:id int 主鍵自增,name varchar(11)
不為空。

5. 操作mysql資料庫表有兩種方式,第一種:點八點吧;第二種:寫代碼。【不需要背誦,只需要了解,考試選擇題會出】

6. 在Java中,簡述面向對象三大特徵。

7. 在Java中,常用關鍵字:

1. 定義類的關鍵字是什麼? class

2. 繼承的關鍵字是什麼? extends

3. 定義介面的關鍵字是什麼? interface

4. 實現介面的關鍵字是什麼? implements

5. 抽象類的關鍵字是什麼? abstract

8. 在Java中,抽象類和介面的區別:

1. 抽象類中可以包含普通方法和抽象方法,介面中只能包含抽象方法

2. 抽象類中可以有構造方法,介面中沒有構造方法

3. 抽象類只能單繼承,可以實現多個介面

9. Java介面中有哪些成員?

1. 構造方法,沒有

2. 常量,默認訪問修飾符public static final,沒有變數

3. 抽象方法,默認訪問修飾符public abstract

10. 在Java中,抽象類和抽象方法的關系:

1. 抽象類中可以包含普通方法和抽象方法,抽象方法一定存在抽象類中。

2. 子類繼承抽象父類,必須實現|重寫抽象方法,除非子類也是抽象類。

3. 【判斷題】抽象類中必須包含抽象方法?【錯誤×】

4. 【判斷題】抽象方法一定存在抽象類中?【正確√】

11. Java重載的特點:

1. 在同一個類中

2. 方法名相同

3. 參數列表(個數、類型、順序)不同

4. 與返回值類型和訪問修飾符無關

12. Java重寫的特點:

1. 在父子類中

2. 方法名相同

3. 參數列表相同

4. 返回值類型相同,或是其子類

5. 訪問修飾符相同,或不能嚴於父類

13. 列舉幾種Java實現多態的形式:

1. 繼承的存在

2. 父類引用指向子類對象 | 向上轉型

3. 父類作為方法的返回值類型,父類作為方法的參數

14. Java介面的特性:單根性和傳遞性

15. 在Java中,throws和throw的區別:

1. throws 聲明異常,用在定義方法小括弧的後面

2. throw 拋出異常,寫在方法體內

以上就是小編今天給大家整理發送的關於大數據分析師面試必備:java與mysql解析的相關內容,希望對各位考生有所幫助,想知道更多關於數據分析師的基本要求有哪些,關注小編持續更新數據分析師崗位解析。

Ⅸ 請教大神,一個MySQL面試題的SQL寫法,要求如下

SQL創建語法存在問題。 請檢查創建語法。
SQL創建語法存在問題。 請檢查創建語法。