Mysql总结

1.SQL的select语句完整的执行顺序

SQL Select
1. from 子句组装来自不同数据源的数据;
2. wher 子句基于指定的条件对记录行记录筛选;
3. group by 子句将数据划分为多个分组;
4. 使用聚合函数进行计算;
5. 使用having 子句筛选分组;
6. 计算所有表达式;
7. select 字段;
8. 使用 order by 对结果集进行排序。

SQL语言不同于其他编程语言的最明显特征是处理代码顺序。在大多数数据库语言中,代码an编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一个出现的select ,SQL查询处理的步骤序号:
1. FROM <left_table>
2. <join_type> JOIN <right_table>
3. ON <join_condition>
4. WHERE <where_condition>
5. GROUP BY <group_by_list>
6. WITH {CUBE | ROLLUP}
7. HAVING <having_condition>
8. SELECT
9. DISTINCT
10. ORDER BY <order_by_list>
11. <TOP_specification> <select_list>

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

SQL之连接查询

外连接:
左外连接(左连接):以左表作为基准进行查询,左表数据会全部显示出来,游标如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为null
右外连接(右连接):以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为null。
全连接:先以左表进行左外连接,再以右表进行右外连接。

内连接:
显示表之间有连接匹配的行。

SQL之sql注入

通过在web表单中输入(恶意)SQL语句得到一个存在安全漏洞网站上的数据库,而不是按照设计者意图去执行SQL语句。举例:当执行的 sql 为 select * from user where username = “admin”
or “a”=“a”时,sql 语句恒成立,参数 admin 毫无意义。
防止sql注入的方式
1.预编译语句:如,select * from user where username =?,sql 语句语义不会发生改
变,sql 语句中变量用?表示,即使传递参数时为“admin or ‘a’= ‘a’”,也会把这整体当做一个字符创去查询。
2.Mybatis框架中的mapper发中的#也能很大程度的防止sql注入($无法防止sql注入)

Mysql数据库引擎

MyISAM和InnoDB是最常见的两种存储引擎。
MyISAM引擎
MyISAM是MySQL官方提供默认的存储引擎,其特点是不支持事务,表锁和全文索引,对于一些OLAP(联机分析处理)系统,操作速度快。
每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义),MYD(MyData,存储数据),MYI(MYindex,存储索引)。这里要特别注意的是MyISAM不缓存数据文件,只缓存索引文件。

InnoDB存储引擎
InnoDB存储引擎支持事务,主要面向OLTP(联机事务处理过程)方面的应用,其特点是行锁设置,支持外键,并支持类似于Oracle的非锁定读,即默认情况下读不产生锁。InnoDB将数据放在一个逻辑表空间中。InnoDB通过多版本并发控制来获得高并发性,实现了ANSI标准的4中隔离级别,默认Repeatable,使用一种被称为next-key locking的策略避免幻读。
对于表中数据的存储,InnoDB采用类似Oracle索引组织表Clustered的方式进行存储。InnoDB存储引擎提供了具有提交,回滚和崩溃恢复能力的事物安全。但是对比Myisam的存储引擎,InnoDB写的效率差一些并且会占用更多的磁盘空间以保留数据和索引。

Mysql架构器中各模块都是什么?

  1. 连接管理与安全验证是什么?
    每个客户端都会建立一个与服务器连接的线程,服务器会有一个线程池来管理这些连接:如果客户端需要连接到mysql数据库还需要进行验证,包括用户名,密码,主机信息等。
  2. 解析器是什么?
    解析器的作用主要是分析查询语句,最终生成解析树;首先解析器会对查询语句的语法进行分析,分析语法是否有问题。还要解析器会查询缓存,如果在缓存中有对应的语句。就返回查询结果不进行接下来的优化操作。前提是缓存中的数据没有被修改,当然如果被修改也会被清除缓存。
  3. 优化器怎么用?
    优化器的作用主要是对查询语句进行优化操作,包括选择合适的索引,数据的读取方式,包括获取查询的开销信息,统计信息,等。优化器需要通过存储引擎获取查询的大致数据和统计信息。
  4. 执行器是什么?
    执行器包含执行查询语句,返回查询结果,生成执行计划于存储引擎的一些处理操作。

事务的四大特征是什么?

数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity),一致性(Correspondence),隔离性(Isolation),持久性(Durability)
1.原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程发生错误,会被回滚(Rollback)到事务开始前的状态,就像事务从来没有执行过一样。
2.一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3.隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
4.持久性:在事务完成以后,该事物所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

存储过程

什么是存储过程,使用存储过程的好处?
存储过程(Stored Produce)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
优点:
1. 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次;
2. 允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快;
3. 减少网络流量,例如一个需要数百行人的SQL代码的操作有一条执行语句完成,不需要再网络中发送数百行代码
4. 更好的安全机制,对没有权限执行存储过程的用户,也可授权他们存储过程。

为什么在实际应用中,存储过程用到相对较少呢?

  1. 没有特定的数据库开发人员,普通程序员兼职进行数据库操作;
  2. 程序员往往只需操作程序,即可完成数据访问,无需再在数据库上进行开发;
  3. 项目需求变动比较频繁,修改SQL语句比较方便,特别是涉及逻辑变更 。

创建存储过程语法
CREATE proc | procedure procedure_name
[ {@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],

]
as
SQL_statements
go

Mysql简单存储过程实例
DROP PROCEDURE IF EXISTS proc_adder;
DELIMITER ;;
CREATE DEFINER=root@localhost PROCEDURE proc_adder (IN a INT,IN b INT, OUT SUM INT )
BEGIN
DECLARE c INT;
IF a IS NULL THEN SET a = 0;
END IF;
IF b IS NULL THEN SET b = 0;
END IF;
SET SUM = a+b;
END
;;
DELIMITER ;

SET @b=5;
CALL proc_adder(2,@b,@s);
SELECT @s AS SUM ;

MYsql触发器

MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器执行。
在Mysql中,创建触发器语法如下
CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tb1_name
FOR EACH RON
TRIGGER_STMT

其中:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为BEFORE或AFTER;
trigger_event:标识触发事件,取值为INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用BEGIN和 END 包含的多条语句。
由此可见,可以建立 6 种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
另外有一个限制是不能同时在一个表上建立 2 个相同类型的触发器,因此在一个表上最多建立 6 个触发器。

MySQL优化

  1. where 子句中可以对字段进行 null 值判断吗?
    可以,比如 select id from t where num is null 这样的 sql 也是可以的。但是最好不要给数据库留 NULL,尽可能的使用 NOT NULL 填充数据库。

  2. select * from admin left join log on admin.admin_id = log.admin_id where
    0 log.admin_id>10 如何优化?
    优化为: select * from (select * from admin where admin_id>10) T1 lef join log on T1.admin_id =log.admin_id。
    使用 JOIN 时候,应该用小的结果驱动大的结果(left join 左边表结果尽量小如果有条件应该放到左边先处理,right join 同理反向),同时尽量把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到之后锁表和阻塞)

  3. limit 的基数比较大时使用 between
    例如:select * from admin order by admin_id limit 100000,10
    优化为:select * from admin where admin_id between 100000 and 100010 order by admin_id。

  4. 尽量避免在列上做运算,这样导致索引失效
    例如:select * from admin where year(admin_time)>2014
    优化为: select * from admin where admin_time> '2014-01-01′

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值