42 外键 数据行的操作

外键;

create table department (
id int auto_increment primary key,
depart_name varchar(32) not null default ‘‘
)engine=Innodb charset=utf8;

nsert into department (depart_name) values (‘公关‘), (‘关关‘),(‘关公‘);

create table userinfo (
id int auto_increment primary key,
name varchar(32) not null default ‘‘,
epart_id int not null default 1,

# constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)),
constraint fk_userinfo_depart foreign key (depart_id) references department(id)
)engine=Innodb charset=utf8;

insert into userinfo (name, depart_id) values (‘root1‘, 1);
作用;
1.约束
2.节省空间

注意;
1.不能将创建外键的语句单独拿出来
(新增字段)
alter table userinfo add constraint(约束) fk_userinfo_depart foreign key (depart_id) references department(id);
删除外键
alter table usertable drop foreign key 外键名称(fk_userinfo_depart);

2.外键关联的时候,必须关联的是表的主键ID
3.练习的时候, 将语句写在文本中, 然后考过去执行
4.主键索引;
1.加速查找
2.不能为空
3.不能重复

外键变种;(重点)

1.唯一索引;
作用;
1.unique列的值不能为重复,
2.加速查找
create table t1 (
id int ,
num int ,
unique(num)
)engine=Innodb charset=utf8;

联合唯一索引;
create table t2 (
id int ,
num int ,
unipue(id,num)
)engine=Innodb charset=utf8;

2. 一对多:
一对多或称为多对一
三张表:出版社,作者信息,书

一对多(或多对一):一个出版社可以出版多本书

关联方式:foreign key

部门表:
id depart_name
1 公关部
2 公共部
3 保安部

员工表:
id name age depart_id(外键)
1 lxxx 12 2
2 xxxx 13 1
3 xxxx 13 2

3. 一对一:
两张表:学生表和客户表

一对一:一个学生是一个客户,一个客户有可能变成一个学校,即一对一的关系

关联方式:foreign key+unique

用户表:
id name age
1 zekai 23
2 eagon 34
3 lxxx 45
4 owen 83

博客表:
id url user_id (外键 + 唯一约束)
1 /linhaifeng 2
2 /zekai 1
3 /lxxx 3
4 /lxxx 4

4.多对多:
三张表:出版社,作者信息,书

多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
   关联方式:foreign key+一张新的表

用户表:
id name phone
1 root1 1234
2 root2 1235
3 root3 1236
4 root4 1237
5 root5 1238
6 root6 1239
7 root7 1240
8 root8 1241

主机表:

id hostname
1 c1.com
2 c2.com
3 c3.com
4 c4.com
5 c5.com

为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:
user2host:

id userid hostid
1 1 1
2 1 2
3 1 3
4 2 4
5 2 5
6 3 2
7 3 4
创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)

Django orm 也会设计

二.数据行的操作;
增;
insert into 表名 (列1,列2) values(值1,值2);
insert into 表名 (列1,列2) values(值1, 值2),(值1,值2),(值n,值n);
inster into 表名 (列1,列2) select 列1,列2 from 表名;

删除;
delete from 表名;
delete from 表名 where id >10;
delete from 表名 where id < 10
delete from 表名 where id <= 10
delete from 表名 where id >= 10
delete from 表名 where id != 10
delete from 表名 where id = 10 and name=‘xxx‘; and : 并且 两个条件都必须要成立
delete from 表名 where id = 10 or name=‘xxx‘; or : 或者 只要满足一个条件成立

修改;
update 表名 set name=‘qe‘,age=12 where id >10;
查询;
基本;
select * from 表名;
select name,age from 表名;
高级:

a. where 条件查询:
select * from 表名 where id=10;
select * from 表名 where id >10 and id<15;
select * from 表名 where id > 10;
!= : 不等与
>= <=

between and: 闭区间
select * from t4 where id between 9 and 12;

in: 在某一个集合中
select * from t4 where id in (9,10,11....);

select * from t4 where id in (select id from t3 where id between 2 and 4)

是可以这样使用的, 但是不建议大家使用;

b.通配符;
select * from 表 where name like ‘aa%‘ :以aa开头的所有(匹配多个字符串)
select * from 表 where name like ‘aa_‘ :以aa开头的所有(匹配一个字符串)

c.限制取一条;
select * from 表名 limit; 索引偏移量,取出多少条

select * from t3 limit 0, 10; 第一页
select * from t3 limit 10, 10; 第二页
page = input(‘page:‘)

page 索引偏移量 数据量(offset)
1 0 10
2 10 10
3 20 10
4 30 10

page (page-1)*offset offset

分页核心SQL:

select * from t3 limit (page-1)*offset, offset;
d.排序
用 order by
降序;
select * from t4 order by 列名 desc;descending
升序:
select * from t4 order by 列名 asc; ascending

多列:

create table t7(

id int auto_increment primary key,
num int not null default 0,
age int not null default 0
)charset=utf8;

insert into t7 (num, age) values (2, 12),(3,13),(4, 12);

select * from t4 order by num desc, name asc;

如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.

e.分组

select age 聚合函数(count(num)/sum(num)/max(num)/min(num)/agv(num)) from 表名 group by 列名;

select age, avg(num) from t7 group by age;

select age, count(num) from t7 group by age;

select age, count(num) as cnt from t7 group by age; 显示别名 as

having的二次筛选;
select age,count(num) as cnt from t7 group by age having cnt >2;

where 和 having的区别:
1). having与where类似,可筛选数据
2). where针对表中的列发挥作用,查询数据
3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用

f. 连表操作
select * from userinfo, department; (笛卡尔积)

select * from userinfo, department where userinfo.depart_id=department.id;

左连接:

select * from userinfo left join department on userinfo.depart_id=department.id;
左边的表全部显示, 右边没有用到不显示

右连接:

select * from userinfo right join department on userinfo.depart_id=department.id;
右边的表全部显示, 左边没关联的用null表示

内连接:
左右两边的数据都会显示

ps:
a.只需要记住左连接 left join

b.可以连接多张表 通过某一个特定的条件

注意查询的顺序:
elect name,sum(score) from 表 where id > 10 group by score having age> 12 order by age desc limit 2, 10

原文地址:https://www.cnblogs.com/komorebi/p/11025499.html

时间: 2024-10-24 00:50:17

42 外键 数据行的操作的相关文章

基于MVC+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却显得比较难以实现,找了很多资料,基本上没有找到对应的解决方案.本文主要介绍我对这种外键字段转义的操作的实现方式,以便供大家参考了解. 1.DataGrid的初始化操作 在了解对内容的解析前,我们先来了解EasyUI里面Datagrid的初始化操作过程,然后逐步进行分析,寻求解决方式. 一般情况下,D

基于MVC4+EasyUI的Web开发框架经验总结(9)--在Datagrid里面实现外键字段的转义操作

我们在使用EasyUI的时候,很多情况下需要使用到表格控件datagrid,这个控件控件非常强大,使用起来很简洁,但是我在使用中,发现对于一个表里面的外键字段进行转义,并显示引用表的一些名称的操作,却显得比较难以实现,找了很多资料,基本上没有找到对应的解决方案.本文主要介绍我对这种外键字段转义的操作的实现方式,以便供大家参考了解. 1.DataGrid的初始化操作 在了解对内容的解析前,我们先来了解EasyUI里面Datagrid的初始化操作过程,然后逐步进行分析,寻求解决方式. 一般情况下,D

实体外键约束、级联操作

[实体关系]1.一对多:在多的表,增加一个字段,用于只想该实体所悟的另外的实体的标识.2.多对多:利用一个中间表,表示实体之间的对应关系.(中间表和实体表是一对多关系) [外键约束]foreign key (class_id) references tb_class (class_id); drop table if exists tb_class; create table tb_class( class_id int primary key auto_increment, class_nam

MYSQL外键约束的参照操作

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松.这里以MySQL为例,总结一下3种外键约束方式的区别和联系. 这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组. 首先创建用户组表: 创建用户组表 create table t_group ( id int not null, name varcha

设置mysql数据表列自动递增以及数据行插入操作

创建mysql数据表,设置id列递增.主键create table running_log ( id int primary key auto_increment, routename varchar(255), log varchar(255), time datetime ); 往有递增数据列的数据表插入新的数据行 1.INSERT INTO `running_log` (`id`, `routename`, `log`, `time`) VALUES ('null', 'yunnan-10

字段和字段的参数,查询的13个方法,但标的双下划线外键和多对多操作

字段 常用字段  AutoField() 自增列,必须填入参数 primary_key=True则成为数据库的主键.无该字段时,django自动创建 一个model不能有两个AutoField字段. IntegerField() 一个整数类型.数值的范围是 -2147483648 ~ 2147483647. BooleanField() 布尔值类型 CharField() 字符类型,必须提供max_length参数.max_length表示字符的长度. TextField() 文本类型 Date

列表页回调,获取外键数据

第一步: var userids = entityPairs.Select(p => p.Item1.OwnerId).ToList(); var userMapping = (context.Set<User>() .Where(u => userids.Contains(u.Id)) .Select(u => new { id = u.Id, username = u.Username, nickname = u.Nickname, }).ToDictionary(u =

python42 1.外键的变种 2.数据表操作

昨日回顾: 一. 数据库的介绍   管理数据的软件 二. 数据库的 分类:   a.关系型数据库    有约束   b.非关系型数据库    没有约束     三. MySQl 的安装:   a. exe msi文件 点击下一步下一步      b. 压缩包     bin      mysqld : 启动mysql服务的     mysql  : 连接mysql    环境变量 四. 数据库(文件夹)   数据表 (文件)    数据行(文件行)  五. 数据库:   增:    create

数据库主键和外键

1 什么是主键 外键 学生表(学号,姓名,性别,班级)   学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的