MysqL数据库
一、数据库相关概念
1.数据库好处
(1)持久化数据到本地
(2)可以实现结构化查询,方便管理
2.数据库的相关概念
(1)DB(database):数据库,保存一组有组织的数据容器
(2)DBMS(Database Management System)**:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据,常见DBMS:MysqL、Oracle、DB2、sqlServer等
(3)sql:结构化查询语言,用于和数据库通信的语言
3.sql语言
(1)DML(Data Manipulate Language)**:数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性
关键字:insert, delete, update 等
(2)DDL(Data Define Languge):数据定义语言,用于库和表的创建、修改、删除 关键字:create, drop,alter等
(3)TCL(Data Control Language):数据事务语言
(4)DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录(数据)
关键字:select, where 等
4.数据库存储的特点
(1)数据存放到表中,然后表再放到库中
(2)一个库中可以有多张表,每张表具有唯一的表名标识自己
(3)表中有一个或多个列,列又称为“字段”,相当于Java中的“属性”
(4)表中的每一行数据相当于Java中的对象
二、MysqL相关知识点
1.MysqL常见的命令
(1)查看当前所有的数据库:show databases;
(2)打开指定的库: use 库名
(3)查看当前库的所有表: show tables;
(4)查看其他库的所有表:show tables from 表名;
(5)创建表:create table 表名( 列名 列类型,列名 列类型 ...)
(6)查看表结构:desc 表名;
(7)查看服务器版本:MysqL --V或MysqL --version
2.MysqL语法规范
(1)不区分大小写,建议关键字大写
(2)使用英文分号结尾
(3)各子句一般分行写
(4)关键字不能缩写也不能分行
(5)合理使用缩进
(6)注释
①单行注释:#注释文字
②单行注释:-- (空格)注释文字
③多行注释:/*注释文字*/
3.MysqL的背景:前身属于瑞典的一家公司,MysqL AB,08年被sun公司收购,09年sun被Oracle收购
4.MysqL的优点
(1)开源、免费、成本低
(2)性能高、移植性好
(3)体积小,便于安装
三、DQL(数据查询语言)
1.查询所有的记录
select * from 表名
2.基础查询
(1)多个字段(属性)查询: select 字段名1,字段名2...from 表名;
(2)去除重复:distinct (select distinct 字段名 from 表名)
(3)计算列
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
如果该字段为null后的替换值
(4)起别名
as (select concat (‘a’,'b','c')As 结果)
3.条件查询
(1)按条件表达式筛选
条件运算符:>,<,=,<>(!=),>=,<=
(2)逻辑表达式筛选
逻辑运算符:and,or,not
(3)模糊查询
复杂条件:like,betwee and,in,is null
(4)安全等于
<=>:可用于判断null也可用于判断数值类型
4.排序查询
(1)asc代表升序,desc代表降序,如果不写默认为升序
(2)order by子句中可以支持单个字段、多个字段、表达式、函数、别名
(3)order by子句一般是放在查询语句最后面,limit子句除外
5.常见的函数查询
(1)概念:类似于Java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
(2)好处:①隐藏了实现细节;②提高了代码的复用性
(3)调用:select 函数名(实参列表)【from 表名】
(4)特点:①函数名;②函数功能
(5)分类:
①单行函数;如:cancat,length,ifnull
②分组函数;功能:做统计使用,又称为统计函数、聚合函数、组合函数
6.单行函数
(1)字符函数
①length;获取字符串长度
②concat拼接字符串
③upper 将字符变为大写,lower将字符变为小写
④substr、substring字符串截取
⑤instr指定元素在字符串中第一次出现的位置,找不到返回0
⑥trim去除字符串中前后空格
⑦lpad用指定的字符左填充到指定长度
⑧rpad用指定的字符有填充到指定的长度
(2)数学函数
①round四舍五入
②ceil向上取整,返回大于等于该参数的最小整数
③floor向下取整,返回小于等于该参数的最大整数
④truncate截断,根据第二个参数(n)的数据截取第一个数据,从第n位后全部舍掉
⑤mod取余,被除数为负结果就为负
(3)日期函数
①Now返回当前的系统日期加时间
②curdate返回系统当前的日期不加时间
③curtime返回系统当前的时间不加日期
④str_to_date;将字符串通过指定的格式转换为日期
⑤date_format将日期通过指定格式转换成字符型
(4)其他函数:version(),database(),user
(5)流程控制函数
①if函数;select if(10>5,'大','小');
②case函数
7.分组函数
(1)分类:sum 求和,avg平均值,max最大值,min最小值,count计算个数
(2)特点:
①sum,avg用于处理数据类型;max,min,count可以处理任何数据类型
②以上分组函数全都忽略null值
③可以与distinct(去重)搭配使用
④count函数:计算非空个数,count(*)或count(1)计算表的行数
⑤和分组函数一同查询的字段要求是group by后的字段
8.分组查询
(1)语法:selsect 分组函数,列(按什么分组就是什么,要求出现在group by的后面)from 表 【where 筛选条件】group by 分组列表 【order by 子句】
(2)注意 :查询列表必须特殊,要求是分组函数和group by后出现的字段
(3)特点:分组查询中的筛选条件分为两类
①筛选数据来自表中直接用where判断
② 筛选条件来自分组后计算后的结果在group by后用having连接
③分组函数做条件一定放在having子句中
9.连接查询
内连接:等值连接、非等值连接、自连接
外连接:左外连接,右外连接,全外连接(全外连接结果=内连接结果+主表中有的从表中没有的+从表中有的主表中没有的)
交叉连接
(1)sql92标准
①等值连接:多表等值连接结果为多表的交集部分
②n表连接需要n-1条连接条件
③多表顺序可变
④一般为了区分字段需要为表起别名
⑤可以添加之前所学过的分组查询以及排序使用
⑥支持内连接,以及部分外连接
(2)sql99标准
①支持内连接以及外连接(左外left[outer]、右外rigth[outer])
②外连接:外连接结果=内连接结果+主表中有而从表中没有的且显示为null
③左外连接:left join左边为主表
④右外连接:right join右边为主表
⑤full两边都为主表
10.子查询
①含义:出现在其他语句中的select语句,称为子查询或内查询
②外部的查询称为主查询或外查询
③分类
标量子查询(结果只有一行一列)
列子查询(结果为一列多行)
行子查询(结果为一行多列)
表子查询(一般结果为多行多列)
④select后面仅仅支持标量子查询,from后面支持表子查询(要求子查询充当一个表必须取别名),where或having后面支持标量子查询、列子查询和行子查询,exists(相关查询)支支持表子查询
⑤where或having后面特点:子查询必须放在小括号内;子查询一般放在条件右侧;标量子查询一般搭配着单行操作符使用;列子查询一般搭配着多行操作符使用(IN,ANY/SOME,ALL,NOT IN);子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
⑥单行操作符:>,<,>=,<=,<>
11.分页查询
(1)应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
(2)特点:
①limit写在查询语句的最后
②公式:要显示的页数 page,每页的条目数size; limit(page-1)*size,size;
③从0开始索引
12.联合查询
(1)union联合查询:合并将多条查询语句的结果合成一个结果
(2)应用场景:要查询的结果来自于多个表且多个表没有直接的连接关系,但是查询的信息一致时
(3)特点:
①要求多条查询语句的查询列数是一致的
②要求多条查询语句的查询的每一列类型和顺序最好一致
③union默认去重,如果使用union all可以包含重复项
四、DDL(数据定义语言)与DML(数操纵语言)
(一)DML:插入 insert、修改 update、删除 delete
1.insert
(1).方式一:insert into 表名(列名,...) value(值1,...),value(值1,...)...
(2).插入的值的类型必须与列的类型一致或兼容
(3).列之间的顺序可以调换
(4).列的个数与值的个数要相同
(5).可以省略列名,默认为所有列,顺序默认为表中的顺序 insert into 表名 value(值1,...)
(6).方式二:insert into 表名 set 列名=值,列名=值,...
2.update
update 表名 set 列名=新的值
(二)DDL
1.库的管理
(1)库的创建: create database 库名
(2)库的修改:库名不能直接修改,因为不安全;可以修改字符集: alter database 库名 character set gbk
(3)库的删除:drop database if exists 库名;
(4)show tables;查看当前库的表
2.表的管理
(1)表的创建:create table 表名(列名 列的类型[(长度)约束条件,....],....)
(2)desc book;查看当前表的的结构
(3)表的修改
①修改列名:alter table 表名 change column 原列名 新列名 datetime;
②修改列的类型或约束:alter table 表名 modify column 列名 新的类型或约束
③删除列:alter table 表名 drop clumn 列名;不能写if exists
④添加列:alteer table 表名 add column 添加列名 数据类型;
⑤修改表名:alter table 表名 rename to 新表名;
⑥表的删除:drop table if exists 表名;
(4)表的复制
①仅仅复制表的结构:create table 新表名 like 复制文件的表名
②复制表的结构加数据:create table 新表名 select * from 数据表名
③只复制部分数据:create table 新表名 select *from 数据表名 where 复制条件
④仅仅复制部分字段:create table 新表名 select 字段名,字段名 from 数据表名 where 0
(5)常见的数据类型
①整数型:tinyint,smallint,mediumint,int、interger,bigint
②创建表时没有写unsigned默认为有符号数,写了为无符号数;插入的数值超出数据范围,会报异常并且插入临界值;如果没有设置数据长度怎么填入就怎么显示,如果设置了长度必须搭配 zerofill使用,不足自动用0填充 zerofill默认为无符号
③小数:定点数dec(M,D);decimal(M,D) ,浮点数:float(M,D),double(M,D) ;其中M代表整数部分加小数部分总长度(超出插入临界值),D代表小数部分的长度(超出则四舍五入)M和D均可省略,decimal省略默认为(10,0),定点数的精确的较高
④字符型:较短文本:char,varchar;较长的:text,blob(较长的二进制数据);其他:binary和varbinary(用于保存较短的二进制数据),enum(用于保存枚举)
⑤日期型:date(日期),datetime(日期加时间,范围(1000-9999)),timestamp(日期加时间,范围(1970-2038)),time(时间),year(年)
(6)常见约束
①含义:一种限制用于限制表中数据,为了保证表中数据的准确性和可靠性
②not null:非空约束,表示该字段不能为空
③default默认约束,用于保证该字段没有输入值时,给出一个默认值
④primary key主键:用于保证该字段的唯一性,并且非空,便于查找
⑤unique:唯一约束,用于保证该字段的数据是唯一的,可以为空
⑥check:检查约束,MysqL中不支持,检查值是否为设定的值
⑦foreign key:外键:用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表中添加外键约束,用于用主表中的某列值;从表中的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求;主表的关联列必须是一个key(一般是主键或唯一)
(7)标识列
①含义:又称自增长列,可以不通过手动插入值,系统提供默认的序列值
②表示要求与key搭配使用,一个表中只能有一个标识,表示的数据只能是数值型
③可以通过:set auto_increment_increment=整数,修改每次增长的值
五、TCL(数据事务语言)
1.事务:一个或多个sql语句组合成的一个执行单元,这个执行单元中的sql语句要么全都不执行,要么全都执行
2.事务的属性
(1)原子性:指事务是一个不可在分割的最小单元,事务中的操作要么全都执行要么全都不执行
(2)一致性:指事务的数据一致一个状态转换为另一个一致状态
(3)隔离性:指一个事物的内部操作以及数据,不受其他并发事务的影响,并发事务之间不能互相干扰
(4)持久性:指一个事物一旦提交,它所对应的数据库中的数据将是永久性修改,接下来的其他操作或数据库故障不应该对其有任何影响
3.事务的创建
(1)隐式事务:事务没有明显的开始和结束标志 update 表名 set salaer=1000 where name='张三丰'
(2)显示事务:事物具有明显的开启和结束标记,前提 步骤一:必须关闭自动提交功能 set autocommit=0 ;步骤二:开启事务 start transaction; 步骤三:隐式语句; 步骤四:结束事务commit 或回滚事务: rollback;
4.事务隔离级别
(1)产生原因:事务并发时产生,就是当多个事务同时操作同一个数据库中的数据时所产生的
(2)类别
①脏读:一个事务读取到另外一个没有提交的事务处理数据
②不可重复读:同一个事务之中,多次读到的数据不一致
③幻读:一个事务读取数据时,另外一个事务进行更新中,导致第一个事务读到的数据没有更新
5.设置事务隔离级别
(1)READ UNCOMMITIED:允许出现所有并发问题(脏读、不可重复读、幻读)
(2)READ COMMITEO:可以避免脏读问题,但其他并发问题依然存在(不可重复读、幻读)
(3)REPEATABLE READ:可以避免脏读和不可重复读的问题,但幻读还是依然存在
(4)SERIALIIABLE:所有的并发问题都可以处理,但性能很低
(5)oracle支持(1)、(4)默认为(2);MysqL全支持默认为:(3)
六、视图
1.定义:是一个虚拟表,数据由使用表动态生成,只保存了sql逻辑,不保存查询结果,和表的使用一样
2.应用场景:
(1)多个地方用到同样的查询结果
(2)该查询结果使用的sql语句较复杂
3.好处:
(1)重用了sql语句
(2)简化了复杂的sql操作
(3)保护了数据库中数据安全,提高了安全性以及多处可以调用,提高了sql语言的复用性
4.视图的创建:create view 视图名 as 查询语句
5.查看视图:select * from 视图名;
6.视图的修改
(1)create or replace view 视图名 as 查询语句;(存在修改,不存在创建)
(2)alter view 视图名 as 查询语句;
7.删除视图:drop view 视图名1,视图名2...;
8.查看视图的结构
(1)desc 视图名;
(2)show create view 视图名;(在命令行窗口查看)
9.视图的更新:
(1)插入:insert into 视图名 values(值1,值2..)
(2)修改:update 视图名 set 字段名=值 where 字段名=值;
(3)删除:delete from 视图名 where 字段名= 值; 上面几种更新都会修改原始表中的数据
(4)以下几种及情况是不允许更新的
①包含:分组函数,distinct,group by,having,union 或者union all
②常量视图
③select中包含了子查询
④语句中包含了join,不能插入
⑤from(使用)一个不能更新的视图
⑥where子句的子查询引用到了from子句中的表
七、变量
1.系统变量
(1)定义:由系统提供,不是用户自定义属于服务器层面
(2)类别:全局变量 ,会话变量
①全局变量作用域:服务器每次启动将所有的全局变量赋值,针对于所有的会话(连接)有效,但不能跨重启
②会话变量作用域:仅仅支持当前会话
(3)注意:如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写默认为session
(2)语法
①查看所有的系统变量:show global|[session] variables;
②查看满足条件的部分系统变量:show global|[session] variables like '%char%';
③查看指定的某个系统变量的值:select @@global|[session].系统变量名;
④为系统变量赋值:set global|[session] 系统变量名=值; set @@global|[session].系统变量名=值;
2.自定义变量
(1)定义:变量是用户自定义的,不是由系统提供
(2)类别:用户变量 ,局部变量
①用户变量作用域:只针对当前会话有效,同于会话变量作用域一样
②局部变量作用域 :仅仅只在定义它的degin end中有效,应用在degin end中且为第一句
(3)用户变量使用步骤
①声明初始值:set @用户变量名=值;或set @用户变量名:=值;或select @用户变量名:=值;
②赋值(更新用户变量的值):方法一:①中的三种方法; 方法二:通过select 字段名 into 变量名 from 表名;
③使用(查看用户变量的值):select @用户变量名;
(4)局部变量使用步骤
①声明:declare 变量名 类型;或 declare 变量名 类型 default 值;
②赋值:方式一与局部变量相同;方式二:通过select 字段名 into 局部变量名 from 表;
③使用 :select 局部变量名;
八、存储过程和函数
1.好处
(1)提高了代码的重用性
(2)简化操作
(3)减少了编译次数并且减少了和数据库服务器的链接次数提高了效率
2.存储过程
一组预先编译好的sql语句的集合,理解成批量处理语句
3.存储过程
(1)创建语法:delimiter $ create procedure 存储过程名(参数列表) begin 存储过程体 end $
(2)注意参数列表包含三部分:参数模式 参数名 参数类型
(3)参数模式:
①in:该参数可以作为输入,也就是才参数需要调用方传入
②out:该参数可以作为输出,也就是可以作为返回值
③inout:该参数既可以作为输入也可以作为输出,也就是可以传入值也可以作为返回值
(4).注意:如果存储过程体仅仅就一句语句,begin end可以省略;存储过程体中每条sql语句的结尾要求加上分号,存储过程的结尾可以使用delimiter重新定义结束标记
(5)调用语法:call存储过程名(实参列表)$;
(6)删除存储过程:drop procrdure 存储过程名,...;
(7)查看存储过程中的信息:desc 存储过程名;* show creat procedure 存储过程名
4.函数
(1)与存储过程的区别:存储过程可以有多个或者零个返回值,适合批量插入批量更新;函数有且仅有一个返回值,适合做处理数据后返回一个结果
(2)创建语法:create function 函数名(参数列表) retums 返回值类型 begin 函数体 end
(3)注意:参数列表包含两个部分: 参数名 参数类型
(4)函数体:肯定会有返回值(return返回语句),如果没有不会报错,如果return语句没有放在函数体的最后也不会报错,但不建议
(5)return 值 函数体中有且仅有一句话,则可以省略 begin end ,使用delimiter语句设置结束标记;
(6)调用语法:select 函数名(参数列表)
(7)查看函数:show create function 函数名;
(8)删除函数:drop function 函数名
九、流程控制结构
1.分类
(1)顺序结构:程序从上往下依次执行
(2)分支结构:程序从两条或多条路径中选择一条执行
(3)循环结构:程序在满足一定条件的基础上重复执行一段代码