Ⅰ mysql面试题
select sname from s left join c on s.sname=c.cname where cteacher !='小美' group by sname;
第二天 题目太含糊了 不做了
Ⅱ 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创建语法存在问题。 请检查创建语法。