mariadb数据库的链接查询和表格设计

链接查询
练习准备:
--创建学生表
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

猜你喜欢

转载自www.cnblogs.com/liketimes/p/9948852.html
今日推荐