数据库相关

MySQL基础

2021-10-26  本文已影响0人  Amy1234567

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

测试
上一篇下一篇

猜你喜欢

热点阅读