数据库复习二

本文详细介绍了SQL查询中的条件筛选、去除重复值(distinct)、模糊搜索(like)、NULL值处理、范围查询(between and)、分页(limit)、排序(orderby)、聚合(count, max/min/sun/avg)、分组(groupby)、having子句、事务ACID特性及操作,以及索引的定义、类型、创建与维护,涵盖了核心的数据库管理和优化技巧。
摘要由CSDN通过智能技术生成

条件查询

distinct

使用distinct关键字去除loc字段里的重复的记录行

select distinct loc from dept;

where

select * from emp

select * from emp where 1=1 --类似没条件

select * from emp where 1=0 --条件不成立

select * from emp where empno=100 --唯一条件

select * from emp where ename='tony' and deptno=2 --相当于两个条件的&关系

select * from emp where ename='tony' or deptno=1 --相当于两个条件的|关系

select name, sal from emp where sal=1400 or sal=1600 or sal=1800

-- 或

select name, sal from emp where sal in(1400,1600,1800) --sal的值在1400,1600,1800中

select name, sal from emp where sal not in(1400,1600,1800) --sal的值不在1400,1600,1800中

like

模糊查询

通配符%代表0到n个字符,通配符下划线_代表1个字符

select * from emp where ename like 'l%' --以l开头的

select * from emp where ename like '%a' --以a结束的

select * from emp where ename like '%a%' --中间包含a的

select * from emp where ename like 'l\_\_' --l后面有两个字符的 _代表一个字符位置

null

select * from emp where mgr is null --过滤字段mgr的值为空的

select * from emp where mgr is not null --过滤字段mgr的值不为空的

between and

select * from emp where sal<=3000 and sal>=10000--等效

select * from emp where sal between 3000 and 10000--等效

limit

在mysql中通过limit进行分页查询

select * from emp limit 2--列出前两条
select * from emp limit 1,3 --从第二条开始展示两条记录

order by

根据某一字段的值进行排序

select * from emp order by sal --默认升序
select * from emp order by sal desc--降序 

聚合

count  统计总记录数

select count(\*) from emp 
select count(1) from emp

max/min  求字段的最大值/最小值

select max(sal) from emp
select min(sal) from emp

sun/avg  求和/求平均值

select sum(字段名) from 表名
select avg(字段名) from 表名

分组

1.当查询结果出现了聚合列和非聚合列时使用分组

.2.通常按照非聚合列进行分组(使用了max,min,sum,avg,count 的就是聚合列)

group by  

#求出字段1的最大值和平均值并根据字段2分组。
select max(字段名1),avg(字段名1) from 表名
group by 字段名2

having  

重点:having和where的区别

having的作用:用来对分组后的数据,进一步过滤

#统计每年的入职人数,只要人数>1的记录
SELECT COUNT(1),YEAR(hiredate) FROM emp
GROUP BY YEAR(hiredate)
HAVING COUNT(1) > 1 
#不能改成where,后面出现了聚合函数

#统计每年的入职人数,只要2017年以后的记录
SELECT COUNT(1),YEAR(hiredate) FROM emp
WHERE YEAR(hiredate) > 2017 #高效,只是where里不能出现聚合函数
GROUP BY YEAR(hiredate)
#having YEAR(hiredate)> 2017 
#having里使用的过滤条件必须是查到的结果

事务

概念与特性

保证SQL语句,要么全执行成功,要么全失败
有四个特征ACID:
A:是原子性: 是指多条SQL是一个原子,密不可分.如果都正确,就操作了数据.如果有错误的都会发         生回滚,回到事务执行之前.
C:是一致性: 保证了数据的一致性和完整性.
I:是隔离性: 保证多线程并发时的数据安全,多个操作之间是被隔离的.
D:是持久性: 是指对数据CDU的影响是持久生效的.
        隔离级别:读未提交 读已提交 可重复读 串行化
        从前往后,性能越来越差,安全性越来越高.MySQL默认是可重复读

事务处理

  • 在MySQL中只有使用了Innodb数据库隐形的数据库或表才支持事务
  • 事务处理可以用来维护数据的完整性,保证成批的SQL语句要么全部执行,要么不执行
  • 事务用来管理insert、update、delete语句,因为这些操作才会“破坏”数据,查询select语句是不会的
  • MySQL默认数据库的事务是开启的,执行SQL后自动提交
  • MySQL的事务也可以改成手动提交,那就有两个步骤:先开启,写完SQL后再手动提交。

提交 commit

特点:

        1.多条语句时,批量执行,事务提交

        2.有了事务时,多步操作就形成了原子性操作,高并发下也不会引起数据混乱

        3.mysql的事务默认就是开启的--多条语句一起操作时,要么一起成功要么一起失败


BEGIN; #关闭事务的自动提交
 
INSERT INTO user (id) VALUES(5)#成功
 
INSERT INTO user (id) VALUES(5)#已经存在5了,会失败
 
COMMIT #手动提交事务

回滚 rollback

当多条语句批量执行时,insert擦汗如重复的主键导致失败时,事务回滚


BEGIN
 
INSERT INTO user (id) VALUES(15);
 
INSERT INTO user (id) VALUES(35);#存在了
 
ROLLBACK#事务回滚,就不会再提交了

索引 (index)

定义

索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(额外的存储空间),这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高效的查找算法。这种数据结构就叫做索引。

一般来说索引本身也很大,不可能全部存储在内存中,因此往往以索引文件的形式存放在磁盘中。目前大多数索引都采用BTree树方式构建。
分类

单值索引:一个索引只包括一个列,一个表可以有多个列

复合索引:一个索引同时包括多列

唯一索引:索引列的值必须唯一,但允许有空值(主键会自动创建唯一索引)

创建索引

1.查看索引(主键会自动创建一个索引)

show index from demp

2.创建索引

#create index  索引名 on 表名(字段名)
create index loc_index on dept(loc)

3.修改表结构,添加普通索引

alter table dept add index loc_index(loc)

4.创建唯一索引

alter table dept add unique(loc)

5.创建复合索引

alter table dept add index fuhe_index (dname,loc)

6.创建复合唯一索引

alter table dept add unique fuhe_index(dname,loc)

7.删除索引

alter table dept drop index fuhe_index

最左特性

当我们创建一个联合索引(复合索引)的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则,也称为最左特性。

索引的优点

  • 索引是数据库优化
  • 表的主键会默认自动创建索引
  • 每个字段都可以被索引
  • 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
  • 索引事先对数据进行了排序,大大提高了查询效率

缺点

  • 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
  • 索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
  • 虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需要更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件
  • 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去更新索引

SQL语句是否需要加分号

一般不加分号,当在一些数据库可视化工具(SQLyogEnt)中一次执行多条语句时,每条语句间加上分号,用于表示一条语句的结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值