数据库方面面试题
1.数据库三大范式:
答:1.每个字段不可再分;
2.每个表中都有主字段;
2.关联关系的表中不能存在所关联的表的非主键的字段。
2.存储过程:
答:通常我们操作sql语句是先编译存后执行,储过程就是将一些对sql的特殊操作编译后放入存储过程中,通过调用存储过程名来执行这些sql语句;
优点:
1.灵活性,增强了sql功能,可以用流控制语句编写。
2.组件性,可以多次调用。
3.实现执行速度快
4.安全,可通过权限设置访问存储过程。
格式:
delimtter //分割符,表示接下来是存储过程 create procedure proc1(out/in student int) //创建一个名为proc1的存储过程,括号内表示传入或返回的int型的变量student'; begin //表示开始写存储过程 ... //存储过程 end //存储过程结束 delimtter
条件语句: if 条件 then 执行代码 else 执行代码
循环语句: loop 执行代码 end loop;
3.表连接:
创建表:
create table student( sid INT PRIMARY key, sname VARCHAR(60) not null, sage int not null ) create TABLE s_info( iid int PRIMARY key, sphone varchar(15), semail VARCHAR(20), sid int not null )
数据:
Student:
sid sname sage
1 小文姐 18 2 孙擦啊 18 3 万套 18
s_info:
siid sphone semail sid 1 13032894563 1148233614@qq.com 1 2 16632894563 1148344314@qq.com 2 3 1852894563 114321114@qq.com 3
内连接:匹配两边相同的字段,有相同的显示,无相同的两边都不显示。join 连接的表 on 条件
显示内连接:join
SELECT * from student s join s_info si on s.sid=si.sid ;
隐式内连接:没有join on'
SELECT * from student s, s_info si where s.sid=si.sid;
外链接:外联接可以是左向外联接、右向外联接或完整外部联接。
左连接:会显示左边的表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 left join on
SELECT * from student s left join s_info si on s.sid=si.sid ;
右链接:会显示右边的表的所有行,而不仅仅是联接列所匹配的行。如果右表的某行在左表中没有匹配行,则在相关联的结果集行中左表的所有选择列表列均为空值。right join on
SELECT * from student s right join s_info si on s.sid=si.sid ;
完整外部联接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 full join on
SELECT * from student s full join s_info si on s.sid=si.sid ;
交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。
隐式:没有cross join,直接用where语句;
SELECT * from student s,s_info si where s.sid=1 ;
显示:cross join on
SELECT * from student s CROSS JOIN s_info si on s.sid=1 ;
4.常用函数:
sum():求和
max():最大值
min():最小值
avg():平均值
frist():返回查询的第一条记录
last():返回查询的最后一条记录
group by 字段名:返回分组统计,去重统计。
5.常用
distinct 字段名 :根据指定去重,distinct必须放在开头
select DISTINCT s.sname from student s;
count(*):统计个数,括号内为字段名;
select count(DISTINCT s.sname) '不同的姓名个数' from student;
6.视图