您的位置:首页 > 数据库 > MySQL

笔记整理-MySQL高级

2019-01-15 17:13 423 查看

1.子查询
子查询是在一个查询中又包含另一个查询,所包含的查询叫子查询,包含子查询的叫父查询。通常,我们的一个查询条件需要依赖另一个查询的结果,则用子查询作为查询条件的获取。子查询能直接运行的。
– 查询一年级的学生信息,给出的条件是 ‘一年级’
– 注意:子查询作为父查询的查询条件时,子查询的结果要求只能返回一个列值, 如果子查询的结果集中有多个值,则父查询的条件匹配符号不能用= < > ,建议一般使用in,少用=

select * from student where gradeId in (select gradeId from grade where gradeName='一年级')

注意,子查询的性能上是有所缺陷的,但是能简化SQL指令的编写。

2.连接查询
– 连接查询,当需要查询的数据来自于多张表时,则用连接查询来实现,连接查询有(内连接,外连接(左外连接,右外连接,交叉连接查询),交叉查询)
– 内连接查询出学生姓名,性别,年龄,地址,年级名称

select * from student s,grade as g where g.gradeId=s.gradeId

– 内连接推荐用下面的写法,因为在性能上比上面的写法要快

select * from student s INNER JOIN grade g on g.gradeId=s.gradeId

– 左外连接与右外连接对比
left join左边的表是右表,右边的表是左表
right join左边的表是左表,右边的表是右表

select * from  student s LEFT JOIN grade g on g.gradeId=s.gradeId
select * from grade g right JOIN student s on g.gradeId=s.gradeId

3.事务
特性:ACID(原子性,一致性,隔离性,持久性)
原子性:表示事务是一个执行的最小的基本单元,不能分隔。
一致性:事务前后,数据表中的数据要保持一致。
隔离性:事务是一个独立的,与其它的事务相互隔离,互不干涉。
持久性:事务提交后,对数据表中的数据的影响是永久性的。

MySql数据库的默认机制是事务自动提交型,它认为每一个SQL指令都是一个事务,执行完毕后,会自动提交到系统中。
如果我需要一次性执行多条SQL指令,同时,要保证这些指令全部执行成功,只要有一条执行不成功,则所有SQL指令全部执行不成功。这种情况,我们就可以采用事务来解决这个问题。
事务的作用是:把一批SQL指令组成一个整体,一起执行,执行完毕后,如果没有错误,则提交,对数据表持久化,如果有错误,则回滚,对刚才执行过程中对数据表的影响进行撤消。

4.索引
索引是一个能提升查询性能的对象,但是有些索引对数据的增删改会有一定的影响。数据表通常由索引页及数据页组成,所以,索引也会占空间。
并不是所有的表适合添加索引,如果一个表中的数据量不大,增加索引可能还会导致查询的性能降低。
索引要添加在通常做为查询条件的列上。如果一个表添加了主键,则会自动创建主键索引。如果某一列的数据是字符型,且列中保存的数值长度比较大,则这一列不适合增加索引,如果某一列的值存在大量的重复,也不适合加索引在这一列上。

5.数据的备份
如果数据比较重要,则通常会对数据进行备份,避免数据丢失造成比较大的损失。

6.存储过程,其实是我们自己写的函数,在Java中叫方法。
优点: (1) 性能高,因为过程是存储在服务中,并已经预编译好了,随时可以执行,与普通的SQL指令不一样,SQL指令在执行前还需要进行编译。
(2)安全性高,客户端只需要发送过程的名称及过程执行所需的参数到服务器中,就可以。
(3)节省网络流量,不需要发送大量的SQL指令。
缺点:不同的数据库之间不兼容。因为不同的数据库系统的语法不一样。

创建过程的语法:
DELIMITER $$
create PROCEDURE p_student([参数列表])
BEGIN
-- 过程中的业务SQL
select * from student;
end $$

执行:

call p_student(参数)

在MySql数据库中,过程的参数有3种,输入参数(默认),输出参数,输入输出参数。输入参数需要在外部赋值,传递到过程里面。输出参数,在外部只要声明,传递到过程中,在过程中赋值,可以把值传递出来。输入输出参数,需要在外部赋值,并传递到过程里面,在过程中重新赋值,可以把新的值传递到外部。外部声明参数时,参数前要加一个@符号。
无参过程案例:

drop procedure if exists p_stu;
delimiter $$
create procedure p_stu()
begin
declare sn char(20);
set sn='java面向对象编程';
select * from student where id in
(select studentno from score where subjectno =
(select id from subject where subname= sn)
and result<60);
end $$

调用

CALL p_stu();  -- 调用过程。

例:输入参数的过程:
– 输入参数的过程创建,根据年级名称查询学生信息

delimiter $$
create PROCEDURE p_studentByGradeName(gn varchar(10))
begin
-- 子查询根据年级名称查询出年级编号,作父查询的条件
select * from student where gradeId =
(select gradeId from grade where gradeName=gn);
end$$

–调用

set @gn = '一年级';   -- 声明参数,参数前要加一个@符号
call p_studentByGradeName(@gn);

输出参数:
根据输入的性别,查询出学生人数。
– 带一个输入参数,和输出参数

delimiter $$
create procedure p_studentBySex(s char(2),out number int)
begin
select count(*) into number from student where sex=s;
end $$

– 调用

set @s='女';
set @number=0;
call p_studentBySex(@s,@number);
-- 输出参数的值。
select @number;

输入输出参数。
要求输入的类型也输出类型要匹配。

7.企业面试时,针对于数据库技术的问题:

a.事务,要求能讲出事务的特征(ACID),作用
b.索引,优点及缺点
c.存储过程 的优点及缺点
d.分页SQL语句能编写
e.提供一些数据,能编写SQL语句查询出指定的数据。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: