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的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)的更多相关文章

  1. 数据库主键跟外键+修改mysql的密码

    update myspl.user set password=PASSWORD(设置的密码)  where user='root'; 如果修改错误:先执行use mysple;再重复上面的代码. 一. ...

  2. MySQL数据库--外键约束及外键使用

    什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

  3. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  4. MySQL中MyISAM与InnoDB区别及选择,mysql添加外键

    InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...

  5. mysql:外键

    mysql:外键 转自:https://www.cnblogs.com/brucemengbm/p/6897410.html 一个班级的学生个人信息表: 什么是外键 在设计的时候,就给表1加入一个外键 ...

  6. MySQL定义外键的方法

    MySQL定义外键的方法是每个学习MySQL的人都需要掌握的知识,下文就对MySQL定义外键的语句写法进行了详细的阐述,供您参考. 外键为MySQL带来了诸多的好处,下面就为您介绍MySQL定义外键的 ...

  7. mysql添加外键约束变为索引

    今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter  table table_name1  engine=inno ...

  8. mysql添加外键无法成功的原因

    最近很忙,碰到很多问题都忘了发上来做个记录,现在又忘了,FUCK,现在碰到一个问题, 就是mysql添加外键总是无法成功,我什么都试了,就是没注意signed和unsigned,FUCK,因为我用my ...

  9. mysql的外键知识

    外键的作用 1.用来约束两张表中的字段 2.外键也可以用来实现一对多 我们先举一个这样的例子,让大家对外键有一个基本的认识 当前我们有一个需求就是,需要创建一张表,这张表要包括“姓名”,“年龄”,“工 ...

随机推荐

  1. [译]ASP.NET Core 2.0 会话状态

    问题 如何在ASP.NET Core 2.0中存储会话状态? 答案 创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务: public ...

  2. LeetCode 235. Lowest Common Ancestor of a Binary Search Tree (二叉搜索树最近的共同祖先)

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  3. hdu1285 确定比赛名次(拓扑排序)

    有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...

  4. Chinese Rings

    Chinese Rings Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. awk详解 数组

    第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...

  6. 状态码为 200 from cache和304 Not modified的区别

    1.请求状态码为 200  from cache: 表示该资源已经被缓存过,并且在有效期内,所以不再向浏览器发出请求,直接使用本地缓存. 如下图: 2.状态码为 304 Not modified: 表 ...

  7. Problem E: 分数类的输出

    Problem E: 分数类的输出 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2699  Solved: 1227[Submit][Status][ ...

  8. Java IO编程全解(六)——4种I/O的对比与选型

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7804185.html 前面讲到:Java IO编程全解(五)--AIO编程 为了防止由于对一些技术概念和术语 ...

  9. RE: Javascript分页处理

    背景: 调用PHP后端给的接口,以实现分页的功能.由于我是没造轮子的能力,所以翻了不少技术博客,经过整合才算完成整个分页功能.从一番查阅中,不难看出大概分为两种不同的分页: 一种是纯前端的,就是在一次 ...

  10. HTML+CSS+js常见知识点

    一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...