博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)...
阅读量:5026 次
发布时间:2019-06-12

本文共 14506 字,大约阅读时间需要 48 分钟。

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的过滤。

转载于:https://www.cnblogs.com/lizeboLB/p/7783882.html

你可能感兴趣的文章
BZOJ 1452: [JSOI2009]Count [二维树状数组]
查看>>
BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin [线段树优化建边]
查看>>
BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
查看>>
IDEA使用笔记(四)——工具栏的显示隐藏切换
查看>>
python中强大的list
查看>>
LeetCode Remove Invalid Parentheses
查看>>
thinkphp常用标签总结
查看>>
.net Core
查看>>
Mac 下安装wxpython踩过的坑
查看>>
05004_Linux的其他命令和权限命令
查看>>
00083_判断集合元素唯一的原理
查看>>
卷挂载/卸载工作流程
查看>>
.NET 配置项扩展
查看>>
Mac网络抓包 - Wireshark
查看>>
iOS开发拓展篇—CoreLocation简单介绍
查看>>
配置maven-ssm
查看>>
【codecombat】 试玩全攻略 第二章 边远地区的森林
查看>>
catch on用法
查看>>
CreateUserWizard控件的详细使用说明(3)
查看>>
jquery mobile AJAX特性的陷阱
查看>>