复杂操作

数据库设计:建表

数据库设计三大范式:

(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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,442评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,604评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,576评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,652评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,495评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,370评论 1 274
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,792评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,435评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,735评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,777评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,553评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,399评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,806评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,038评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,330评论 1 253
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,766评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,964评论 2 337

推荐阅读更多精彩内容

  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,796评论 0 10
  • //文章表 文章标题(title)、文章内容(content)、文章点击量(hits)、文章评论量(coms) c...
    红颜心雨阅读 360评论 0 0
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,220评论 0 7
  • 睡过午觉后,一边在跑步机上跑步一边看《爱情保卫战》。看到最近的一期标题是,女生变身公主渣男求复合。男女主角的情感矛...
    小丸子ariel阅读 2,119评论 3 6
  • 域名各个状态说明: 以client开头的状态表示由客户端(注册商)可以增加的状态; 以server开头的状态表示服...
    陈旭华阅读 432评论 0 0