MySQL基础

作者: Amy1234567 | 来源:发表于2021-10-26 13:43 被阅读0次

    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语句的集合,理解成批处理语句

    \bullet  提高代码的重用性

    \bullet  简化操作

     \bullet 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

    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语句

    测试

    相关文章

      网友评论

        本文标题:MySQL基础

        本文链接:https://www.haomeiwen.com/subject/iovcaltx.html