面试题 | 数据库笔试题集合·之·SQL语句
Posted moox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 | 数据库笔试题集合·之·SQL语句相关的知识,希望对你有一定的参考价值。
第2章 SQL 语句
2.1 选择
2.1.1 DELETE FROM S WHERE 年龄>60 语句的功能是( A )
A.从 S 表中彻底删除年龄大于 60 岁的记录
B.S 表中年龄大于 60 岁的记录被加上删除标记
C.删除 S 表
D.删除 S 表的年龄列
2.1.2 使用什么命令可以清除表中所有的内容? ( CD )
A.INSERT B.UPDATE
C.DELETE D.TRUNCATE
2.1.3 以下哪个表不用于 mysql 的权限管理( D )
A.HOST B.DB
C.COLUMNS_PRIV D.MANAGER
2.1.4 在 SOL 语法中,用于更新的命令是:( B )
A.INSERT B.UPDATE
C.DELETE D.CREATE
2.1.5 下面命令中不是数据库用来 DML 操作是( D )
A.SELECT B.UPDATE
C.INSERT D.DROUP
2.1.6 SQL 语言中,删除一个表的命令是(B )
A.DELETE B. DROP
C.CLEAR D.RI MORE
2.1.7 MySQL 语句中删除一个表(假如表名称是 t1)的命令是 C
A.rm table t1 B.delete table t1
C.drop table t1 D.truncate t1
2.1.8 下面哪个语句将 user 表的名称变更为 userinfo?( A )
A.alter table user rename as userinfo
B.rename to userinfo from user
C.rename user to userinfo
D.rename user as userinfo
2.1.9 sql 语句中修改表结构的命令是 ( C )
A.modify table B.modify structure
C.alter table D.alter structure
2.1.10 带有( B )子句的 select 语句可以在表的一行或多行上防止排他锁
A.FOR INSERT B.FOR UPDATE
C.FOR DELETE D.FOR REFRESH
2.1.11 在 SQL 中,建立表用的命令是( B )
A.CREATE SCHEMA B.CREATE TABLE
C.CREATE VIEW D.CREATE INDEX
2.1.12 SQL 语言是( C )语言
A.层次数据库 B.网络数据库
C.关系数据库 D.非数据库
2.1.13 SQL 语言中,条件年龄 BETWEEN 15 AND 35 表示年龄在 15 至 35 之间,且(A)
A.包括 15 岁和 35 岁
B.不包括 15 岁和 35 岁
C.包括 15 岁但不包括 35 岁
D.包括 35 岁但不包括 15 岁
2.1.14 在数据库管理系统能实现对数据库中的数据查询、插入、修改和删除,这类功能称为( C )
A.数据定义功能 B.数据管理功能
C.数据操纵功能 D.数据控制功能
2.1.15 下列执行数据的删除语法在运行时不会产生错误信息的选项是( B )
A.Delete * from pat_visit Where inp_no = ‘6‘
B.Delete From pat_visit Where inp_no =‘6‘
C.Delete pat_visit Where inp_no = ‘6‘
D.Delete pat_visit Set inp_no = ‘6‘7
2.2 填空
2.2.1 查询病人表中的所有内容,并以住院号倒序排序 SQL 代码为:Select * from pat_visit ___order by haoma ;___desc___
2.2.2 查询一根病人的信息。但忘记了该病人的名字,只记得该病人姓“张”,而且名字中有一个 “美”字,SQL 代码为:Select * from Pat_visit where name__like "张"____
2.2.3 在 SQL 中,用子句 DISTINCT 消除重复出现的元组。
2.2.4 标准的 SQL 语言语句类型可以分为 DML 、 DQL 、 DDL 、 DCL
2.2.5 SQL 语句中的查询语句是 select(DQL)
2.2.6 字符转换日期函数__select date_format(now(), ‘%Y-%m-%d‘); ___
2.2.7 DML 包括_update_ _ delete _ __instert_
2.2.8 在 SQL 中,建立数据库的命令是______,建立视图的命令是_______,建立索引的是________
create database 名字
create view v as (select * from table1) union all (select * from table2);
alter table student add index idx_name(name);
2.2.9 在 SQL 中,用___insert___命令向表中输入数据,用__select___命令检查和查询表中的内容
select
select * from table_name;
2.2.10 在 SQL 中,用_update__命令可以修改表中的数据,用_alter____命令可以修改表的结构
2.2.11 在 SQL 中,Alter 命令可以有两个选择项,______子命令用于修改表的性质,____子命令用 于增加列
alter table change/modify
alter table add
2.2.12 在 SQL 中,用___delete__命令可以从表中删除行,用_drop____命令可以从数据库中删除表
2.2.13 在 SQL 中,控制用保留字__NULL____,非空值用保留字___NOTNULL__
2.2.14 SELECT 命令中,表示条件表达式用____字句,分组用_____字句,排序用____字句
where
group by
order by
2.2.15 在 ORDER BY 字句的选项中,DESC 代表___大到小__序输出,若省略时,代表__从小到大 __序输出
2.2.16 合并多个查询结果集,应使用 _union__关键字
2.3 简答
2.3.1 在 mysql 客户端查询工具中,如何获取当前的所有连接信息。
show full processlist
2.3.2 如何利用 crontab 定期执行 mysql 语句。
mysql -uroot -p -e ‘show databases;‘
2.3.3 查看缺省引擎
select @@default_storage_engine;
2.3.4 列举 SQL 常用命令:
use database
show processlist;
show tables;
show variables like ‘xx‘;
select * from database.table_name where;
explian select * from table;
2.3.5 Mysql 查看 order 表的第 3 条到第 7 条的数据。
select * from order limit 2,5;
2.3.6 Mysql 授予用户 admin 通过 IP 为 192.168.0.10/24 对数据库的全部授权。
grant all on *.* to admin@‘192.168.0.%‘ identified by ‘123‘;
2.3.7 对 order 这个表的 name 字段数据进行 base64 编码
select to_base64(name) from `order`
2.3.8 为什么说 group by 和 order by 操作的是代价高昂的?
在没有合理索引情况下,需要大量 CPU 时间来做排序和分组。
2.3.9 写分组浏览,分组求和,分组求最大值的 sql 语句,每个只能用 1 句话
浏览:select group_concat(字段名 1) from db group by 字段 2;
求和:select sum(字段名 1) from db group by 字段名 2;
最大值:select max(字段名 1) from db group by 字段名 2;
2.3.10 如何列出所有数据库?(show databases;)
2.3.11 如何查看表内所有数据?(select * from table;)
2.3.12 如何知道表内行数?(select count(*) from table;)
2.3.13 用 SQL 实现以下统计结果
CSBH CSBH_COUNT
20 2
10 8
CSBH SUM_GJQJ
20 211.039900
10 871.317850
Select csbh,count(csbh) as CSBH_COUNT from table group by chbh;
Select csbh,sum(csbh) as CSBH_SUM from table group by chbh;
2.3.14 用 SQL 命令实现给主键添加索引
alter table a add primary key pri(id);
2.3.15 删除如下表中年龄大于 30,且住址为 nj 的员工
表A user_table
Name age city
Tom 20 bj
Jimmy 50 nj
Zhou 33 sh
Jing 30 nj
Nanan 28 sh
create table user_table(
id int(11) auto_increment primary key
name varchar(200),
age int(11),
city varchar(200))
engine=innodb;
------------------------------
insert into user_table(name,age,city) values(‘Tom‘,20,‘bj‘),
(‘Jimmy‘,50,‘nj‘),
(‘Zhou‘,33,‘sh‘),
(‘Jing‘,30,‘nj‘),
(‘Nanan‘,28,‘sh‘);
------------------------------
delete from user_table where age>30 and city=‘nj‘;
2.3.16 根据上题的表,计算出每个城市的人数和平均年龄
select city,count(name),AVG(age) from user_table group by city;
2.3.17 查询下表平均成绩大于 60 分的同学的学号 s_d)和平均成绩(score)
表 Student 学生表
S_id Sname Ssex
1 Xiaoli 男
2 xiaowang 女
3 zhanglong 男
4 zhaohu 女 表 Course 课 程 表
C_id Cname T_id
1 语文 1
2 历史 3
3 数学 2
4 政治 4 表 SC 成绩表
sid C_id score
1 2 99
3 4 88
1 3 55
2 1 77
表 Teacher 教师表
T_id Tname
1 zhangsan
2 lisi
3 wangwu
4 zhaoliu
create table Student(
S_id int primary key auto_increment,
Sname char(100),
Ssex char(100))
engine=innodb;
------------------------------
insert into Student(S_id,Sname,Ssex) values(1,‘Xiaoli‘,‘男‘),
(2,‘xiaowang‘,‘女‘),
(3,‘zhanglong‘,‘男‘),
(4,‘zhaohu‘,‘女‘);
----------------------------
create table Course(
C_id int primary key auto_increment,
Cname char(100),
T_id int)
engine=innodb;
---------------------------
insert into Course(C_id,Cname,T_id) values
(1,‘语文‘,1),
(2,‘历史‘,3),
(3,‘数学‘,2),
(4,‘政治‘,4);
---------------------------
create table SC(
sid int,
C_id int,
score int)
engine=innodb;
---------------------------
insert into SC(sid,C_id,score) values
(1,2,99),
(3,4,88),
(1,3,55),
(2,1,77);
---------------------------
create table Teacher(
T_id int auto_increment primary key,
Tname char(100))
engine=innodb;
---------------------------
insert into Teacher(T_id, Tname) values
(1,‘zhangsan‘),
(2,‘lisi‘),
(3,‘wangwu‘),
(4,‘zhaoliu‘);
----------------------------
mysql> select sid,c from (select sid,avg(score) c from SC group by sid) a where c>60;
+------+---------+
| sid | c |
+------+---------+
| 1 | 77.0000 |
| 2 | 77.0000 |
| 3 | 88.0000 |
+------+---------+
------------------------------
查询上所有同学的学号姓名、选课数、总成绩
mysql> select s.sname,s.S_id,count(s.S_id),sum(c.score) from Student s join SC c on s.S_id=c.sid group by
s.S_id;
+-----------+------+---------------+--------------+
| sname | S_id | count(s.S_id) | sum(c.score) |
+-----------+------+---------------+--------------+
| Xiaoli | 1 | 2 | 154 |
| xiaowang | 2 | 1 | 77 |
| zhanglong | 3 | 1 | 88 |
+-----------+------+---------------+--------------+
2.3.18 有两个表 A 和 B,表结构和字段分别为:
A:B
ID Name ID hobby
1 tim 1 football
2 Jimmy 2 tennis
3 John 3 soccer
请写出 Select A.Name, B.Hobbt from A,B where A.id = B.id 的结果
Select A.Name,B.Hobbt from A join B on A.ID = B.ID;
Tim football
Jimmy tennis
John soccer
2.3.19 写出 MySQL5.6 新建用户 dev,授权 op 库 test 表所有权限,任何地址的访问权限 SQL
grant all on op.* to dev@‘%‘ identfied by ‘123‘;
2.3.20 写出一条 sql 语句:取出表 A 中满足时间 2006 年 1 月 1 日至 2006 年 1 月 31 日的记录(时间 字段为 time)
select * from A where time between ‘2006-01-01‘ and ‘2006-01-31‘;
2.3.21 写出一条 SQL 语句:清除 A 表中的数据,但不删除表
truncate table A;
2.3.22 查找在机关单位任职的人员姓名、性别、出生日期、单位名称、并且查询结果按照单位排 序;
select 姓名,性别,出生日期,单位名称 from table order by 单位名称;
2.3.23 查找性别为女的少数民族的非中共人员姓名、民族、出生日期;
select 姓名,民族,出生日期 from table where 性别=女 and 面貌!=中共人员
2.3.24 在事业单位查找具有研究生学历博士学位的在任人员,要求显示姓名、性别、出生日期、政 治面貌、单位名称、职务名称、批准任职日期,同时结果按照批准任职日期升序;
select 姓名,性别,出生日期,政治面貌,单位名称,职务名称,批准任职日期 from db1 order by 批准任职日期;
2.3.25 查询在不同单位性质类别的单位任职的人数;
select count(*) from db group by 单位;
2.3.26 请写出下列语句的执行结果:select replace (ltrim(rtrim(‘abc3453436‘)),‘34‘,‘abc‘)
abcabc5abc3
2.3.27 写一个查询语句,从数据库表中取出年龄 age 最大的十个人
select * from table order by age desc limit 10;
2.3.28 编写 SQL 语句。统计计算机系 58 班每个月过生日的男生人数,井按月进行排序
表 dept (系):
dept_id(系编号),dept_name(系名称)
表 class(班级):
class_id(班编号),dept_i(系编号),class_name(班名)
表 setdent(学生):
setdent_id(学生编号),class_id(班编号), sex(性别),birthday(生日)
select dept.dept_name,class.class_name,count(student_id) date_format(student.birthday,%m)
from dept
join calss
on dept.dept_id=class.dept_i
join student
on class.calss_id=student.class_id
where student.sex=’m’
group by date_format(student.birthday,%m)
order by date_format(student.birthday,%m)
desc ;
2.3.29 现有 T 表:(字段:ID,NAME,ADDRESS,PHONE,LOGDATE)
查询 T 表中地址中包含“北京”的 SQL 语句
select * from T where ADDRESS like ‘%北京%‘;
插入一条数据到 T 表中
insert into T(ID,NAME,ADDRESS,PHONE,LOGDATE) value(1,2,3,4,5);
请写出将 T 表中第 3~5 行数据列出来的 SQL 语句
select * from T limit 3,5;
2.3.30 Mysql 创建数据库的命令,创建表的命令,插入语句的命令?
create database
create table
insert into
2.3.31 数据库中的两个数据库表,定义如下:
表名 1:cardApply
字段(字段名/类型/长度):
applyNo varchar 8; //申请单号(关键字)
applyDate date 8; //申请日期
state varchar 2; //申请状态
表 2:cardApplyDetail
字段(字段名/类型/长度):
applyNo varchar 8; //申请单号(关键字)
name varchar 30; //申请人姓名
idCard varchar 5; //ID 卡号
applyNo varchar 8; //申请单号(关键字)
其中,两个表的关联字段为申请单号,依据上述信息完成 1-5 题目:
查询 ID 卡号为 11111 的申请日期
Select applyNo , applyDate from cardApply where applyNo=’1111’
查询同一个 ID 卡号有两条以上记录的 ID 卡号及记录个数
Select applyNo,count(applyNo) from cardApply group by applyNo having count(applyNo)>2;
将 ID 卡号为 11111 的记录在两个表中的申请状态均改为 02
Update cardApply set state=‘02’ where applyNo=‘1111’;
删除 cardApplyDetall 表中所有姓李的记录
Delete from cardApplyDetall where name like ‘李%’;
假如某一天有 10 个人申请,另外一天有 20 个人申请,还有一天有 30 个人申请,查询出申请卡最多的那一天日期
Select applyDate,count(applyNo) from cardApply group by applyDate order by count(applyNo) desc limit1;
2.3.32 第一题
Student S# Sname Sage Ssex 学生表
Course C# t# Cname () 课程表
SC S# C# score 成绩表
Teacher T# tname 教师表
写出学生表建表语句
Create table student(S# int not null primary key auto_increment comment ‘学号’,
Sname varchar(64) not null comment ‘姓名’,
Sage tinyint unsigned not null default 0 comment ‘年龄’,
Ssex enum(‘m’,’f’) not null default ‘m’ comment ‘性别’
)engine=innodb charset=utf8 comment ‘学生表’;
查询姓张的学生名单
Select * from student where sname like ‘张%’;
查询所有同学的学号、姓名、选课数、总成绩
Select s.s# ,s.sname,count(C#),sum(sc.score) from student as s
Join sc
On s.s#=sc.s#
Group by s.s#,s.sname
查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
Select s.sname,sum(sc.socre) from student as s
Join sc
On s.s#=sc.s#
Join course as co
On sc.c#=co.c#
Join teacher as te
On co.t#=te.t#
Where te.tname=’叶平’
2.3.33 第二题
第一题中的教师表中哪个字段可以建立唯一索引?写出建立唯一索引的语句
Alter table teacher add unique key idx(t#);
2.3.34 第三题
如何检查第一题中学生表在数据库中所占的空间大小
Select table_name,(index_length+avg_row_length*table_rows)/1024/1024 from information_schema.tables
Where table_name=’student’;
如何将第一题中的 4 个表进行备份,数据库用户、密码为:admin/admin 数据库名为:dbschool
SELECT CONCAT("mysqldump -uroot -p123 ",table_schema,"
",table_name," >/tmp/",table_schema,"_",table_name,".sql" )
FROM information_schema.tables
WHERE table_schema NOT IN(‘information_schema‘,‘performance_schema‘,‘sys‘)
INTO OUTFILE ‘/tmp/bak.sh‘ ;
2.3.35 部门表:t_dept(deptid ,deptname)工资表:t_salary(id,employeeid,deptid,salary)要求:查出员工的平均工资大于 3000 的部门名称
Select td.deptname,avg(ts.salary) from t_dept as td join t_salary as ts
On td.deptid=ts.deptid
Group by td.deptname
Having avg(ts.salary)>3000;
2.3.36 student 表(Sno,Sname,Sage,Ssex)Course 表(Cno,Cname,Ccredit)SC 表(Sno, Cno,grade)
建表 student、course、SC(略)
查询年龄小于 20 的学生学号、年龄,并显示
Select s.sno,s.sage from student as s where s.sgae<20
查询年龄不在 20-23(包括 20,23)的学生的成绩
Select s.sname,s.sage,sc.score from student as s
Join sc
On s.sno=sc.sno
Where s.sage<20
Union all
Select s.sname,s.sage,sc.score from student as s
Join sc
On s.sno=sc.sno
Where s.sage>23
2.3.37 给出查询表 A(ID,Name)中存在 ID 重复三次以上的记录的 SQL 语句
Select id ,count(id) from a group by id having count(id)>3;
2.3.38 mysql 用户名:root,密码:123456,socket:/opt/mysql3306/mysql3306.sock,跑默认端口, 请使用一条命令更新该数据源 neutron 库中的 ipallocations 表中的 ip_address 字段等于 10.4.182.36 的记录为 202.113.14.92
mysql –uroot –p123456 –S /opt/mysql3306/mysql3306.sock –e “update neutron. Ipallocations set
ip_address=’ 202.113.14.92’ where ip_address=’ 10.4.182.36’”;
2.3.39 写出以下 SQL 语句(涉及到表名和字段自定义)
查询某一个表前 20 条记录
Delete from t where id<21;
某公司从下个月起,每个人工资在原有基础上上涨 10%
Update t set salary=salary+salary*.01 where date=date_format(now(),%m)+1;
删除某个表中日期为 2017-01-01 以前的数据
Delete from t where date<’ 2017-01-01’;
新增一条记录
Insert into t values(xxx)
备份数据库
Mysqldump –uroot –pxxx –A –master-data=2 –single-transaction –R –E –triggers >/bak.sql
2.3.40 有三张表分别为客户表 customers,账户表 accounts,用户表 users
客户表 customers (cust_id,cust_name,cust_opendate())
账户表 accounts(acc_id,acc_name,cust_id,acc_opendate(账户开通时间))
用户表 users(user_id,user_name,cust_id,lost_login_date(用户最后登录时间))
每个客户可以开通多个帐号,每个客户有多个用户,cust_id,acc_id,user_id 分别为客户、账户、用户的唯一标志,cust_opendate,acc_opendate,lost_login_date 类型为 date 按照要求用一条 sql 语句完成
统计每个月开通的客户数
Select date_format(a. acc_opendate,%m),count(c. cust_id)
From customers as c join accounts as a
On c. cust_id=a. cust_id
Group by date_format(a. acc_opendate,%m)
列出上个月开通客户列表,并输出这些客户所具有的账户和用户数量
Select a.acc_name,count(u. user_id) from accounts as a
Join users as u
On a. cust_id=u. cust_id
Where date_format(a. acc_opendate,%m) = date_format(now(),%m)-1;
统计三个月内登录过的客户数量
Select lost_login_date,count(user_id) from users
Where date_format (lost_login_date,%m) in (date_format(now(),%m),date_format(now(),%m)-1,
date_format(now(),%m)-2)
统计老客户今年开通账户的数量,老客户是指今年以前开通的账户
Select cust_opendate,count(cust_id) from customers
Where date_format (cust_opendate,%y)> date_format (now(),%y)
2.3.41 SQL
表名 user
Name Tel Content Date
张三 13333663366 大专毕业 2006-10-11
张三 13612312331 本科毕业 2006-10-15
张四 021-55665566 中专毕业 2006-10-15
(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用 SQL 语句新增至表中
Insert into user values(‘小王’,’ 13254748547’,’ 高中毕业’,’ 2007-05-06’)
(b) 请用 sql 语句把张三的时间更新成为当前系统时间
Update user set date=now() where name=’张三’;
(c) 请写出删除名为张四的全部记录
Delete from user where name=’张四’
2.3.42 创建一个用户并赋予权限
Grant all on *.* to root@’10.0.0.%’ indentified by ‘123’;
2.3.43 创建表空间 neuspace,数据文件命名为 neudata.dbf,存放在 d:\data 目录下,文件大小为 200MB,设为自动增长,增量 5MB,文件最大为 500MB
Create tablespace neuspace datafile ‘d:\data\neudata.dbf’size 200MB AUTOEXTEND ON NEXT 5M MAXSIZE 500M;
2.3.44 以系统管理员身份登录,创建账号 tom,设置 tom 的默认表空间为 neuspace.为 tom 分配 connect 和 resource 系统角色,获取基本的系统权限。然后为 tom 分配对用户 scott 的表 emp 的 select 权限和对 SALARY,MGR 属性的 update 权限
Create user tom identified by tom default tablespace account;
grant connect, resource to tom;
grant select on scott.emp to tom
grant update on SALARY.MGR to tom
2.3.45 按如下要求创建 class
属性 类型(长度) 默认值 约束 含义
CLASSNO 数值(2) 无 主键 班级编号
CNAME 变长字符(10)无 非空 班级名称
Create table class(classno int(2) not null primary key auto_increment comment ‘班级编号’,
CNAME varchar(10) not null comment ‘班级名称’)
2.3.46 学生表有四个字段:学号、姓名、年级、学分,统计出按年级降序同名同姓的数据情况(写 出 sql 语句)
Select name ,count(name) from user group by name order by class desc ;
2.3.47 在表 class 的 CNAME 属性上创建索引 class_sname_idx
Alter table class add index class_sname_idx(CNAME);
2.3.48 sql 类
学生信息表
姓名(Name) 学号(Code)
张三 001
李四 002
马五 003
甲六 004
考试信息表
学号 学科 成绩
001 数学 80
002 数学 75
001 语文 90
002 语文 80
001 英语 90
002 英语 85
003 英语 80
004 英语 70
查询各科成绩的平均分,显示栏位为学科、平均分,sql 怎么写
Select a.学科,avg(b.成绩) from student as a join course b on a.id=b.code group by a.学科;
查询所有学生各科成绩,显示栏位为姓名、学号、学科、成绩,并以学号与学科排序,没有成绩的学生也需要列出,sql 怎么编写
Select a.name,a.code,b.学科,b.成绩 from student as a join course as b on a.code=b.id order by a.学号,b.学科
查询出单科成绩最高的,显示栏位为:姓名、学号、学科、成绩,sql 怎么编写
Select a.name,a.code,b.id,b. 学科,max(b.成绩) from from student as a join course as b on a.code=b.id Group by b. 学科
列出每位学生各科成绩,要求输出格式:姓名、学号、语文成绩、数学成绩、英语成绩,sql 怎么写
Select a.name,a.code,b.id,
Case when b.学科=’ 语文’ then b.成绩 end as ‘语文成绩’,
Case when b.学科=’ 数学’ then b.成绩 end as ‘数学成绩’,
Case when b.学科=’ 英语’ then b.成绩 end as ‘英语成绩’,
from student as a join course as b on a.code=b.id
Group by 姓名,学号;
2.3.49 不借助第三方工具,如何获得 SQL 的执行计划?
explain select xxx from TAB where xxx
以上是关于面试题 | 数据库笔试题集合·之·SQL语句的主要内容,如果未能解决你的问题,请参考以下文章
BAT Java面试笔试33题:JavaListJava Map等经典面试题!答案汇总!