回顾:
列属性:主键,自增长,唯一键
关系:一对一,一对多,多对多
范式:规范数据库的设计,三层范式
1NF:字段设计必须符合原子性
2NF:不存在部分依赖(没有复合主键)
3NF:不存在传递依赖(实体单独建表)
逆规范化:效率与磁盘空间的博弈
高级数据操作:
新增数据:主键冲突(更新和替换),蠕虫复制
更新操作:限制更新数量:limit
删除操作:限制删除数量:limit,清空表(truncate)
查询操作:select 选项,字段别名,数据源(单表,多表,子查询[别名]),where 子句(条件判断:从磁盘),group by子句
(分组统计,统计函数,分组排序,多字段分组,回溯统计),having 子句(判断结果,针对分组统计的结果),order by子句
(排序,多字段排序),limit 子句(限制记录数,分页)
连接查询:
连接查询:将多张表(可以大于两张)进行记录的连接(按照某个指定的条件进行数据拼接);最终结果是:记录数有可能变化
字段数一定会增加(至少两张表的合并)
连接查询的意义:在用户查询数据的时候,需要显示的数据来自多张表。
连接查询:join,使用方式:左表 join 右表
左表:在join关键字左边的表
右表:在join关键字右边的表
连接查询的分类:
SQL中将连接查询分为四类:内连接,外连接,自然连接和交叉连接
交叉连接:
交叉连接:cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配;匹配一定保留(没有条件匹配)
而连接本身字段就会增加(保留),最终形成的结果叫做:笛卡尔积。笛卡尔积本身没有意义,应该尽量避免使用,交叉连接
存在的价值在于保证连接这种结构的完整性。
基本语法:左表 cross join 右表;相当于from 左表,右表;
-- 交叉连接,my_student cross join my_class是一个数据源
select * from my_student cross join my_class
内连接:
内连接:[inner] join,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件在左表中和右表中相同
最终才会保留结果,否则不保留。
基本语法:
左表 [inner] join 右表 on 左表.字段 = 右表.字段;on表示连接条件,条件字段就是代表相同的业务含义
(如my_student.c_id和my_class.id)
-- 内连接
select * from my_student inner join my_class on my_student.c_id = my_class.id;
-- 因为c_id是唯一的可以简略表示
select * from my_student inner join my_class on c_id = my_class.id;
-- 但是id不是唯一的,简略表示会报错
select * from my_student inner join my_class on c_id = id;
但是上图中可以看到有两个name,两个id,在PHP操作的时候会发生数据被覆盖的问题。所以就需要字段别名以及表别名的
使用,在查询数据的时候,不同表有同名字段。
-- 字段和表别名
select s.*,c.name as c_name,c.room from -- 字段别名
my_student as s inner join my_class as c -- 表别名
on s.c_id = c.id;
内连接可以没有连接条件:没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)
内连接可以使用where代替on关键字,where关键字没有on效率高。因为where关键字是匹配所有,但是on关键字是匹配成功的。
外连接:
外连接:outer join,以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件都会保留,
能匹配正确保留,不能匹配,其他表的字段都置空NULL。
外连接分为两种:是以某种表为主:有主表
left join:左外连接(左连接),以左表为主表
right join:右外连接(右连接),以右表为主表
基本语法:左表 left/right join 右表 on 左表.字段 = 右表.字段;
左连接:
-- 左连接
select s.*,c.name as c_name,c.room from
my_student as s left join my_class as c
on s.c_id = c.id;
-- 右连接
select s.*,c.name as c_name,c.room from
my_student as s right join my_class as c
on s.c_id = c.id;
虽然左连接和右连接有主表差异,但是显示的结果,左表的数据在左边,右表的数据在右边。左连接和右连接可以
互相转换,只需要将两种表的位置对调即可。
-- 右连接
select s.*,c.name as c_name,c.room from
my_student as s right join my_class as c
on s.c_id = c.id;
select s.*,c.name as c_name,c.room from
my_class as c left join my_student as s
on s.c_id = c.id;
自然连接:
自然连接:natural join,自然连接就是自动匹配连接条件:系统以字段名字作为匹配模式(同字段就作为条件,多个同名字段
都作为条件)
自然连接的分类:自然内连接和自然外连接
自然内连接:左表 natural 右表;
-- 自然内连接
select * from my_student natural join my_class;
自然外连接:左表 natural left/right join 右表;
-- 自然左外连接
select * from my_student natural left join my_class;
其实:内连接和外连接都可以模拟自然连接:使用同名字段合并字段
左表 left/right/inner join 右表 using(字段名); -- 使用同名字段作为条件
-- 自然左外连接
select * from my_student natural left join my_class;
-- 外连接模拟自然外连接:using
select * from my_student left join my_class using(id);
PHP操作mysql:
事实上:PHP本身不可以操作Mysql,但是PHP有扩展可以实现操作mysql:PHP借助扩展来实现操作mysql。
PHP操作mysql的扩展还挺多:mysql,mysqli,PDO扩展。
mysql扩展:纯面向过程,里面全是函数,加载扩展后可以调用函数。(当前只能使用面向过程)
mysqli扩展:面下过程+面向对象,里面有函数也有类,加载扩展后可以选择调用函数或者调用类操作。
PDO:纯面向对象,只有类,加载后只可以调用类。
mysql扩展在搭建服务器的时候就已经加载开启,不再进行扩展加载。