2.MySQL的基本使用

 

1.查询处理:

可以分为逻辑查询处理和物理查询处理

1.逻辑查询处理

8) select distinct 列
1) from 表名
3) <jointype> join tablename  
2) on <joincondition>
4) where <condition>
5) group by
6) with{cube|rollup}
7) having
10) orderby
11) limit

 sql 中第一个被处理的字句是from
 11步中每步都会产生一个虚拟表;
 select查询一共会产生3个过滤过程,分别是on,where,having

2.物理查询处理

sql解析器完成sql语句的解析,并通过sql优化器选择最优的执行路径,
索引的使用,在一定程度上可以大幅度提高系统的性能
mysql 数据库通过选择追加路径来执行具有相同结果的语句

注意:

1.null的布尔比较

在on过滤条件下null的比较,比较结果为unknown,却被视为false,即两个null并不相同
下面两种情况将null视为相等
group by 将所有null分配在一组
order by 将所有null值排列在一起

添加外部行 outer join ,非保留表中我们用null 填充
在mysql 的排序过程中,升序排列时,null排列在最后,即null值在order by子句中视为最小

2.Where过滤两种不允许出现的情况

1.数据没有分组,不能使用聚合函数
2.不能在条件中使用select 定义的列别名进行操作
对应用了的gruop by 的语句,使用distinct 没什么实际作用

limit 通常和order by 一起使用,对于小数据分页影响不会太大,采用逐行遍历的形式
因此在数据量比较庞大的分页问题,在应用层建立一定的缓存机制是有必要的

2.子查询

子查询
    一般来说,称子查询嵌套于外部查询中,子查询必须包含括号
        子查询的好处:
         1.每个子查询允许结构化查询,可以把查询分开成几个部分
         2,可读性强
         3.用来解决一些复杂的join和union的操作
         使用any some in进行子查询
         any关键字必须与一些比较操作符一起使用,如:where s1》any(子查询)
         in 又称为=any
         some 是有一本分的意思 <> some 的意思是有部分b与a不相等,用的很少
         All关键字必须与一些比较操作符一起使用
独立子查询
    定义:不依赖外部查询而运行的子查询
    
标量子查询 只返回一个返回查询结果与多值查询结果相对

通过explain 来查看命令的具体解析过程
    大多数情况下,会将独立子查询转换为相关子查询,这也就是mysql子查询效率较低的原因
    In转化为exists
    子查询中派生表的使用能够极大的提高 性能
    exists 一般关联到外部查询 根据是否返回行返回true或false
    如果子查询过滤器中为某行返回unknown,被认为是false
    exists可以放心使用*,exists只关心行是否存在,而不会取各列的值
    not exists 和not in 区别 在于对null 的处理,在not exists的处理认为只有 true 和flase两种结果
    not in 存在 true false unknown

派生表 又叫表子查询
    from (子查询结果) as 表名
    1.列名名称是唯一的
    2.不支持limit
    派生表是完成的虚拟表,并没有具体的物理具体化,因此优化器也不知道派生表的信息,在用explain才看派生表的执行计划时,执行时间可能较长

where过滤有两种不允许出现:

3.连表操作

交叉连接 from t1 cross join t2 产生笛卡尔集
    也可以采用旧标准的 from t1,t2
        笛卡尔集的作用可以快速生成重复的测试数据可以产生行号,速度较快
        SELECT NAME,Quentity,(@a:=@a+1) AS row_number FROM supply ,(SELECT @a:=0) t;
       比SELECT NAME,Quentity,(SELECT COUNT(1) FROM supply t2 WHERE t1.`SupplyId`>= t2.SupplyId) AS row_number
      FROM supply t1;要快的多成本为(o(n))
常用using 简化on的条件,using 的使用可以将两个表中相同列名的列连接起来
例如:
    select  a.emp_no ,first_name,last_name
    from employee a
    inner join dept_manager b
    using(em_no)     => where a.em_no=b.em_no and dept_no='d001'
    where dept_no='d001'
    Natural Join 自然连接是通过 INNER join 和Using 的组合
自动将两个表中含有相同名称的列进行关联
例:
select a.empo first_name
from employee a
Natural  join depte_mag b
Straight_join 强制执行左边的表,只能说是mysql对于join 的一种强制优化处理
       其他还有 self join   自连接
               nonequi join 等值连接
                
连接查询 称为水平操作,将集合称谓 垂直操作
cross join  /inner join  /outer join
from t1 ,t2 where 条件 旧ANSI标准
from t1 inner join t2 on 新ansi标准
版本兼容,逻辑查询和物理查询是相同的

连表:
    内连接 inner join
    select 字段1。。 from table1
    inner join table2 on table1.字段=table2.字段1。。
    inner join table13 on table2.字段=table3.字段1。
    注:inner join 和join 是相同的
    内连接只能出现匹配到的结果,没有匹配的不显示
    内连接 可分为自连接,交叉连接,和内连接
    外连接 可分为左外连接、右外连接 强调即时没有
语法:
select 字段1 from table1 left [outer] join table2 on table1.字段=table2.zi字段
	左表的数据全部显示出来,即时左表的数据在右边表没有与之相对应的数据,也显示出来,其右边用null填充
select 字段1 from table1 right [outer] join table2 on table1.字段=table2.z
	右边的表数据全部显示出来
等值查询(交叉连接) from 表名用逗号隔开
select stuid,jkj from subject,grade -笛卡尔集 where subject.id=jkjk.id 相当于内连接
	笛卡尔集并没有什么实际意义,除非它和where进行联合使用
自连接:出现父子,上下级出现在同一张表中
	而这种关系通过树型多表的表现的话,会出现维护和更改的困难
	特别出现子变夫 、上下级转变、删除的操作太多
处理方法:
	将这种管理放在同一表中进行表现
	通过自查询很容易分开父子,上下级,但是容易产生递归操作

4.集合操作

集合操作的两个输入拥有相同的列数,若数据类型不同,mysql数据库会进行自动隐式转化
同时,结果列的名称由第一个输入决定
在集合操作者中into outfile 只能存在与最后一个select语句中否则会出现语法错误
当select语句中出现limit 和orderby 的时候,最好添加括号,否则出错
Union Distinct 和union all
一般省略distinct 关键字直接使用union
union all 输入所有项的及、结果集,并包含重复的选项
except集合操作允许用户找到位于第一个输入中但部位与第二个输入的行数据
可以使用except distinct  和except all
xcept distinct常使用left join 和not exists可以放心使用*,exists
    select x.a from xcept
    left join y
    oi x.a=y.all
    where y.a is null
----
    或 select  a from x  where not exists(select * from y where x.a=y.a)
    //case when source='x' then cnt else 0 end
    intersect 返回两个输入都出现的行 单纯使用left join 和not exists
    要使用 Union all  groupby

5.聚合函数

group_count 将分组后的非null数据通过连接符进行拼接,对null数据返回null值
聚合函数
count() 记录总行数,不建议使用*,效率低
sum()  返回一列的总数
avg() 一列的平均值
max() 一列的最大值
Min() 一列的最小值
一般和分组结合使用
having 过滤分组的筛选条件,先分组在运行having
注意在使用分组后,select 只能是分组字段和聚合函数,其余字段不准出现在select后面
order by 可以分为几个批次进行排序 a asc,b desc

6.删除表

TRUNCATE [TABLE] TABLE_name; 有点像不带条件的delete from 表名
但是truncate将id置为1,不建议使用
用于完全清空表数据,但表结构、索引、约束等不变,截断这张表
不同点:
       truncate不会进行全表扫表,直接删掉,速度快,不可恢复
       delete from 会产生遍历,产生日志,可恢复
       truncate table不会对事务产生影响,不产生事务过程
       truncate table 重新设定auto_increment 计数器

7.事务

使用事务保证数据完整性
    事务就是将一组sql语句放在同一批次内去执行
    如果是一个sql语句出错,该批次内的所有sql都将被取消执行
注意:mysql事务处理只支持innodb和DBD表数据类型
保证事务中的sql必须同时执行
#扣钱
update account set balance= balance-500 where accountNo='123'
#加钱
update account set balance= balance-500 where accountNo='17987'
事务回滚 RollBack
ACID原则:
    原子性 atomic 整体不可分割
    一致性 consist 保持数据一致性,能量守恒
    隔离性 isolate  互不影响,几个操作互不影响,锁:不能同时进行同一事物的操作
    持久性 durable  数据在操作后能够不变
自动提交  SET AUTOCOMMIT
mysql中默认是自动提交,每一条语句都是一个自动提交
    使用事务时应先关闭自动提交
    set autocommit=0 ;#关闭自动提交
    set autocommit=1 ;#开启自动提交
    START TRANSACTION  开启一个事务,标记事务的起始点
    COMMIT 提交一个事务给数据库
    ROLLBACK 将事务回滚,数据回到本次事务的初始状态
    SET AUTOCOMMIT=1;还原mysql数据库的自动提交
    
    1.先关闭自动提交
    2.设置起点
    3 提交一个事务给数据库,将事务回滚,取消commit中操作被取消
    4.还原自动提交 在 实际开发中不必开启自动提交,所有操作都是在自动提交
T-SQL编程
    set autocommit=0;
    start transaction;
    update account set balance= balance-500 where accountNo='123'
    #加钱
    update account set balance= balance-500 where accountNo='17987'
    if****
    commit
    else
     rollback
    set autocommit=1;
判断内容要在java部分处理,看是否发生异常,进而比较是使用commit还是rollback

8.分页

order by 字段 【asc】默认升序排列,desc降序排列
独有的语法: LIMIT
limit 【m,】n 或 limit n offset m  常用于分页显示
m 偏移量 即从那行开始显示
n 最大数目
m不指定默认为0 从第一条开始发威千n条数据
注意:select * from result limit 5,10 显示6-15条记录
注意加一,起始
第二页 书写应该是  5+10 即 m=15 (页码-1)*n

9.索引

1.索引
  作用:1.提高数据库的运行效率
       2.可以加速表和表之间的连接
       3.全文索引优化
  没有索引的时候,使用遍历每一个数据,n/2的查询次数
  使用二分法进行检索;必须已经排好顺序就行 log2^n/2
  数据库中采用B树查询
  
2.分类: 
  	主键索引  primary key   形成索引目录文件,且这个索引文件是排好顺序的
    唯一索引  UNIQUE 避免统一表中某列中数据重复;主键索引只有一个,而唯一索引可以有多个
    		 UNIQUE KEY 'GradeID'('grade');唯一属性的名字在'',默认是这一列的列名
    常规索引  保证数据的唯一性 设置主键,自动形成主键索引 
      		 类似b树索引,做查询条件常设置常规索引;如果一列中有几个索引,他会进行比较那个更快
                         可以使用index 或者key index '索引名字'  ('索引列')
            创建联合索引 index 'inxd--cd' ('c','d') c和d作为联合查询条件 c和d先后有顺序的,单独使用c条件产生较少于d条件后,因此c条件,写在前面 alter table 表名 add index '索引名' ('列名','列名')index允许有重复存在
    全文索引
		只能用于myisam类型数据表
		只能用于char varchar text
        适合与大型数据集
        like 在大文本时会失效
        create table '表名'
        (
        fulltext 'index--c'('c') c为列名,varchar等类型
        )engine=myisam
        alter table employee add fulltext('列名')
        全文索引的使用,需要自己调用
        select * from test where match('列名') against('key') key为关键字 如love的关键字,搜索的内容
3.总结:
    创建索引
          创建表时添加
           建表后追加
            语法:alter table 表名 add 索引类型(数据列名)
                        create unique index'idx_索引名' on 表(列可多列)
    删除索引
            drop index 索引名 on 表名  索引名默认为列名
                        alter table 表名  drop index 索引名
                        alter table  表名 drop primary key
    查看索引
               show index(或 keys) from 表名
4.索引的原则:
       索引并不是越多越好,维护目录占内存和时间
       不要对经常变动的数据加索引
       小数据量的表建议不要加索引
       索引一般应加在查找条件的字段
       在where 或者order by字句中经常使用的字段
        字段的值是多个
        字段不是经常变化的
        不宜添加过多的索引

10.备份和恢复

mysql数据库备份和恢复
   mysql数据库备份方法:
       1.导出 导入命令 ,查询
       2.mysqldump备份工具
       3.数据库管理工具 如sqlyog
       4.直接拷贝数据文件和相关配置文件
一、备份       
1.bin目录下的mysqldump 命令
    不要登陆进mysql ,与命令mysql命令平级
    mysqldump -h 主机名 -u用户名 -p 【options】 数据库名 表名》保存位置目录
    注:表名不存在 则保存该数据库下的所有数据表都保存下来
	mysqldump -uroot -p123456 bdpd库 cat表 dog 表》c:\jkjkj\jjjk.sql
	产生一个备份的sql文件,命令语句
	mysqldump -help 查看帮助 --help |more
    option
      --add-drop-table 默认启用 drop table if exits 语句 可以用--skip-add-drop-table 来取消
      --add-locks  默认打开,给这个表加锁,防止其他用户使用
      -t或者--no-CREATE-info 去处创建表的数据,只追加数据*****
      -c 或cpmplete 在insert 时添加上列名,在合并库的时候非常有用,并不一定添加默认的表中的所有列
      -d 或 --no-data 不存储表信息,只存储表结构
      --where '条件' ,-w'条件' 只存储条件内的记录存储
      --opt 几个限定条件的组合  
2.sqlyog客户端
     文件本份导入备份  导出sql
3.文件复制:
    myisam 拷贝 .myi .myd  .frm
    innodb  拷贝 .frm 不行 缺少.bdata1
4.命令行  (不常用)
	select studentno,studentname into outfile 'f:\jkjk.sql' from student;
    把数据提取出来
    导入到数据表中 必须与导入列的数据类型是一样的
    load  data infile 'f:/jkjk.sql' into table test (id,name);
二、恢复   
1.使用source
	source 是在mysql里面的命令
	用法: source  f:/sqlbak.sql
	mysql 登陆上
	use库
	source ...		                
2.使用mysql 具体命令
	mysql -uroot -p123456 texs数据库名称 <f:/sqlbak.sql
	

11.mysql查询优化器查询影响

mysql查询中带逗号,查询结果的问题:
    其实啊,你不仅写'1,2'会查出三条数据,就算你写'1ncdsln'或者'1ncskl12397na'之类的也会查出三条,就是Department 等于1的那三条,因为Department是bigint类型,但是你查的时候写的是字符串,这时候mysql就会去字符串前面的数字部分来查询,'312你打开所老'就会截取312这样,因为你的'1,2'不是bigint类型,所以会截取前面的数字,即1来查
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值