数据库设计:建表
数据库设计三大范式:
(1)确保每一列的原子性:每一列都不可再拆分
//不符合规范
//规范
(2)确保表中的每一列都和主键相关:每一行只做一件事情,只要表中出现重复的数据,就要把表拆分开
//不规范,数据重复
订单编号 联系人 电话 地址 详细地址
1001 小波 110 北京市 北京市
1002 路人甲 112 xxxxxxx xxxxxxx
1003 小波 110 北京市 北京市
1004 小波 110 北京市 北京市
//规范
1、订单表
订单编号 联系人编号
1001 1
1002 2
1003 1
1004 1
2、用户表
联系人编号 联系人 电话 地址 详细地址
1 小波 110 北京市 北京市
2 路人甲 112 xxxxxxx xxxxxxx
(3)表中的每一列必须和主键直接相关,而不是间接相关
//不规范
学生编号 学生姓名 性别 电话 所在学校 学校地址 学校电话
1001 小波 man 110 华育
//规范
学生编号 学生姓名 性别 电话 学校编号
1001 小波 man 110 001
学校编号 学校名称 学校地址 学校电话
001 华育 北京 12345678
外键:
作用:为了保证两种数据表中的数据的一致性
要求:(1)一般给从表添加外键约束
(2)必须保证带有外键约束的字段和主表中参考的主键字段的数据类型一致
(3)外键必须参考的是另一张表中的主键字段
(4)存储引擎innodb
//mysql默认的存储引擎是myisam //创建表时添加外键
create table orders(
oid int(11) not null auto_increment primary key,
uid int(11) not null,
money decimal(11,2) not null,
orderTime datetime not null,
foreign key(uid) references users(uid)//外键订单表uid参考的是用户表的主键uid
)engine=innodb charset=utf8;
查看创建表时的Sql show create table 表名;
删除外键alter table 表名 drop foreign key 外键名;alter table orders drop foreign key orders_ibfk_1;
对已经存在的表添加外键 alter table books add foreign key(type_id) references book_type(type_id);
在删除或者更新主表记录时,从表应该如何处理相关的记录
on delete//当删除时
on update//当更新时
//允许的级联动作:
(1)cascade:关联操作,如果主表被更新或删除,从表也会执行相应的操作
(2)restrict:拒绝主表的相关操作
(3)set null:表示从表数据不指向主表任何记录
(4)no action:无动作
//删除主表的数据时,从表数据也会被删掉
alter table books add foreign key(type_id) references book_type(type_id) on delete cascade;
alter table orders add foreign key(uid) references users(uid) on delete cascade;
多表查询
1select * from dept,person;也叫笛卡尔积
2mysql> select * from dept,person where dept.id=person.bid;
3开发中一般使用等值查询
mysql> select id,bname,name,degree from person,dept where dept.id=person.bid;
注:多表查指定字段,最好用表名.字段名,如果多表中有重名字段则必须用表名.字段名
关联查询(表连接)
定义:两张及两张以上的表,把他们按照一定的条件连接起来
什么情况下使用连接查询:
在同一页面中,同一个模块中,需要来自不同表中的数据
图书Id 图书名字 图书类型
(1)内连接
//取的是两张表数据的交集,会丢失数据
//select 字段名 from 表名1 inner join 表名2 on 表1.关联字段=表2.关联字段;
select bk.id,bk.b_name,bt.type_name from books as bk inner join book_type as bt on bk.type_id=bt.type_id;
select bk.id,bk.b_name,bt.type_name from books as bk,book_type as bt where bk.type_id=bt.type_id;
(2)外连接
(1)左链接(left join):会读取左边表的全部数据,即使右表无对应数据
A left join B:A在左边作为主表,A表全部数据都会显示出来,而B表只会显示符合条件的数据,B表记录不足的地方会以Null补足
//select 字段名 from 表名1 left join 表名2 on 表1.关联字段=表2.关联字段;
select bk.id,bk.b_name,bt.type_name from books bk left join book_type bt
on bk.type_id = bt.type_id;
b)右连接(right join):会读取右边表的全部数据,若左边表无对应的数据,会以Null来补足
A right join B:B表在右边,作为主表
子查询
(什么情况下使用
(1)一般涉及到两张表及两张以上的表
(2)通过一个已知表的条件去查找另一个表的数据(必须保证两张表有一个共同的字段))
select * from score where stid =(select stid from student where name = '小雪') and coid = (select coid from course where co_name = '英语');
聚合函数,通常与group by一起使用 count();max();min();sum()求和;avg() 求平均值
查询结果中有重复的数据,只取每组中的第一条记录
Having
distinct 去重 写两个 联合去重
字符串函数,会影响mysql执行效率
截取字符串substr(string,start,length)=substring(string,start,length)
string:要截取的字符串
start:从哪个位置开始截,从1开始
length:截取多少长度
select substr(b_name,1,2) from books;
拼接字符串
select concat(1,2,3);//结果123
任意一个参数为Null,结果就为null
select concat(1,2,null);//结果null
select concat(b_name,price) from books;
select 字段名,字段名, ... (*)
from 表名 where 子句
group by子句
having子句
order by子句
limit子句
desc(asc)
执行顺序 from-on-join-where-group by-having-
Case when用法:
SELECT 字段1,
case -------------如果
when sex='1' then '男' -------------sex='1',则返回值'男'
when sex='2' then '女' -------------sex='2',则返回值'女'
else ’其他’ -------------其他的返回'其他’
end
as 别名 -------------结束
from sys_user --------整体理解: 在sys_user表中如果sex='1',则返回值'男'如果sex='2',则返回值'女' 否则返回'其他’
无限极分类(递归)表
ID name pid(父级ID)
1 理财 0
2 众筹 0
3 保险 0
4 京东下金库 1
5 票据理财 1
6 基金理财 1
7 智能硬件 2
8 流行文化 2
9 车险 3
10 健康险 3
11 意外险 3