MySQL基础

文章目录

1、六大约束:
主键约束 PRIMARY KKEY
外键约束 FOREIGN KEY
唯一约束 UNIQUE
非空约束 NUT NULL
创建默认值 DEFAULT
检查约束(Mysql不支持)

2、数据完整性:
数据完整性
实体完整性:同一张表不能出现重复数据、主键约束等实现
域完整性:数据类型精确、数据有效
引用完整性:外键约束
自定义完整性:约束方法:规则、存储过程、触发器

3、三大范式:
第一范式:确保每列保持原子性,不可被拆分。
第二范式:每个实体或行必须可以被惟一地区分。(确保每个表都有一个主键)
第三范式:确保每列都和主键列直接相关,不依赖于除主键外的其他列。
4、查询
使用DISTINCT排除重复

SELECT DISTINCT 列 FROM 表
SELECT DISTINCT 列A,列B FROM 表

集合操作:
SELECT *FROM student where age IN(25,21,20)
模糊查询:SELECT 列 FROM 表 WHERE 条件 LIKE 通配符
通配符:-(一个字符)、%(任意长度的字符串)
排序:
多列排序:SELECT 列... FROM 表 ORDER BY 列A,列B
详解
聚合函数:
点击查看详解
HAVING可以对聚合函数的结果进行过滤
Having和where的区别
1、where是对普通列进行过滤,而having对聚合函数的结果进行过滤
2、where是写在from后面,而having写在Group BY后面
3、Having可以单独使用,但一般会跟group by搭配使用

分组: GROUP BY,对某列分组,会把该列相同数据的记录放到同一个组,该列有多少个不同的数据,就有多少个组。
特点:如果在分组的基础上使用聚合函数,那么聚合函数会对每个组都执行一次
子查询: 一条select语句中嵌入另一条select语句
作用:联合多表进行更复杂的查询
分类:
1、嵌入的select语句作为条件的值
SELECT sname FROM student where sno=(select sno FROM grade where grade=80)·
2、
5、高级特性:
变量:
1、用户变量: ,以 @ 开始,形式为“@变量名”
实例:SET @nametest=666
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
系统变量:
2、全局变量: 在mysql启动的时候由服务器自动将他们初始化为默认值,这些默认值可以通过更改 my.ini这个文件来改变。(会话变量:在新建一个连接时,Mysql将所有全局变量的值复制一份。来做会话变量。对全局变量的修改会影响到整个服务器,对会话变量的修改只会影响到当前的数据库连接。通过show session variables 查看所有会话变量)
通过 show global variables 查看所有的全局变量
**3 、局部变量:**局部变量一般用在sql语句中,如存储过程或函数内定义。作用范围在begin到end语句块之间,在该语句块里设置的变量。
declare语句专门用于定义局部变量,set语句是设置不同类型的变量。

存储过程:
CREATE PROCEDUER 名称();
–带输入参数
–IN 输入参数
–OUT 输入参数:作用类似于java中的返回值
–例:创建一个存储过程,传入一个学号,输出学生表中该学生的姓名
CREATE PROCEDURE pro_in(IN snum varchar(20),OUT name1 VARCHAR(20))
BEGIN

 SELECT sname INTO name1 FROM student WHERE sno = snum;
 SELECT name1;

END

调用:call pro_in(“s007”,@username);
点击查看详解
结构语句:
IF 条件 THEN

END IF

REPEAT:

MySQL函数:
1、IF:如果expr1(条件表达式)返回结果为true,则返回expr2的值,否则返回expr3的值 IF(expr1,expr2,expr3);类似于三元运算符

–实例 SELECT IF(1>2,2,3);
–练习:传入两个数字,返回两个数字的差值
CREATE PROCEDURE pro_cha(IN num1 INT,IN num2 INT,OUT sum INT)
BEGIN
SET sum = IF(num1>num2,num1-num2,num2-num1);
END
CALL pro_cha(2,3,@sum);
SELECT @sum

2、IFNULL(expr1,expr2)
–一般用于设置默认值,如果expr1不为null,则返回expr1否则返回rxpr2
SELECT @username;
SET @username = null
IFNULL(@username,"默认值");

3、字符串函数:

CONCAT(s1,s2…,sn):将s1,s2…sn连接成字符串

CONCAT_WS(sep,s1,s2…,sn):将s1,s2…,sn连接成字符串,并用sep字符间隔

substring(被截取字段,从第几位开始截取,截取长度)

TRIM(str):去除字符串首部和尾部的所有空格

UUID()生成具有唯一性的字符串

LASTINSERTID():返回最后插入的id值

触发器:
– 触发器是一种特殊类型的存储过程,不由用户直接调用,而且可以包含复杂的SQL语句。它们主要用于强制复杂的业务规则或要求。
–触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系
特点:
1、它与表紧密相连,可以看作表定义的一部分;
2、它不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行修改时,自动执行;
3、它可以用于MySQL约束、默认值和规则的完整性检查,实施更为复杂的数据完整性约束。
触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:
1.监视地点(table)
2.监视事件(insert/update/delete)
3.触发时间(after/before)
4.触发事件(insert/update/delete)

CREATE TRIGGER tri_student_insert BEFORE INSERT ON student FOR EACH ROW
BEGIN

END
查看详细
事务:

**条件处理器:**当mysql发生异常时,我们可以定义一个条件处理器执行某些代码并且程序能够继续运行
使用:
1、需要一个使用环境(procedure)
2、利用declare定义一个异常处理器
3、当代码发生指定异常时,就会执行指定的代码

6、7种join连接

7、高级篇-MySQL调优
索引是帮助MySQL高效获取数据的排好序数据结构
什么情况下适合建索引:

适合不适合
主键自动建立唯一索引频繁更新的字段
频繁作为查询条件的字段表记录太少
查询中与其他表关联的字段,外键关系建立索引经常增删的表
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度数据重复过多的
查询中统计或者分组的字段
主键自动建立唯一索引
主键自动建立唯一索引

索引的数据结构:二叉树、红黑树、Hash表、B-Tree
1、二叉搜索树:将表中一列存放在二叉树中,通过key-value存储,value存储磁盘位置,找到key值直接用value值去磁盘找到对应数据库数据。
但这种方式有个弊端,在列中元素顺序排序时,会成一个单边增长态势,这时变为二叉搜索树时查询效率几乎不会改变。
2、红黑树: 当出现单边增长时,会有一个自旋平衡。
弊端:数据量过大时,树的高度太大,查询还是很慢。
3、Hash表: 经过Hash运算将value值算出一个散列值与存储地址对应。
弊端:当出现范围查找时,无法精确查找值。
4、B-Tree:
叶子节点具有相同的深度;
叶子节点的指针为空;
节点中的数据索引从左到右递增排列。
MySQL官方给数据索引大小上限设置为16K。
弊端:还是没有解决范围查找的问题。
B+树:
1、非叶子节点不存储data,只存储索引,可以存放更多的索引
2、非叶子节点不存储指针
3、顺序访问指针,提高区间访问的性能
4、相邻叶子节点之间有双向指针,实现范围查找

数据库存储引擎(表的级别,不同的表可以有不同的存储引擎):
MyISAM: 叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,在走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
索引分类:
单值索引: 即一个索引只包含单个列,一个表可以有多个单列索引,一般不要超过5个索引
唯一索引: 索引列的值必须唯一,但允许有空值
复合索引: 即一个索引包含多个列
基本语法:

创建: CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));
      ALTER TABLE mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))
 删除:DORP INDEX[indexName] ON mytable;
 查看:SHOW INDEX FROM table_name

在这里插入图片描述
索引优化:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值