MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作):
a.创建2张表
create table userinfo(nid int not null auto_increment primary key,
name varchar(10),
age int,
part_nid int
)engine=innodb default charset=utf8; create table part(
nid int not null auto_increment primary key,
caption varchar(20)
)engine=innodb default charset=utf8; 添加一些数据,创建一个中间表约束part_nid和part表,这就是外键
mysql> select * from userinfo;
+-----+------+------+----------+
| nid | name | age | part_nid |
+-----+------+------+----------+
| 1 | h | 19 | 2 |
| 2 | hh | 19 | 2 |
| 3 | hhh | 19 | 2 |
+-----+------+------+----------+
3 rows in set (0.00 sec) mysql> alter table userinfo add constraint fk_u_p foreign key userinfo(part_nid) references part(nid);
Query OK, 3 rows affected (0.88 sec)
Records: 3 Duplicates: 0 Warnings: 0 然后我们在进行数据的插入,这时候由于约束条件的存在,所以我们就无法进行插入part_nid为100的数据
mysql> insert into userinfo(name,age,part_nid) values('b',19,100);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`userinfo`, CONSTRAINT `fk_u_p` FOREIGN KEY (`part_nid`) REFERENCES `part` (`nid`))
mysql> b.外键foreign key ,一对多(在创建表之前就知道有关联的列和表)
总结:
2张表的建立约束
--约束
c.修改表(列的增删查改)
添加列:alter table 表名 add 列名 类型;
删除列:alter table 表名 drop column 列名;
修改列:
alter table 表名 modify column 列名 类型;--类型
alter table 表名 change 原列名 新列名 类型;--列名,类型
添加主键:
alter table 表名 add primary key(列名);
删除主键:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int,drop primary key;
添加外键:
alter table 从表 add constraint 外键名字(形如:fk_从表_主表) foreign key 从表(外键字段)references 主表(主键字段);
删除外键:
alter table 表名 drop foreign key 外键名称;
d.基本的数据类型:数值,时间和字符串
数值:
bit 二进制
tinyint
smallint
int
bigint
--范围不一样 decimal:十进制小数,精确的
FLOAT
DOUBLE 字符串:
char(定长)
create table tb13(n char(7))
不管怎样都要占用7个字符的空间,查找速度快,浪费内存空间
varchar(变长)
varchar是最大占用7个字符的空间,查找速度慢,节省空间
text
mediumtext
longtext
二进制数据:
TineyBlob Blob MediumBlob LongBlob
#上传文件
#强制二进制文件
#将上传的文件保存在硬盘
时间:
DATE: YYYY--MM--DD
TIME: HH:MM:SS
YEAR: YYYY
DATETIME: YYYY--MM--DD HH:MM:SS
TIMESTAMP: YYYMMDD HHMMSS enum:
表级别的操作*****
select * from tb1;
#增
insert into biao2(name,age) values('bob',234);#可以插一条数据,
insert into biao2(name,age) values('lizebo',26),('eric',30);#可以插多条
insert into biao1(name,age) select name,age form biao2;#可以把另外一个表中的内容插入到这个表中
#删
delete from biao2;#全清空
delete from biao2 where id=1 and name='alex';#按条件删除
#查
select * from 表;#查看表的全部内容,select *这种操作效率比较低,最好的方式就是写一遍,效率高。
select * from 表 where id>1;#按条件查询
select nid,name,gender as gg from 表 where id>1;
#改(跟新)
update 表 set name='alex' where id>1;#跟新设置某项内容 #其他
a.条件
select * from 表 where id>1 and name != 'alizbeo' and nid=12;
select * from 表 where id between 5 and 16;#在...之间的数据
select * from 表 where id in (11,22,33);#是否在这个元组中
select * from 表 where id not in (22,33,44);
select * from 表 where id in (select * from biao2);
b.通配符(模糊搜索)
select * from 表 where name like 'alex%';#alex开头的所有(多个字符串)
select * from 表 where name like 'ale_';#_表示ale开头的所有(一个字符)
c.分页
select * from 表 limit 5;#前5行
select * from 表 limit 0,4;#从0行开始取4行
select * from 表 limit 4 offset 0;#从0开始取4行,这个比较常用
d.排序
select * from 表 order by 列 asc;#根据‘列’从小到大排序
select * from 表 order by 列 desc;#根据‘列’从大到小排序
select * from 表 order by 列1 desc,列2 asc;#根据‘列1’从小打到排序,如果相同则按列2从小到大排序
e.分组(重要)
select num form 表 group by num;
select num,nid from 表 group by num,nid;
select num,nid from 表 where nid>10 group by num,nid order nid desc;
select num,nid ,conut(*),sum(score),max(score),min(score) form 表 group by num,nid; 当我们对聚合条件进行查询时候,我们需要使用having
select num from 表 group by num having max(id)>10;
特别的:group by 必须在where 之后,order by之前
列子:我们有这样的一个userinfo表:
mysql> select * from userinfo;
+-----+--------+------+----------+
| nid | name | age | part_nid |
+-----+--------+------+----------+
| 1 | h | 19 | 2 |
| 2 | hh | 19 | 2 |
| 3 | hhh | 19 | 2 |
| 4 | eirc | 23 | 1 |
| 5 | lizebo | 23 | 1 |
| 6 | bobli | 24 | 1 |
| 7 | jim | 21 | 3 |
| 8 | jams | 22 | 3 |
+-----+--------+------+----------+
我们需要进行分组查询,
mysql> select part_nid, min(nid),max(nid),count(nid) from userinfo group by part_nid;
+----------+----------+----------+------------+
| part_nid | min(nid) | max(nid) | count(nid) |
+----------+----------+----------+------------+
| 1 | 4 | 6 | 3 |
| 2 | 1 | 3 | 3 |
| 3 | 7 | 8 | 2 |
+----------+----------+----------+------------+
3 rows in set (0.00 sec)
这里的part_nid就是把相同的nid分成了3类,1,2,3类
min(nid)==最小的nid,max(nid)==最大的nid,count(nid)==总数nid
f.联合
组合,自动处理组合
select nid from 表 union select nid from 表2;#这是去重数据的
select nid from 表 union all select nid from 表2;#这是去重的
g.连表操作
第一种连表操作:
如果有一张userinfo和part表,并且这2张表式通过外键关联的,我们要查询这2张表中所有数据
mysql> select * from userinfo;
+-----+--------+------+----------+
| nid | name | age | part_nid |
+-----+--------+------+----------+
| 1 | h | 19 | 2 |
| 2 | hh | 19 | 2 |
| 3 | hhh | 19 | 2 |
| 4 | eirc | 23 | 1 |
| 5 | lizebo | 23 | 1 |
| 6 | bobli | 24 | 1 |
| 7 | jim | 21 | 3 |
| 8 | jams | 22 | 3 |
+-----+--------+------+----------+
8 rows in set (0.00 sec) mysql> select * from part;
+-----+---------+
| nid | caption |
+-----+---------+
| 1 | IT |
| 2 | TI |
| 3 | SA |
| 4 | DEV |
+-----+---------+
4 rows in set (0.00 sec)
如果我们这样查询连表会产生笛卡儿积,表1中的每条数据都会到表2中进行查询4次。
mysql> select name,age,part_nid from userinfo,part;
+--------+------+----------+
| name | age | part_nid |
+--------+------+----------+
| h | 19 | 2 |
| h | 19 | 2 |
| h | 19 | 2 |
| h | 19 | 2 |
| hh | 19 | 2 |
| hh | 19 | 2 |
| hh | 19 | 2 |
| hh | 19 | 2 |
| hhh | 19 | 2 |
| hhh | 19 | 2 |
| hhh | 19 | 2 |
| hhh | 19 | 2 |
| eirc | 23 | 1 |
| eirc | 23 | 1 |
| eirc | 23 | 1 |
| eirc | 23 | 1 |
| lizebo | 23 | 1 |
| lizebo | 23 | 1 |
| lizebo | 23 | 1 |
| lizebo | 23 | 1 |
| bobli | 24 | 1 |
| bobli | 24 | 1 |
| bobli | 24 | 1 |
| bobli | 24 | 1 |
| jim | 21 | 3 |
| jim | 21 | 3 |
| jim | 21 | 3 |
| jim | 21 | 3 |
| jams | 22 | 3 |
| jams | 22 | 3 |
| jams | 22 | 3 |
| jams | 22 | 3 |
+--------+------+----------+
32 rows in set (0.00 sec)
消除笛卡儿积:
第一种方式:
mysql> select name,age,part_nid from userinfo,part where userinfo.part_nid=part.nid;
+--------+------+----------+
| name | age | part_nid |
+--------+------+----------+
| h | 19 | 2 |
| hh | 19 | 2 |
| hhh | 19 | 2 |
| eirc | 23 | 1 |
| lizebo | 23 | 1 |
| bobli | 24 | 1 |
| jim | 21 | 3 |
| jams | 22 | 3 |
+--------+------+----------+
8 rows in set (0.06 sec)
其实就是按关联条件查询!
第二种方式:
mysql> select * from userinfo left join part on userinfo.part_nid=part.nid;
+-----+--------+------+----------+------+---------+
| nid | name | age | part_nid | nid | caption |
+-----+--------+------+----------+------+---------+
| 4 | eirc | 23 | 1 | 1 | IT |
| 5 | lizebo | 23 | 1 | 1 | IT |
| 6 | bobli | 24 | 1 | 1 | IT |
| 1 | h | 19 | 2 | 2 | TI |
| 2 | hh | 19 | 2 | 2 | TI |
| 3 | hhh | 19 | 2 | 2 | TI |
| 7 | jim | 21 | 3 | 3 | SA |
| 8 | jams | 22 | 3 | 3 | SA |
+-----+--------+------+----------+------+---------+
8 rows in set (0.00 sec)
可以用inner join on其实对left join on进行了一个null的过滤。
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)的更多相关文章
- 数据库主键跟外键+修改mysql的密码
update myspl.user set password=PASSWORD(设置的密码) where user='root'; 如果修改错误:先执行use mysple;再重复上面的代码. 一. ...
- MySQL数据库--外键约束及外键使用
什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...
- 第二百八十节,MySQL数据库-外键链表之一对多,多对多
MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...
- MySQL中MyISAM与InnoDB区别及选择,mysql添加外键
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- mysql:外键
mysql:外键 转自:https://www.cnblogs.com/brucemengbm/p/6897410.html 一个班级的学生个人信息表: 什么是外键 在设计的时候,就给表1加入一个外键 ...
- MySQL定义外键的方法
MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的 ...
- mysql添加外键约束变为索引
今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter table table_name1 engine=inno ...
- mysql添加外键无法成功的原因
最近很忙,碰到很多问题都忘了发上来做个记录,现在又忘了,FUCK,现在碰到一个问题, 就是mysql添加外键总是无法成功,我什么都试了,就是没注意signed和unsigned,FUCK,因为我用my ...
- mysql的外键知识
外键的作用 1.用来约束两张表中的字段 2.外键也可以用来实现一对多 我们先举一个这样的例子,让大家对外键有一个基本的认识 当前我们有一个需求就是,需要创建一张表,这张表要包括“姓名”,“年龄”,“工 ...
随机推荐
- 谈谈你对web标注和W3c的理解和认识
web标准简单来说可以分为结构.表现和行为.其中结构主要是有HTML标签组成.表现即指css样式表,通过css可以是页面的结构标签更具美感.行为是指页面和用户具有一定的交互,同时页面结构或者表现发生变 ...
- Fastify 系列教程三 (验证、序列化和生命周期)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) 验证 Fast ...
- JavaWeb之Eclipse中使用Maven构建SpringMVC项目
为了学习spring和maven我这也是拼了老命了,光使用maven配置springmvc我花了上周一周的时间,下班回来就搞,一直有bug,一个bug接着一个,昨天一整天都在解决配置的问题,让大学同学 ...
- 老生常谈:关于undo表空间的使用率
就在前几天,又有一个客户向我咨询undo表空间使用率的问题. 这让我想起几年前曾经有个省份的案例,客户的实际运维人员是一位刚毕业不久的女孩,几乎不懂Oracle原理,项目经理交给她的任务也是基础运维工 ...
- 菱形开合的实现 IOS
实现的原理: 利用了自动布局和形变 核心代码块: @implementation JHMainView { UILabel *label1,*label2,*label3,*label4; UIBut ...
- hive1.2.2部署
1.解压hvie.tar,进入conf目录下,cp hive-default.xml.template hive-site.xml; 2.将hive下的新版本jline的JAR包拷贝到hadoop下: ...
- 推荐一款不错的反编译软件:Reflector
只需要把要反编译的dll拖放到程序窗口就可以看到code了.是不是很简单,快来试试吧.不只是可以反编译个人写的code,.Net库一样可以查看代码.想学习.Net核心代码的可以试试看.
- pyinstaller生成exe文件失败
我的python是3.6,目前pyinstaller并不支持,有网友建议在Github上下载源码,用pyinstaller_develop文件夹替换pyinstaller安装位置下同名文件夹.这样做之 ...
- Very Simple Problem
Very Simple Problem Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- 阿里云RDS for SQL Server使用的一些最佳实践
了解RDS的概念 这也是第一条,也是最重要的一条,在使用某项产品和服务之前,首先要了解该产品或服务的功能与限制,就像你买一个冰箱或洗衣机,通常也只有在阅读完说明书之后才能利用起来它们的所以功能,以及使 ...