链接查询
练习准备:
--创建学生表
create table students (
id int unsigned not null auto_increment primary key,
name varchar(20) default '',
age tinyint unsigned default 0,
high decimal(5,2),
gender enum('男', '女', '中性', '保密') default '保密',
cls_id int unsigned default 0,
is_delete bit default 0
);
--创建班级表
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(20) not null
);
--往students表里插入数据
insert into students values
(0,'小明',18,180.00,2,1,0),
(0,'小月月',19,180.00,2,2,0),
(0,'彭于晏',28,185.00,1,1,0),
(0,'刘德华',58,175.00,1,2,0),
(0,'黄蓉',108,160.00,2,1,0),
(0,'凤姐',44,150.00,4,2,1),
(0,'王祖贤',52,170.00,2,1,1),
(0,'周杰伦儿',34,null,1,1,0),
(0,'程坤',44,181.00,1,2,0),
(0,'和珅',55,166.00,2,2,0),
(0,'刘亦菲',29,162.00,3,3,0),
(0,'金星',45,180.00,2,4,0),
(0,'静香',18,170.00,1,4,0),
(0,'郭静',22,167.00,2,5,0),
(0,'周杰',33,178.00,1,1,0),
(0,'钱小豪',56,178.00,1,1,0),
(0,'谢霆锋',38,175.00,1,1,0);
 
--向classes表里插入数据
insert into classes values (0, '云唯_01期'),(0, '云唯_02期');
 
-- 连接查询
-- inner join ... on
 
 -- 两个表连接查询
select * from students inner join classes    
 
 -- 查询能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id=classes.id;    
 
 -- 按照要求显示姓名,班级(省去相同的 classes-id 号)
select students.*, classes.name from students inner join classes on students.cls_id=classes.id;    
               
-- 给数据表起名字    --调用显示名字和班级
select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id;    
 
-- 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称
select students.*, classes.name from students inner join classes on students.cls_id=classes.id;
 
-- 在以上查询中将班级姓名显示在第一列
select classes.name,students.* from students inner join classes on students.cls_id=classes.id;
 
-- 查询有能够对应班级的学生以及班级信息,按照班级进行排序
select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id;
 
-- 当是同一个班级的时候,按照学生的id从小到大
select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id, students.id;
 
students表
classes表
 
--left join(以左表为基准查询) 右表有的一一对应,没有的显示null
select * from students left join classes on students.cls_id=classes.id;
 
right join (以右表为基准查询) 同左连接一样,基准表没有,对照表有的 不显示
select * from students right join classes on students.cls_id=classes.id;
 
-- 自关联
创建areas表
create table areas(
aid int primary key auto_increment,
name varchar(20),
pid int
);
添加:
--省份
insert into areas(aid,name,pid) values(1,'北京市',null);  
insert into areas(aid,name,pid) values(0,'天津市',null);  
insert into areas(aid,name,pid) values(0,'河北省',null);  
insert into areas(aid,name,pid) values(0,'山西省',null);  
 
--地级市
insert into areas(aid,name,pid) values(0,'海淀区',1);  
insert into areas(aid,name,pid) values(0,'滨海区',2);  
insert into areas(aid,name,pid) values(0,'沧州市',3);  
insert into areas(aid,name,pid) values(0,'大同市',4);
 
insert into areas(aid,name,pid) values(0,'朝阳区',1);  
insert into areas(aid,name,pid) values(0,'武清区',2);  
insert into areas(aid,name,pid) values(0,'石家庄',3);  
insert into areas(aid,name,pid) values(0,'太原市',4);
 
 
--县级市
insert into areas(aid,name,pid) values(0,'西二旗',5);  
insert into areas(aid,name,pid) values(0,'大港',6);  
insert into areas(aid,name,pid) values(0,'任丘市',7);  
insert into areas(aid,name,pid) values(0,'清徐',8);    
 
insert into areas(aid,name,pid) values(0,'中关村',5);  
insert into areas(aid,name,pid) values(0,'汉沽',6);  
insert into areas(aid,name,pid) values(0,'河间市',7);  
insert into areas(aid,name,pid) values(0,'阳曲',8);   
 
-- 查询出河北省所有市
select * from areas as p inner join areas as c on p.aid=c.pid where p.name='河北省';
 
--只显示名字
select p.name,c.name from areas as p inner join areas as c on p.aid=c.pid where p.name='河北省';
 
-- 子查询
-- 标量子查询
 
-- 查询出北京市所有区的信息        --先查询北京市的id,让后通过北京市的id查询下属
select * from areas where pid=(select aid from areas where name='北京市');
 select name from areas where pid in (select aid from areas where name='北京市');    --同上,但只显示名字
-- 这里边第一句的 “=” 和 第二句的 “in” 的作用是相同的 
 
数据库设计
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
1.1第一范式
 
 
2.1第二范式 
 
3.1第三范式
 
最终实现的目标
 
E-R模型
E-R模型的基本元素是:实体、联系和属性
E表示entry,实体:一个数据对象,描述具有相同特征的事物
R表示relationship,联系:表示一个或多个实体之间的关联关系,关系的类型包括包括一对一、一对多、多对多
属性:实体的某一特性称为属性
关系也是一种数据,需要通过一个字段存储在表中
1、实体A对实体B为1对1,则在表A或表B中创建一个字段,存储另一个表的主键值
        1对1:在哪边设置外键都可以
 
2、实体A对实体B为1对多:在表B中创建一个字段,存储表A的主键值
        1对多:在多的那边设置外键
 
3、实体A对实体B为多对多:新建一张表C,这个表只有两个字段,一个用于存储A的主键值,一个用于存储B的主键值
        多对多:再建一个表3,分别关联之前的两个表1和2,在表3设置两个外键分别指向表1和表2

最新文章

  1. RGB转YCbCr
  2. WebApi系列~QQ互联的引入(QConnectSDK)
  3. finally语句总是不会被执行?
  4. MFC学习 画图设置字体按钮风格
  5. Javascript 常用系统内置函数
  6. linux mail命令用法
  7. vs连接mysql
  8. THINKPHP之控制器
  9. kinect for windows - 环境搭建
  10. MVC应用程序显示上传的图片
  11. 如何打开USB OTG功能:
  12. JavaScript我学之八善变的this---函数执行上下文
  13. Idea使用说明
  14. dp 洛谷P1977 出租车拼车 线性dp
  15. GoldenGate使用SQLEXEC和GETVAL实现码表关联
  16. android中通过intent传递复杂数据
  17. (4)Python3笔记 之 流程控制
  18. 十 js中forEach,for in,for of循环的用法
  19. 检索 COM 类工厂中 CLSID 为 {00021A20-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005
  20. 你会使用super()吗?你确定你了解它吗?

热门文章

  1. 基于cxf的webService服务发布及客户端开发
  2. Test zram at kernel 3.10 4.12
  3. [置顶] 谷歌大牛 Jeff Dean 是如何成为互联网战神的
  4. poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)
  5. NetApp 存储的常用概念普及
  6. thinkPHP的Excel插件
  7. 【hdu 6321】Dynamic Graph Matching
  8. Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架
  9. 基于nginx的静态网页部署
  10. jquery-常用插件集合