联合查询:将多个查询语句的执行结果相合并;

UNION

SELECT clause UNION SELECT cluase

 

 

练习:导入hellodb.sql生成数据库

(1) students表中,查询年龄大于25岁,且为男性的同学的名字和年龄;

(2) ClassID为分组依据,显示每组的平均年龄;

(3) 显示第2题中平均年龄大于30的分组及平均年龄;

(4) 显示以L开头的名字的同学的信息;

(5) 显示TeacherID非空的同学的相关信息;

(6) 以年龄排序后,显示年龄最大的前10位同学的信息;

(7) 查询年龄大于等于20岁,小于等于25岁的同学的信息;用三种方法;

 

练习:导入hellodb.sql,以下操作在students表上执行

1、以ClassID分组,显示每班的同学的人数;

2、以Gender分组,显示其年龄之和;

3、以ClassID分组,显示其平均年龄大于25的班级;

4、以Gender分组,显示各组中年龄大于25的学员的年龄之和;

 

 

练习:导入hellodb.sql,完成以下题目:

1、显示前5位同学的姓名、课程及成绩;

2、显示其成绩高于80的同学的名称及课程;

3、求前8位同学每位同学自己两门课的平均成绩,并按降序排列;

4、显示每门课程课程名称及学习了这门课的同学的个数;

 

 

思考:

1、如何显示其年龄大于平均年龄的同学的名字?

2、如何显示其学习的课程为第124或第7门课的同学的名字?

3、如何显示其成员数最少为3个的班级的同学中年龄大于同班同学平均年龄的同学?

4、统计各班级中年龄大于全校同学平均年龄的同学。

*********************************MySQL存储引擎***************

存储表类型表级别的概念 不建议在同一个库中的表上使用不同的ENGINE(引擎);

创建表时指定引擎:

CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ...

查看表信息: SHOW TABLE STATUS

常见的存储引擎:

MyISAM:  意外崩溃后 无法保证数据安全  不支持事物

Aria:  意外崩溃后,可以保证数据安全

InnoDB 支持事物

MRG_MYISAM 用于实现将两个MyISAM表在逻辑层上连接在一起.

CSV 基于文本文件存储文件 跨数据库交换比较好 但损失数据精度

BLACKHOLE 黑洞存储引擎 在级联复制时比较有用 (后面讲MySQL主从模型时的半同步模型时用到)

MEMORY 基于内存的存储引擎 不适用于持久存储 但性能高 支持hash索引 通常临时表用

PERFORMANCE_SCHEMA 兼容表的mysql接口来显示统计数据的 并非真正的表 虚表(类似/proc伪文件系统)

ARCHIVE 归档存储引擎 做数据仓库用

FEDERATED 夸服务器 夸物理主机 表联合

***************************************************************

InnoDB: InnoBase公司研发 后赠送给MySQL公司  后被甲骨文买了

并非原版InnoDB 而是第三方二次开发板

Percona-XtraDB, Supports transactions, row-level locking, and foreign keys

支持事物,行级锁,外键

数据存储于“表空间(table space)"中:自组织文件系统

(1) 所有InnoDB表的数据和索引存储于同一个表空间中;

表空间文件:datadir定义的目录中

文件:ibdata1, ibdata2, ...

(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;

数据文件(数据和索引,存储于数据库目录): tbl_name.ibd

表结构的定义:在数据库目录,tbl_name.frm

事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务;

基于MVCCMutli Version Concurrency Control)支持高并发;支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;

使用聚集索引(主键索引);

支持”自适应Hash索引“;

锁粒度:行级锁;

总结:

数据存储:表空间;

并发:MVCC,间隙锁,行级锁;

索引:聚集索引、辅助索引;

性能:预读操作、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操作缓存区;

备份:支持热备;

***************************************************************

MyISAM

支持全文索引(FULLTEXT index)、压缩、空间函数(GIS);

不支持事务

锁粒度:表级锁

崩溃无法保证表安全恢复

适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);

文件:每个表有三个文件,存储于数据库目录中

tbl_name.frm:表格式定义;

tbl_name.MYD:数据文件;

tbl_name.MYI:索引文件;

特性:

加锁和并发:表级锁;

修复:手动或自动修复、但可能会丢失数据;

索引:非聚集索引;

延迟索引更新;

表压缩;

行格式:

 {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

***************************************************************

其它的存储引擎:

CSV:将CSV文件(以逗号分隔字段的文本文件)作为MySQL表文件;

MRG_MYISAM:将多个MyISAM表合并成的虚拟表;

BLACKHOLE:类似于/dev/null,不真正存储数据;

MEMORY:内存存储引擎,支持hash索引,表级锁,常用于临时表;

FEDERATED: 用于访问其它远程MySQL服务器上表的存储引擎接口;

MariaDB额外支持很多种存储引擎:

OQGraphSphinxSETokuDBCassandraCONNECTSQUENCE...

搜索引擎:

lucene, sphinx

luceneSolr, Elasticsearch

***************************************************************

并发控制:

锁:Lock

为什么要用锁:

当一个表中有多个并发访问时,为防止别人读到的数据是正在修改的数据,所以存在锁机制.

锁类型 :

读锁:共享锁,可被多个读操作共享;会导致写饥饿(都操作不间断 写操作就必须一直等待读操作完成)

写锁:排它锁,独占锁;

锁粒度:

表锁:在表级别施加锁,并发性较低;

行锁:在行级另施加锁,并发性较高;(被锁行前后的行也会被锁定 防止插入)

锁策略:在锁粒度及数据安全性之间寻求一种平衡机制;

存储引擎:级别以及何时施加或释放锁由存储引擎自行决定;

MySQL Server:表级别,可自行决定,也允许显式请求;

锁类别:

显式锁:用户手动请求的锁;

隐式锁:存储引擎自行根据需要施加的锁;

显式锁的使用:

(1) LOCK TABLES

LOCK TABLES  tbl_name [AS alisa]  read|write, tbl_name read|write, ...

UNLOCK TABLES

(2) FLUSH TABLES 把内存中的表写到磁盘上 再重新打开

FLUSH TABLES tbl_name,... [WITH READ LOCK];

UNLOCK TABLES;

(3) SELECT

[FOR UPDATE | LOCK IN SHARE MODE共享模式锁定]

:SELECT * FROM students WHERE StuID IN (1,2,3) FOR UPDATE;完成后既立即释放

 


  事务:

事务:一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工作单元;

事务日志:在磁盘上开辟一块连续空间 连续写在事物日志中,由于连续写操作没有寻到时间性能提升比较明显,最终再更新至磁盘中,

如果日志空间较大,则发生意外后重启要把日志空间中的语句逐一写入磁盘数据,速度较慢

未防止日志写满,所以事物文件分组.

innodb_log_files_in_group 事物日志组数量

innodb_log_group_home_dir  事物日志目录

innodb_log_file_size 单个日志大小

Innodb_mirrored_log_groups    多写  多次写日志组(确保安全  当然不能放在一块硬盘上)

ACID测试:是否满足事物

AAUTOMICITY,原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚;

CCONSISTENCY,一至性;数据库总是应该从一个一致性状态转为另一个一致性状态;

IISOLATION,隔离性;一个事务所做出的操作在提交之前,是否能为其它事务可见;出于保证并发操作之目的,隔离有多种级别;

DDURABILITY,持久性;事务一旦提交,其所做出的修改会永久保存;

自动提交:单语句事务

mysql> SELECT @@autocommit;

+------------------------+

| @@autocommit |

+------------------------+

|       1       |

+------------------------+

mysql> SET @@session.autocommit=0

手动控制事务:

启动:START TRANSACTION

提交:COMMIT

回滚:ROLLBACK

事务支持savepoints:一个事物的多条语句中插入时间点  可以回归到事物中的某一个时间点

SAVEPOINT identifier   插入时间点

ROLLBACK [WORK] TO [SAVEPOINT] identifier 回归到指定插入点

RELEASE SAVEPOINT identifier 删除指定时间点

***********************************

事务隔离级别:

READ-UNCOMMITTED:读未提交 --> 脏读;可以读取别人尚未提交的数据 (允许读取别人尚未提交的数据)

READ-COMMITTED:读提交--> 不可重复读;事物修改的数据未提交之前.其他事物是看不见的.

REPEATABLE-READ:可重复读 --> 幻读;数据已经更改数据,但实际读到的是旧数据

SERIALIZABLE:串行化;

mysql> SELECT @@session.tx_isolation; 查看当前隔离级别

+----------------------------------+

| @@session.tx_isolation |

+----------------------------------+

| REPEATABLE-READ         |

+----------------------------------+

会出现死锁.

查看InnoDB存储引擎的状态信息:

SHOW ENGINE innodb STATUS;