MySQL基础
MySQL基础知识一
尚硅谷MySQL基础知识二
尚硅谷 尚硅谷DQL
1. `` : 着重号,用来区分关键字和字段名
2. 查询过程中,别名中包含特殊符号时,可以加双引号,或单引号,防止报错
3. 去重:distinct
3. mysql中的+号:仅仅只有一个功能,即运算符
两个操作数都为数值型,则做加法运算。select 100+1;
其中一方为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运算;如果转换失败,则将字符型数值转换成0。select '123'+90; select 'aa'+29;
只要其中一方为null,则结果肯定为null。select null+10;
4. where条件
尚硅谷4. is null:仅仅判断null值,可读性较高
5. <=> : 安全等于,即可以判断null,也可以判断其他值,可读性较低
6. order by的特点:
(1). asc代表的是升序,desc代表的是降序,如果不写就是升序
(2). order by子句中可以支持单个字段,多个字段,表达式,函数,别名
(3). order by子句一般是放在查询语句的最后面,limit子句除外
(4). 执行顺序为:from > where > select > order by
7. 常见函数
概念:将一组逻辑语句封装在方法体中,对外暴露方法名
好处:(1). 隐藏了实现细节。(2). 提高了代码的重用性。
调用:select 函数名(实参列表) 【from 表】;
特点:(1). 叫什么(函数名)(2). 干什么(函数功能)
分类:(1). 单行函数,如concat, length, ifnull等。(2). 分组函数,功能:做统计使用,又称为统计函数,聚合函数,组函数。
单行函数
一,字符函数
1. length('aa') : 获取参数值的字节长度 //字符集utf8下,汉字占三个字节,英文占一个字节; 字符集gbk下,汉字占两个字节。
SHOW VARIABLES LIKE '%char%'; //可以显示当前客户端的字符集
2. concat(): 拼接字符串
3. upper(): 将参数值变成大写, lower():将参数值变成小写
4. substr(字符串,索引,长度), substring(字符串,索引,长度) : 两个函数含义一样,截取字符串,索引从1开始
5. instr(字符串,子串): 返回子串第一次出现的索引,如果找不到返回0
6. trim(): 去除字段前后的字符
去掉空格 去掉字符7. lpad(字符串,长度,填充字符) : 用指定的字符实现左填充指定长度
左填充 左填充8. rpad(字符串,长度,填充字符) : 用指定的字符实现右填充指定长度
9. replace(字符串,指定字符,替换字符): 提花字符串
二,数学函数
1. round(float型数字,保留小数位数):四舍五入
2. ceil(float型数字): 向上取整,返回>=该参数的最小整数
3. floor(float型数字): 向下取整,返回<=该参数的最大整数
4. truncate(float型数字,保留小数位数): 不四舍五入,直接截断
5. mod(数字,数字): 取模,取余
注意:mod(a, b) 的公式为a-a/b*b
三,日期函数
1. now() : 返回当前系统日期+时间
2. curdate() : 返回当前系统日期,不包含时间
3. curtime() : 返回当前系统时间,不包含日期
4. 获取指定的部分
年:year(now()), 月:month(now()), monthname(now()), 日:day(now()), 小时:hour(now()), 分钟:minute(now()), 秒:second(now())
5. str_to_date() : 将日期格式的字符串转换成指定格式的日期
str_to_date('9-13-1999', '%m-%d-%Y') //1999-09-13
6. date_format() : 将日期转换成字符串
date_format('2018/6/6', '%Y年%m月%d日') //2018年06月06日
尚硅谷7. datediff(日期1,日期2); //两个日期相差的天数
四,其他函数
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
五,流程控制函数
1. if(条件,结果1,结果2) ,if else
2. case:
使用一:相当于switch (等值判断)
尚硅谷使用二:相当于多重if,(范围判断)
尚硅谷分组函数
1. 功能:用作统计使用,又称为聚合函数或统计函数或组函数
2. 分类:sum 求和, avg 平均值,max 最大值, min 最小值, count 计算个数
3. 特点:(1). sum, avg一般处于处理数值型, max, min, count可以处理任何类型
(2). 以上分组函数都忽略null值
4. count函数的详细介绍
SELECT COUNT(*) FROM employees; //行有一列不为空,就会+1
SELECT COUNT(1) FROM employees; //在表中加一列1,计算1有多少行
效率:MyISAM存储引擎下,count(*)的效率高;InnoDB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)要高一些,因为字段需要判断字段是否为null。
和分组函数一同查询的字段有限制,一般要求是group by后的字段
5. 分组查询 -- group by
尚硅谷 尚硅谷2. group by子句支持单个字段分组,多个字段分组(多个字段用逗号隔开没有顺序要求),表达式和函数(用的较少)
3. 也可以添加排序,排序放在整个分组查询之后
连接查询,即多表查询
为表起别名,可以提高语句的简洁度,并且区分多个重名的字段。注意,如果为表起了别名,则查询的字段就不能使用原来的表名去限定
1. 子查询
含义:出现在其他语句内部的select语句,称为子查询或内查询;外部的查询语句,称为主查询或外查询
(1). 分类:按子查询出现的位置:
select后面:仅仅支持标量子查询
from后面:支持表子查询
where或having后面:支持标量子查询(单行子查询),列子查询(多行子查询),行子查询(多列多行)
exists后面(相关子查询):支持表子查询
(2). 按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
表子查询(结果集一般为多行多列)
where或having后面:支持标量子查询(单行子查询),列子查询(多行子查询),行子查询(多列多行)
特点:
(1). 子查询放在小括号内
(2). 子查询一般放在条件的右侧
(3). 标量子查询,一般搭配着单行子查询操作符使用(>, <, >=, <=, =, <>)
列子查询,一般搭配着多行操作符使用(IN, ANY/SOME. ALL)
(4). 子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
多行操作符2. 分页查询
尚硅谷 尚硅谷联合查询
尚硅谷DML
一,插入语句
语法一:insert into 表名(列名,...) values(值1,...)
注意:
1. 插入的值的类型要与列的类型一致或兼容
2. 不可以为null的列必须插入值,可以null的列可以插入null, 或省略该字段
3. 列的顺序可以调换
4. 列数和值的个数必须一致
5. 可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
语法二:insert into 表名 set 列名=值,列名=值......
两种方式的区别:
1. 方式一支持多行插入,方式二不支持
2. 方式一支持子查询(select),方式二不支持
二,修改语句
1. 修改单表的记录
语法:update 表名 set 列=新值, 列=新值,....... where 筛选条件
执行顺序:update > where > set
2. 修改多表的记录
尚硅谷三,删除语句
方式一:delete
语法:
1. 单表删除:delete from 表名 where 筛选条件
2. 多表删除:
尚硅谷 实例方式二:truncate
语法:truncate table 表名
3. 两种方式的区别:
1. delete可以加where条件,truncate不可以
2. truncate删除要比delete效率高一点
3. 假如要删除的表有自增长列,如果用delete删除后,再删除数据,自增长列从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始
4. truncate删除没有返回值,delete删除有返回值(受影响的行数)
5. truncate删除不能回滚,delete删除可以回滚
DDL
尚硅谷一,库的管理
1. 库的创建
语法:create database [if not exists] 库名;
2. 库的修改(一般来说不修改,如果已经有数据,可能会出现问题)
修改库名:直接修改数据文件夹的名称
更改库的字符集:alter database 库名 character set gbk;
3. 库的删除
drop database [if exists] 库名;
二,表的管理
1. 表的创建
尚硅谷2. 表的修改
语法:alter table 表名 add|drop|modify|change column
(1). 修改列名
alter table 表名 change column 列名 新列名 类型;
(2). 修改该列的类型或约束
alter table 表名 modify column 列名 新类型;
(3). 添加新列
alter table 表名 add column 新列 类型;
(4). 删除列
alter table 表名 drop column 列名;
(5). 修改表名
alter table 表名 rename to 新表名;
3. 表的删除
drop table [if exists] 表名;
尚硅谷4. 表的复制
(1). 仅仅复制表的结构
create table 新表 like 旧表;
(2). 复制表的结构+数据
create table 新表 select * from 旧表;
(3). 只复制部分数据
create table 新表 select * from 旧表 where 筛选条件
(4). 仅仅复制某些字段
create table 新表 select 部分字段 from 旧表 where 不成立条件(1=2);
数据类型
1. 整型
尚硅谷 尚硅谷2. 小数
尚硅谷分类
1. 浮点型:float(M,D), double(M,D)
2. 定 点型:dec(M,D), decimal(M,D)
特点:
(1). M:整数部位 + 小数部位的长度,D: 小数部位的长度
如果超过范围,则插入临界值
(2). M和D都可以省略
如果是decimal, 则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度
(3). 定点型的精确度较高,如果要求插入数值的精度较高如货币运算,则选定点型
选择数据类型的原则:
尚硅谷3. 字符型
(1). 较短的文本:char, varchar
(2). 较长的文本:text, blob (较大的二进制)
尚硅谷(3). 两者的区别:
尚硅谷(4). 其他:
binary和varbinary用于保存较短的二进制
enum用于保存枚举。要求插入的值必须属于列表中指定的值之一
set用于保存集合。和Enum类型类似,里面可以保存0~64个成员。和Enum类型最大的区
别是:SET类型一次可以选取多个成员,而Enum只能选一个
根据成员个数不同,存储所占的字节也不同
4. 日期类型
尚硅谷分类:
date: 只保存日期
time: 只保存时间
year: 只保存年
datetime: 保存日期+时间
timestamp: 保存日期+时间
尚硅谷常见约束
一,含义
一种限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性
二,分类:六大约束
1. NOT NULL: 非空,用于保证该字段的值不能为空,比如姓名,学号
2. DEFAULT: 默认,用于保证该字段有默认值
3. PRIMARY KEY: 主键约束,用于保证该字段的值具有唯一性,并且非空,比如学号,员工编号
4. UNIQUE: 唯一约束,用于保证该字段的值具有唯一性,可以为空,比如座位号
5. CHECK: 检查约束(mysql不支持),比如年龄,性别
6. FOREIGN KEY: 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表中添加外键约束,用于引用主表中的某列的值。比如学生表的专业编号,员工表的部门编号,员工表的工种编号等
三,添加约束的时机
1. 创建表时,2. 修改表时 (在添加数据之前)
四,约束的添加分类
1. 列级约束 :六大约束语法上都支持,但外键约束没有效果
直接在字段名和类型后面追加约束类型即可,可以添加多个约束
2. 表级约束:除了非空,默认,其他的都支持
语法:在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
通用的写法:
尚硅谷主键约束和唯一约束的对比:
尚硅谷外键:
1. 要求在从表设置外键关系
2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3. 主表的关联列必须是一个key(一般是主键或唯一)
4. 要求插入数据时,先插入主表,再插入从表;删除数据时,先删除从表,再删除主表
可以通过级联删除和级联置空两种方式创建外键,以达到删除主表数据的目的
五,修改表时添加约束
语法:
列级约束:alter table 表名 modify column 列名 字段类型 新约束
表级约束:alter table 表名 add [constraint 约束名] 约束类型(列名) [外键的引用]
1. 添加非空约束
alter table 表名 modify column 列名 类型 not null;
测试2. 添加默认约束
alter table 表名 modify column 列名 类型 default 值;
3. 添加主键
列级约束:alter table 表名 modify column 列名 类型 primary key;
表级约束:alter table 表名 add primary key(列名);
4. 添加唯一
列级约束:alter table 表名 modify column 列名 类型 unique;
表级约束:alter table 表名 add unique(列名);
5. 添加外键
alter table 表名 add [constraint 外键名] foreign key(列名) references 主表名(列名);
添加级联删除外键:
alter table 表名 add [constraint 外键名] foreign key(列名) references 主表名(列名) on delete cascade;
(删除主表的数据,外键的表的数据也会被删除)
添加级联置空外键:
alter table 表名 add [constraint 外键名] foreign key(列名) references 主表名(列名) on delete set null;
(删除主表的数据,外键的表的数据的字段会变成null)
六,修改表时删除约束
1. 删除非空约束
alter table 表名 modify column 列名 类型 null;
2. 删除默认约束
alter table 表名 modify column 列名 类型;
3. 删除主键
alter table 表名 drop primary key;
4. 删除唯一
alter table 表名 drop index 约束名;
(可以通过“show index from 表名”查看约束名)
5. 删除外键
alter table 表名 drop foreign key 约束名;
七,列级约束和表级约束的区别
尚硅谷标识列
又称为自增长列
1. 含义:可以不用手动的插入值,系统自动默认的序列值
测试2. 查看自增的起始值(auto_increment_offset)和步长(auto_increment_increment)
测试3. 可以修改步长:
SET auto_increment_increment=3; #每次自增3
4. 特点:
(1). 标识列必须和主键搭配吗?不一定,但要求是一个key
(2). 一个表可以有几个标识列?至多一个
(3). 标识列的类型:只能是数值型(int,float等都可以)
(4). 标识列可以通过 “SET auto_increment_increment=3”设置步长,也可以通过手动插入值,设置起始值
5. 修改表时设置标识列
alter table 表名 modify column 列名 类型 primary key auto_increment;
6. 修改时删除标识列
alter table 表名 modify column 列名 类型;
TCL语言
全称:Transaction Control Language 事务控制语言
一,事务的含义
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
二,事务的特性:ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据
三,事务的创建
1. 隐式事务:事务没有明显的开启和结束的标记
比如insert, update, delete语句
自动提交默认开启,每一条语句都是一条事务
测试2. 显式事务:事务有明显的开启和结束标记
前提:必须先设置自动提交功能为禁用
SET autocommit=0; #只当前有效
测试3. 使用事务
步骤一:开启事务
SET autocommit=0;
START TRANSACTION;(可选的)
步骤二:编写事务的sql语句(select,update,insert,delete)
语句1;
语句2;
......
注意:DDL语言没有事务之说
步骤三:结束事务
commit: 提交事务
rollback: 回滚事务
实例:
测试 测试 测试 测试4. 事务隔离级别:
尚硅谷5. savepoint 节点名:设置保存点
只能和rollback搭配使用
测试6. delete和truncate在事务中使用时的区别
delete语句可以回滚,truncate不能回滚
视图
含义:虚拟表,和普通表一样使用
行和列的数据来自自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存sql逻辑,不保存查询结果
应用场景:
--多个地方用到同样的查询结果
--该查询结果使用的sql语句较复杂
1. 语法:
create view 视图名
as
查询语句
2. 视图的好处:
(1). 重用sql语句
(2). 简化复杂的sql操作,不必知道它的查询细节
(3). 保护数据,提高安全性
3. 视图的修改
方式一:
create or replace view 视图名
as
查询语句
方式二:
alter view 视图名
as
查询语句
4. 删除视图
drop view 视图名,视图名......;
5. 查看视图
(1). desc 视图;
(2). show create view 视图名;
(3). 命令行:show create view 视图名;
7. 视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的
包含以下关键字的sql语句:
(1). 分组函数,distinct, group by, having, union, 或者union all.
(2). 常量视图
(3). select中包含子查询
(4). join (可以更新,不能插入)
(5). from一个不能更新的视图
(6). where子句的子查询引用了from子句中的表
8. 视图与表的比较
尚硅谷变量
系统变量:全局变量,会话变量
自定义变量:用户变量,局部变量
一,系统变量
说明:系统提供,不是用户定义的,属于服务器层面
使用的语法:
1. 查看所有的系统变量
SHOW GLOBAL|[SESSION] VARIABLES;
2. 查看满足条件的部分系统变量
SHOW GLOBAL|[SESSION] VARIABLES LIKE '%char%';
3. 查看指定的某个系统变量的值
SELECT @@global|[SESSION].系统变量名;
eg.
SELECT @@global.autocommit; #查看自动提交
SELECT @@global.tx_isolation; #查看事务的隔离级别
4. 为某个具体的系统变量赋值
方式一:SET GLOBAL|[SESSION] 系统变量名 = 值;
方式二:SET @@global|[SESSION].系统变量名 = 值;
注意:如果时全局级别,则需要加global,如果是会话级别,则需要加session,如果什么都不写,则默认为会话级别
5. 全局变量
作用域:服务器每次启动将为所有的全局变量赋值初始,针对于所有的会话(连接)都有效,但不能跨重启
(如果要跨重启,则需要修改配置文件)
6. 会话变量
作用域:仅仅针对于当前会话(连接)有效
二,自定义变量
说明:变量是用户自定义的
使用步骤:
声明
赋值
使用(查看,比较,运算等)
1. 用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域。
可以放在任何地方,也就是begin end里面或外面
尚硅谷 尚硅谷2. 局部变量
作用域:仅仅在定义它的begin end中有效,必须是begin end中的第一句话
尚硅谷3. 用户变量与局部变量的比较
尚硅谷存储过程和函数
类似于java中的方法
好处:
1. 提高代码的重用性
2. 简化操作
一,存储过程
含义:一组预先编译的sql语句的集合,理解成批处理语句
提高代码的重用性
简化操作
减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
1. 创建语法
尚硅谷注意:
(1). 参数列表包含三个部分
参数模式 参数名 参数类型
举例:IN 参数名 INT
参数模式:
IN: 该参数可以作为输入,也就是说该参数需要调用方传入值
OUT: 该参数可以作为输出,也就是该参数可以作为返回值
INOUT: 该参数即可以作为输入又可以作为输出,也就是该参数即需要传入值,又可以返回值
(2). 如果存储过程体仅仅只有一句话,begin end可以省略
存储过程体中的每条sql语句的结尾要求必须加分号
存储过程的结尾可以使用delimiter重新设置
语法:delimiter 结束标记
2. 调用语法
call 存储过程名(实参列表)
举例:
(1). 创建无参的存储过程:
测试调用:CALL myp1();
(2). 创建参数模式为IN的存储过程:
测试调用:CALL myp3('amy', 9999);
(3). 创建参数模式为OUT的存储过程:
测试调用:
测试(4). 创建参数模式为INOUT的存储模式:
测试调用:
测试3. 删除存储过程
DROP PROCEDURE 存储过程名;
(不支持批量删除)
4. 查看存储过程的信息
SHOW CREATE PROCEDURE 存储过程名;
注意:无法修改存储过程中的逻辑语句,如果要修改就删除后重新创建
二,函数
含义与好处和存储过程一样
区别:
存储过程:可以有0个返回值,也可以有多个返回值。适合做;批量插入,批量更新。
函数:只能有1个返回值。适合做处理数据后返回一个结果。
1. 创建语法
尚硅谷2. 举例
(1). 创建空参有返回值的函数:
测试调用:SELECT myf1();
(2). 创建有参数有返回值的函数:
测试调用:
测试3. 查看函数信息:
SHOW CREATE FUNCTION 函数名;
4. 删除函数:
DROP FUNCTION 函数名;
注意:函数和存储过程一样,也不做修改
流程控制结构
尚硅谷一,分支结构
尚硅谷2. case结构:
尚硅谷 尚硅谷实例:
测试3. if结构
尚硅谷实例:
测试二,循环结构
尚硅谷1. while循环
尚硅谷2. loop循环
尚硅谷3. repeat循环
尚硅谷4. 实例
(1). 没有添加循环控制语句
测试(2). 添加leave语句
测试(3). 添加iterate语句
测试