python就业班第14天----mysql数据库的高级用法
关系资源文件原因:一个进程中最多打开1024个,在文件描述图表里记录,如果没关闭,这个位置就被占用
视图:虚拟的表
视图:sql语句太长,创建视图
创建视图:create view 视图名称(一般使用v开头) as select......
应用:
1、 select * from 视图名称
等价于 select * from 表格
,视图名称不是新建的,视图修改实际还是改的之前的表格
例: create view v_goods as select id,name,age from goods;
sql = "select name from v_goods;"
as 后面往往是 select 开头,搞个表格出来
2、
例: sql="select name from v_goods;"
要改 goods 的 name 字段,改成 “名字”,然后 sql 不变 alter table goods change name "名字" varchar(30);
然后删v_goods: drop view v_goods;
重建v_goods: create view v_goods as select id,"名字" as name,age from goods;
然后sql语句不变 sql = "select name from v_goods";
事务:
作为一个基本单元执行一系列SQL语句的操作,要么完全执行,要么完全地不执行
事务四大特性:ACID(Atomicity、Consistency、Isolation、Durability)
原子性:不可分割最小单元
一致性:
隔离性:终端1没操作完终端2没法搞
持久性:搞完永久保存到数据库
begin;
或者 start transaction;
进行修改,此时其它程序进行操作无效,会进入等待态 commit;
不想要改的结果的话进行回滚rollback,只能回滚数据,不能回滚其它
改完输入commit;
使用python对数据库操作,默认使用事务
事务解决某些事情一次性解决,不允许终端,例如银行取钱
索引:特殊文件,记录文件的地址
查看表中是否有索引: show index from 表名;
创建索引: create index 索引名称 on 表名(字段名称(长度))
删除索引: drop index 索引名称 on 表名;
索引适用于数据量很大,但更改很小的情况
二叉树:
保存账号密码的数据库: use mysql;
show tables;
Host:允许谁登录数据库,localhost表示只允许本机登录数据库,root一般是禁止登录的
User:用户
authentication_string:密码加密后的值
创建账户、授予查询权限: grand select on 表格.* to "用户@登录方式" ;
identified by "密码";
grant:单词,授予的意思
查看用户有哪些权限: show grants for 用户@登录方式;
授予所有权限:grant select,insert on 表名.* to 用户@登录方式 with grant option
刷新:flush privileges;
改密码:update user set authentication_string=password("密码") where user="用户名";
删除用户:
方法1: drop user "用户名@主机;"
方法2: drop from user where user="用户名";
设计表:三范式
一范式:列的原子性,即列不能够在分成其它几列
二范式:首先是1NF,在遵循 1、必须有主键 2、非主键字段必须完全依赖于主键,而不能只依赖主键的一部分
主键:唯一标识一行数据。例如 :订单号,买了一种商品,ok;买了两种商品,就不能唯一标识一行记录了。
主键:可以多个字段,作为一个主键;把订单号和商品号作为一个主键,ok
二范式:必须完全依赖于主键,不能依赖于主键的一个字段
主键:OrderID和ProductID共同组成,代码:primary key(OrderID,ProductID);
打X的表:ProductName完全依赖主键的一个字段ProductID,而不是主键,所以不符合二范式
设计方法:打√的,第一张表主键是OrderID和ProductID,第二张表主键是ProductID
三范式:非主键字段必须直接依赖字段,不能传递依赖,即不能存在
字段1从属主键,字段2从属字段1,所以字段2也从属主键,但是间接从属,不属于三范式
插入图jybday14-3
E-R模型:实体关系图,描述表和表之间关系
箭头上1、M表示1对多,表格1内1个数据对应表格2内多个数据,谁和谁对应
多对多:两个表数据互为1对多,两张表就是多对多
自连接:aid和pid,pid从属于aid
select * from areas as city inner join areas as province on city.pid=provice.aid where province.atitle="广东省";
上面那行搞懂了,自连接也就ok了