笔记整理-MySQL高级
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语句查询出指定的数据。
- JAVA高级工程师课程笔记整理——(七)Mysql
- Mysql又一次整理笔记--woods备忘
- mysql 高级 笔记
- mysql笔记整理1
- Mysql DBA 高级运维学习笔记-DML语句之insert知识讲解
- Mysql DBA 高级运维学习笔记-初步增量恢复mysql数据库
- MySQL学习图文笔记整理(一):库操作、单表操作
- Entity Framework with MySQL 学习笔记一(关系整理版)
- c高级笔记及代码整理
- MySQL语法大全_自己整理的学习笔记
- mysql高级笔记(二)
- Mysql DBA 高级运维学习笔记-Heartbeat实现web服务的高可用案例及维护要点
- 高性能MYSQL(学习笔记)-MySQL高级特性2
- Unix整理笔记——高级工具——里程碑M9
- MySQL高级笔记——Pymysql
- 开发使用mysql的一些必备知识点整理(三)高级
- Mysql DBA 高级运维学习笔记-Mysql主从复制原理及实战部署
- MySQL语法大全_自己整理的学习笔记
- 《PHP MySQL和WEB开发》笔记第十二章 MYSQL高级管理 (上)
- Mysql DBA 高级运维学习笔记-MySQL备份与恢复实战案例及生产方案