目录
错误 Incorrect string value: '\xB6\xAB' for column 'addr' at row 1
一 、数据库应用
1.概念
1. 是什么是数据库
存储数据管理数据的仓库 分为两类 关系型数据库,非关系型数据库
2. 关系模型,非关系模型
一路 next 注意几个地方 端口号默认3306 字符集改成utf-8
3.检查
方式一 win+r 输入 mysql -uroot -p 回车输入密码
方式二 从开始菜单进入直接输入密码
4.结构
数据库--表--字段的名字--字段的值
2.sql语言
1.定义
是结构化查询语言 用来操作数据库 对库里的数据进行增删改查 crud
2.分类
DML 数据库操纵语言 对数据进行操作CRUD
DDL 数据库定义语言 创建库 创建表
DCL 数据库控制语言
DQL 数据库查询语言
3.数据库的操作
查询
show databases;
新增 ,后面是增加默认编码是 utf8
create database 库名 DEFAULT CHARACTER SET utf8;
删除
drop database 库名;
使用指定数据库
use 库名;
4.表的操作
查看所有表
show tables;
创建表
create table 表名(字段名 字段类型 (字段长度),字段2,字段3);
创建表时字段约束
primary key #主键
auto_increment #字段自增
not null #字段内属性值不为空
unique #属性值唯一
default #属性默认值 常用于null值
check #检查 字段值是否符合要求 低版本可能会失效
forgrein key(本表字段名) references 表名(字段名) 删除时先删除子表再删除主表
例创建学生表
mysql> create table stu(
-> id int(12),
-> name varchar(10),
-> age int(3)
-> );
删除表
drop table 表名;
查看表结构
desc 表名;
添加字段
alter table tb_door add column addr varchar(100);
alter table 表名 add column 字段名 字段类型;
五 表里数据的操作
新增
insert into 表名values(字段一的值,2,3,4);
错误 Incorrect string value: '\xB6\xAB' for column 'addr' at row 1
原因 编码问题 改成 gbk即可
删除
删除表中所有数据
delete from 表名;
修改
update 表名 set 字段名 =字段的值;
查询
查询所有
select * from 表名;
查询某个字段
select 字段名1,字段名2 from 表名;
过滤where
适用于分组之前进行过滤,相较于having高效
注意 where里面不可以出现聚合函数
模糊查询
#查询以a开头的姓名
select name from emp where name like "a%";
#查询包含a的姓名
select name from emp where name like "%a%";
#查询以a结尾的姓名
select name from emp where name like "%a";
#查询第二个字母是a的姓名
select name from emp where name like "_a%";
去重 distinct
select distinct name from emp;
null 查询
#员工表中查询工资为空的员工信息
select * from emp where sal is null;
select * from emp where isnull(sal);
#查询员工表功姓名不为空的员工信息
select * from emp where sal is not null(sal)
范围查询between and 包含左右
#查询工资在5000-10000的员工信息
select * from emp where sal between 5000 and 10000;
分页查询 limit limit下标从零开始
#查询员工表前两条数据
select * from emp limit 2;
#查询员工表从第二行开始输出两条数据
select * from emp limit 1,2;
排序
#查询员工信息按照年龄升序排序
select * from emp order by age;
#查询员工信息 按照年龄降序
select * from emp order by age desc;
常用的聚合函数 count(1)比count(*)高效
#计数 查询有多少员工
select count(1) from emp;
#求和 查询所有员工每个月的工资总和
select sum(sal) from emp;
#平均值 查询员工平均年领
select avg(age) from emp;
#最大值 查询年龄最大的员工
select max(age) from emp;
#最小值 查询员工的最小值
select min(age) from emp;
分组查询 group by
#查询每个部门有多少人
select count(1) from emp group by emptno;
#查询部门人数大于一的部门
#select count(1) from emp group by emptno having count(1)>1;
常用函数
全转小写 lower
全转大写 upper
字符串长度 length
截取字符串 substr
拼接字符串 concat
替换字符串 replace
替换空值 if null
小数操作
round四舍五入
ceil 向上取整
floor 向下取整
#全转大写
select upper("asa");
#全转小写
select lower("GH");
#获取字符串长度
select length("asdas");
#截取字符串
select substr("asadd",2);#截取第二个到最后的字符串
select substr("asfsa",1.3);#从第二个开始 截取四个
select substr("asdasd",from 1 for 3) #截取一到三 包含左右
#替换字符串
select replace("asdsa",a,qw);
#null处理
#查询员工每个月的工资
select sal+ifnull(comm,0) from emp;
#round 四舍五入
select rount(3.14);#3
#ceil 向上取整
select ceil(3.14)#4
#floor 向下取整
select floor(3.14) #3
时间函数
now()
year()
month()
select now() #获取当前时间
select year(now()) #获取当前年
select month(now())#获取月
select day(now()) #获取日
多表联查
笛卡尔积
连接查询
1.内连接 inner join on 取两个表公共部分
2.左连接left join on 取左边全部 右表符合要求的 不符合的null填充
3.右连接right join on 取右表全部 左表符合的数据 不符合的null填充
子查询
#笛卡尔积
select * from emp ,dept where emp.deptno=dept.deptno;
内连接
select * from emp inner join dept on emp.deptno=dept.deptno;
#左连接
select * from emp left join dept on emp.deptno=dept.deptno;
#右连接
select * from dept rigth join emp on emp.deptno=dept.deptno;
#子查询
select * from dept where deptno in(select deptno from emp where deptno=1);#子查询多条数据使用in,一条数据使用=
select * from dept where deptno =(select deptno from emp where deptno=1);
事务
定义
单个或多个sql语句当做一个整体,要么全部执行,要么全部不执行
事务的四个特性
1.原子性 :事务要么全部执行成功,或者全部执行失败 如果中间某个sql语句执行失败 事务会回滚到执行之前的状态
2.一致性:事务执行前后要保证数据库的一致性,确保数据符合要求,确保数据保持一致
3.隔离性 :数据库支持并发操作,各个事务执行期间相互独立,不相互影响
4.永久性:事务一旦执行成功对数据库的修改是永久性的。
事务的安全隔离级别
1.读未提交 效率最高,但是安全性最低
2.读已提交 oracl默认安全级别
3.可重复读 mysql默认安全级别
4.串行化 表级锁 最安全但是效率低
begain 开始事务
sql语句
commit 提交事务 / rollback回滚事务
事务代码示例
begain
select * from emp;
insert into emp values(1,"张三",1);
commit;#提交事务
视图
优点
方便查询
缺点
效率差,修改限制
创建视图
create view A as(
select * from emp
);
查询视图
select * from A;
索引
优点
提高查询效率
缺点
索引本身是一张表,如果体积较大,会占用较大内存
索引分类
单值索引 给某一个字段加索引
复合索引 给多个字段加索引
唯一索引 给某一个字段添加索引,索引要求 字段必须唯一
#创建单值索引
create index 索引名字 on 表名(字段名);
#创建复合索引
alter table 表名 add index 索引名字(字段名,字段名);
#创建唯一索引
alter table 表名 add unique 索引名字(字段名);
查看索引
show index from 表名;
删除索引
alter table 表名 drop index 索引名字;
查看索引是否使用explain
explain
select * from 表名;
索引失效
1.模糊查询 但是查询以什么开头不会失效
2.查询中包含or
3.使用复合索引时 不符合最左原则
4.全字段加上索引 可能会失效
数据库的三范式
第一范式
第一范式数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;
第二范式
第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;
第三范式
第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键);
什么是脏读,幻读,不可重复读
脏读
脏读指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。
具体的说,一个数据原本是干净的,但是事务B将它进行修改使得其不再干净,此时事务A读取到事务B修改后的数据,也就是脏数据,称为脏读,后来事务B由于良心发现又将数据回滚为最初的样子,而事务A不知道事务B进行了回滚操作,最终事务A读取到的是脏数据,称为脏读。
结论:读取未提交的数据!
不可重复读
不可重复读指在数据库访问时,一个事务在前后两次相同的访问中却读到了不同的数据内容。
比如说事务A的执行周期较长,事务A在第一次读取某个数据时,此数据的值为100,读取完成后,事务A又去执行其他的事情,在这个过程中,事务B将这个数据的值修改为200,然后事务A做完其他的事情后,又来读取这个数据的值,发现这个值和第一次所读取的值不相同,这种现象称为不可重复读。
结论:前后多次读取,数据内容不一致!
幻读
幻读指的是事务A在查询完记录总数后,事务B执行了新增数据的操作,事务A再次查询记录总数,发现两次查询的结果不一致,平白无故的多了几条记录,这种现象称为幻读。