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.外键也可以用来实现一对多 我们先举一个这样的例子,让大家对外键有一个基本的认识 当前我们有一个需求就是,需要创建一张表,这张表要包括“姓名”,“年龄”,“工 ...
随机推荐
- 开源的JavaScript插件化框架MinimaJS
本文介绍我开发的一个JavaScript编写的插件化框架——MinimaJS,完全开源,源码下载地址:https://github.com/lorry2018/minimajs.该框架参考OSGi规范 ...
- net start mongodb 服务名无效解决方案
net start mongodb 服务名无效 或者 net start mongodb 发生错误5,拒绝访问.是因为没有用管理员权限运行cmd. 解决方案:在window中,在搜索框输入cmd后,在 ...
- 【ThinkPHP框架学习 】(1) --- thinkphp 3.2.3 验证码验证使用教程分享
框架版本:ThinkPHP框架 thinkphp 3.2.3 生成验证码 下面是最简单的方式生成验证码: $Verify = new \Think\Verify(); $Verify-> ...
- C++实现引用和被引用对象分离
上一篇博客简单介绍了C++中引用的底层实现,接下来,通过简单的代码验证如何将引用和被引用对象分离. 代码如下; #include <iostream> #include<string ...
- Best Coder #86 1001 Price List(大水题)
Price List Accepts: 880 Submissions: 2184 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 26214 ...
- js获取浏览器版本
获取火狐,谷歌,ie,常见浏览器的方法 function myBrowser(){ var userAgent = navigator.userAgent, rMsie = /(msie\s|trid ...
- css超过一定长度显示省略号
overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
- 【Aladdin Unity3D Shader编程】之三 光照模型(二)
高光反射模型 Specular=直射光*pow(cosθ,高光的参数) θ:是反射光和视野方向的夹角 编写高光反射Shader Shader "AladdinShader/07 Specul ...
- AngularJS学习篇(一)
AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑 ...
- 记录我发现的第一个关于 Google 的 Bug
先贴上 Bug 链接: https://issuetracker.google.com/issues/68969655 Bug 本身是很简单的,就是 Google 的 Android 在线参考文档中, ...