2021-06-28数据库

目录

一  、数据库应用

        1.概念

                    1.    是什么是数据库

                      2.  关系模型,非关系模型

                       3.检查 

                        4.结构

        2.sql语言

1.定义

 2.分类

3.数据库的操作             

查询

新增 ,后面是增加默认编码是 utf8

删除       

使用指定数据库

4.表的操作

查看所有表

创建表

创建表时字段约束

例创建学生表

删除表

查看表结构

添加字段

五 表里数据的操作

新增 

错误  Incorrect string value: '\xB6\xAB' for column 'addr' at row 1

删除

修改

查询

 查询所有

查询某个字段

过滤where

模糊查询

去重 distinct

null 查询

范围查询between and 包含左右

分页查询 limit limit下标从零开始

排序

常用的聚合函数 count(1)比count(*)高效

分组查询 group by

常用函数

全转小写 lower

全转大写 upper 

字符串长度 length

截取字符串  substr

拼接字符串   concat

替换字符串     replace 

替换空值 if null

小数操作

round四舍五入

ceil 向上取整

floor 向下取整

时间函数

now()

year()

month()

多表联查

笛卡尔积

连接查询

子查询

事务

定义

事务的四个特性 

事务的安全隔离级别

视图

优点

缺点 

创建视图

查询视图

索引

优点

缺点

索引分类

查看索引

删除索引

查看索引是否使用explain

索引失效

数据库的三范式

第一范式

第二范式

第三范式

什么是脏读,幻读,不可重复读


一  、数据库应用

        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再次查询记录总数,发现两次查询的结果不一致,平白无故的多了几条记录,这种现象称为幻读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᥬ᭄?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值