MySQL

一、DDL、DML、DQL、DCL

1、DDL语句(Data Definition Language) 数据定义语言

主要是进行定义、改变表的结构、数据类型、表之间的链接等操作。关键字: CREATE、DROP、ALTER 等。

1、创建数据库

//创建数据库db
drop database if exists;
create database db;
//使用数据库
use db;

2、创建表(create)

create table t_name(
列名1,数据类型,
列名2,数据类型);
//示例
create table use(
id bigint(10) not null auto_increment comment '编号',
name varchar(20) not null comment '账号',
birthday datatime default null comment '生日',
primary key(id));

3、删除表、删除数据库

drop table t_name;    //删除表
drop database d_name; //删除库

4、修改数据库编码格式

alert database d_name charset=utf8;

5、修改表

//添加列
alert table 表名 add 列名 数据类型;
//删除列
alert table 表名 drop 列名;
//修改列名
alert table 表名 change 旧列名 新列名 新数据类型;

//修改列数据类型(非主键列、无default约束)
//如果有先删除 、再修改、再增加
alter table 表名 modify 列名 新数据类型;


//删除主键
alter table 表名 drop primary key;
//添加主键
alter table 表名 add primary key 列名;

2、DML语句(Data Manipulation Language)数据操纵语言

主要是对数据进行增加、删除、修改操作。关键字有 INSERT、UPDATE、DELETE 等。

1、插入数据

insert into 表名(字段名1,字段名2,...) value(数据1,数据2,...);
//插入获取到的数据
insert into 表名(name,pwd) select name,pwd from user;

2、修改数据

update 表名 set 列名1=新值,列名2=新值,... where 限定条件;
//示例
update user set age=20 where id=1;

3、删除数据

delete from 表名 where 限定条件;
//示例
delete from user where id=1;//删数id为1的这条数据

①DDL、 DML 语句区别

DDL:数据库定义语句。对数据库内部对象进行创建(create)、删除(drop)、修改(alert)等操作。

DML:数据库操作语句。只对表内部数据进行操作,不涉及表的定义、表结构修改等。

②删除表、清空表

删除表:

  •  drop table 表名;(DDL)
  • 特点:表中数据、表结构全部删除, 所有相关事务提交, 所有相关索引删除,不能回滚

清空表:

  • delete  from  表名; (DML)
    • 表中数据删除了,但这个数据在硬盘上的真是存储空间不会被释放
    • 删除效率低
    • 支持回滚
  • truncate  (table)  表名;(DDL)
    • 清空表中的所有行,但表结构及其约束、索引等保持不变
    • 只能作用于表
    • 会重置表的自增值
    • 不能对有外键约束引用的表使用
    • 不支持回滚、快速

drop 、delete 、truncate 区别:

  • truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚。
  • truncate只能作用于表;delete,drop可作用于表、视图等。
  • truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。
  • truncate会重置表的自增值;delete不会。
  • truncate不会激活与表有关的删除触发器;delete可以。
  • truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。

 3、DQL 语句(Data Query Language)数据查询语言

主要是对数据进行查询操作。常用关键字有 SELECT、FROM、WHERE、DISTINCT 等。

1、查询语句

select * from 表名;//查看全部列
select 列名1,列名2...from 表名(where 限定条件);//(根据条件)查询指定列

2、去重

select distinct 列名1,列名2... from 表名;//n个字段组合后重复的进行去重

4、DCL语句(Data Control Language) 数据控制语言

主要是用来设置/更改数据库用户权限。常用关键字有 GRANT、REVOKE 等。

一般人员很少用到DCL语句。

模板如下:

GRANT (授权)

REVOKE (取消权限)

二、数据库查询

1、模糊查询

  • 通配符:“%” 替代一个或多个字符”。
//只要name 开头是“张”就会被匹配;如“%张”:最后一个字是张
select * from user where name like "张%";

//只要name 里有“张”机会被匹配
SELECT * from user where name like "%张%"

  • 通配符:“_” 只替代一个字符 
//name 的第一个字段是“张” 且只有两个字段才会被匹配;
select * from user where name like "张_";

//name 的 第二个字段是“ 三” 且只有两个字段的才会被匹配
select * from user where name like "_三";

//name 的第二个字段是“隋”,且只有三个字段时才会被匹配;如:简隋英、简隋林
select * from user where name like "_隋_";

//组合使用
//字段名1第二个字段是 沉 即可被匹配,无论总共几个字段
select * from 表名 where 字段名1 like "_沉%";

//字段名2倒数第二个字段是 沉 即可被匹配,无总共几个字段
select * from 表名 where 字段名2 like "%沉_";

2、MySQL常用函数

1、聚合函数(常用于GROUP BY从句的SELECT查询中)

  • AVG(  )       返回指定列的平均值
  • COUNT(  )  返回指定列中非NULL值的个数
  • MIN(  )        返回指定列的最小值
  • MAX(  )       返回指定列的最大值
  • SUM(  )       返回指定列的所有值之和

2、数学函数

  • ABS(  ) 返回x的绝对值
  • BIN(  ) 返回x的二进制(OCT返回八进制,HEX返回十六进制)
  • MOD(x,y) 返回x/y的模(余数)

3、内连接、外连接

内连接:组合两个表中的记录,返回关联字段相符的记录。

如下表a_tabLe 记录 id、name,表b_table 记录id、height,使用如下语句查询:

select a.id , a.name , b.height  
from a_table a inner join b_table b 
on a.id = b.id;

得到:

      

外连接

  • 左连接:左表记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
  • 右链接:左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。

4、DQL其他关键字

关键字作用备注
group by将列名相同的记录分成一组可以使用列别名
having筛选对象---组

可使用聚合函数,having一般跟在group by 后

where筛选对象---行不能使用列别名,不能使用聚合函数
in 筛选列包含某值规定where子句中的值,
limit(起始位置,偏移量)用于强制 SELECT 语句返回指定的记录数一个参数n(返回前n行)、两个参数x.y(返回x+1,到x+y行)
order by将结果按照要求排列可以使用列别名,desc(降序)asc(升序)

 示例:

//1、将列名相同的记录分成一组

select * from 表名 group by 列名;

//2.having   筛选分组后的条件

select * from table_name group by 列名1 having 列名2>1   (筛选条件) 

//3.in   规定where子句中的值

//(1)in    包括where子句的值

select * from table_name where column_name in('淘宝','百度')

//查询table_name表中column_name列中包含淘宝或百度

//(2)not in   不包括where子句的值

select * from table_name where column_name not in('淘宝','百度')

//in或者 not in 条件里也可以放子查询语句,例如:

select * from table_name where column_name 
not in(select column_name2 from table2_name)

//从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
selete * from testtable limit 2,1;
//从数据库中的第二条数据开始查询两条数据,即第二条和第三条。
selete * from testtable limit 2 offset 1;
注意:
1.数据库数据计算是从0开始的
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据
 

5、关键字执行顺序

  1. from        选择表
  2. where     筛选条件,筛选对象--行
  3. group by 将筛选出来的数据进行分组
  4. having     筛选条件,筛选对象--组
  5. select     选取最后的结果
  6. order by 将结果按照特定顺序排列
  7. on          排除不满足join的条件的行
  8. join        多表关联

三、三大范式

四、数据库事务

1、事务

        事务是指对系统进行的一组操作,为了保证系统的完整性,事务需要具有ACID特性

2、ACID

         ACID是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务是正确可靠的所必须具备的四个特性:原子性、一致性、隔离性、持久性。

  • Atomicity(原子性):一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简
  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3、数据库的事务隔离

//mysql 的事务隔离是在 mysql.ini 配置文件里添加的,在文件的最后添加:
transaction-isolation = REPEATABLE-READ
//可用的配置值:
READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
  • 读未提交:最低隔离级别、事务未提交前,就可被其他事务读取
  • 提交读:一个事务提交后才能被其他事务读取到,可以解决脏读问题(会造成幻读、不可重复读)。
  • 可重复读:默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
  • 序列化:代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

脏读

不可重复读

幻读

读未提交

读已提交

可重复读

序列化

  • 脏读 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
  • 不可重复读 :是指在一个事务内,多次读同一数据。
  • 幻读 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

五、索引

  • 索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
  • 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。
  • 索引包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。

优势:

  • 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
  • 被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
  • 如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。

劣势:

  • 索引会占据磁盘空间
  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

mysql 索引是怎么实现的?

  • 索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
  • 具体来说 mysql 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。

创建索引

  1. 创建:create index 索引名称 on 表名(字段名);
  2. 删除:drop index 索引名称 on 表名;
  3. 数据量庞大(客户需求快)时
  4. 该字段很少的增删改(DML)操作时
  5. 该字段经常出现在where子句中,即经常用到的字段

索引分类

  • 主键索引:数据列不允许重复,不允许为NULL,一个表只有一个主键。
  • 唯一索引:数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引。
  • 普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。
  • 全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索。
  • 覆盖索引:查询列要被创建的索引覆盖,不必读取数据行。
  • 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并。
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值