mysql三大范式、表连接查询、mysql的函数

一、三大范式, 设计数据数据库的一个原则

    1. 对于属性(字段)必须是原子性的,不可再进行分割
      person表 (name,age,gender,tel,birthday)
    1. 对于记录的唯一性,要求记录有唯一标识,
      数据表中都要求主键,而且主键尽量不要是业务字段,单独拿个字段来做主键
      字段与主键要有直接关系,不是间接关系, 确保一张表中只能存储一种类型的数据,不能存储多种
    1. 对于字段的冗余性,要求任何字段不能由其他字段派生过来,要求字段没有冗余性
      person表 (province, abbreviation, name)
      省份的简称可以有 省份派生过来
      但是在实现开发中我们允许有适当的冗余来减少数据库操作花费的时间
      在一张表中 只能存储一种类型的数据,不能存储多种

二、表关联

  一张表中只能能存储一种类型数据
  班级 (主键,班级名称,班级人数,班级代码)
  学生 (主键,名称,学号,班级主键(外键))

外键

 当我们进行表关联的时候,我们可以通过外键约束一下

1. 创建表的时候直接添加

   Create table 表名(字段 类型,字段 类型,..., constraint [外键名称] foreign key(外键字段) references 父表(主键字段))
   create table stu(id int primary key auto_increment, name varchar(20), card_id varchar(10),clazz_id int,constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id));

2. 通过alert进行修改 (外键起名要有一个命名规则)

   Alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
   alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id);

3. 删除外键

   alter table [表名] drop foreign key [外键名称];
   alter table stu drop foreign key fk_clazz_id_id;

4. 查询外键

show create table [表名]

4. 级联操作 (级联更新,级联删除)

 1.级联更新 , 当父表主键发生变化变化的时候,从表中外键也跟着更新
     alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id) on update cascade;
 2.级联删除 ,当父表中记录被删除时候,字表外键相关的记录全部被删除
     alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id) on delete cascade; 
 3.级联更新和级联删除可以一起使用,默认情况下不带级联更新和级联删除的

三、 表连接查询

查询出表中所有的记录
select * from stu, clazz (笛卡尔积 3*3=9行记录)
添加关联条件(不使用)
select * from stu, clazz where stu.clazz_id = clazz.id
连接查询
内连接 inner join (on 是关联条件) 两张表中符合条件的交集
select * from stu inner join clazz on stu.clazz_id = clazz.id
左连接 left join 把左表中内容都列出来,右表有匹配的就匹配,没有匹配的直接为空
1. 哪张表在前面,哪张表就是左表
select * from stu left join clazz on stu.clazz_id = clazz.id

   右连接  right join 把右表内容都列出来,左表中有匹配的就匹配,没有匹配的直接为空
     `select * from stu right join clazz on stu.clazz_id = clazz.id`
     # 或者三张表,四张表
     select * from stu inner join clazz on stu.clazz_id = clazz.id inner join teacher on stu.stu_id = teacher.id left jon ...

子查询

一个查询的结果是另外一个查询的条件
select name from clazz where id in (select clazz_id from stu where name = 'zhangsan');

别名(as)

 通过as 可以给表起别名, 也可以给字段起别名
select s.name as sname, c.name as cname, c.number cnumber from stu as s inner join clazz as c on s.clazz_id = c.id;
 as 可以省略掉
select s.name sname, c.name cname, c.number cnumber from stu s inner join clazz c on s.clazz_id = c.id;

四、学生表(姓名,年龄,性别)

  create table stu2 (id int primary key auto_increment,name varchar(20),age tinyint, gender char(1));
  insert into stu2(name,age,gender) value ('wang',20,'m'),('li',19,'m'),('h',16,'m'),('h',20,'g'), ('j',19,'g'),('a',19,'g'),('q',19,'g'),('z',16,'g');

1.查询出男生有多少人,女生有多少个人

select gender, count(gender) gcount from stu2 group by gender;

2. 查询出18岁以上的男生有多少人,18岁以上的女生有多少人 (年龄大于18岁) (where 分组之前执行过滤)

select gender ,count(gender) gcount from stu2 where age > 18 group by gender;

3. 查询出18岁以上的男生,人数大于3个的性别才加入统计(having 分组出结果之后,过滤结果)

select gender ,count(gender) gcount from stu2 where age > 18 group by gender having gcount > 3;

五、mysql的函数

    1. max 最大值
      求男生的最大年龄
      select gender, max(age) mage from stu2 group by gender having gender = 'm';
    1. min 最小值
      求女生最小年龄
      select gender, min(age) mage from stu2 group by gender having gender = 'g';
    1. count 数量和
      分别求男生和女生的数量
      select gender, count(gender) gcount from stu2 group by gender;
    1. avg 平均数
      男生和女生的年龄的平均数
      select gender, avg(age) gcount from stu2 group by gender;
    1. concat 字段拼接
      全表查询,把姓名字段和年龄字段拼接输出
      select name,age,concat(name,'-','age') cc from stu2;
    1. substring 字段裁剪 substring(字段,begin,count) begin 是从1开始的
      截取姓名的字段的首字母输出
      select name ,substring(name,1,1) sub from stu2;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 一、三大范式 三大范式, 设计数据数据库的一个原则 1. 对于属性(字段)必须是原子性的,不可再进行分割 2. 对...
    李憨憨的特殊昵称阅读 208评论 0 0
  • # 外键 # 当我们进行表关联的时候,我们可以通过外键约束一下 # 1. 创建表的时候直接添加 Cre...
    独孤狗蛋儿阅读 77评论 0 0
  • # 三大范式, 设计数据数据库的一个原则 # 1. 对于属性(字段)必须是原子性的,不可再进行分割 perso...
    bf5db2a928a8阅读 163评论 0 0
  • 4、查询 1、条件语句(where) select * from person; // 整张表查询 , * 代表...
    烟波_33de阅读 228评论 0 0
  • 数据数据定义功能:提供数据定义语言(DDL)操纵功能:提供数据操纵语言(DML) 用于定义数据库的所有特性和属性,...
    少Lian郎阅读 171评论 0 0