mariadb数据库的链接查询和表格设计
2024-08-31 13:47:35
链接查询
练习准备:
--创建学生表
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
最新文章
- RGB转YCbCr
- WebApi系列~QQ互联的引入(QConnectSDK)
- finally语句总是不会被执行?
- MFC学习 画图设置字体按钮风格
- Javascript 常用系统内置函数
- linux mail命令用法
- vs连接mysql
- THINKPHP之控制器
- kinect for windows - 环境搭建
- MVC应用程序显示上传的图片
- 如何打开USB OTG功能:
- JavaScript我学之八善变的this---函数执行上下文
- Idea使用说明
- dp 洛谷P1977 出租车拼车 线性dp
- GoldenGate使用SQLEXEC和GETVAL实现码表关联
- android中通过intent传递复杂数据
- (4)Python3笔记 之 流程控制
- 十 js中forEach,for in,for of循环的用法
- 检索 COM 类工厂中 CLSID 为 {00021A20-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005
- 你会使用super()吗?你确定你了解它吗?
热门文章
- 基于cxf的webService服务发布及客户端开发
- Test zram at kernel 3.10 4.12
- [置顶]
 谷歌大牛 Jeff Dean 是如何成为互联网战神的
- poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)
- NetApp 存储的常用概念普及
- thinkPHP的Excel插件
- 【hdu 6321】Dynamic Graph Matching
- Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架
- 基于nginx的静态网页部署
- jquery-常用插件集合