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. UVa1605,Building for UN

    我比较好奇的是uva后台是怎么测这题的 没什么可说的,那些不想敲但还是想直接交这题的直接copy过去吧 #include <iostream> #include <cstring&g ...

  2. 用 eclipse 创建一个简单的 meaven spring springMvc mybatis 项目

    下面是整体步骤: 1: 先创建一个Maven 项目: 选择跳过骨架: 因为要搭建的是 web 项目  所以这个地方选择 war 包; 点击完成 这样就完成 Maven项目的搭建: 接下俩 先把 Mav ...

  3. 购物篮算法的理解-基于R的应用

    是无监督机器学习方法,用于知识发现,而非预测,无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤.缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理. 一,概念术语 ...

  4. Tomcat 笔记-配置虚拟目录

    ,默认情况下,只有webapps下的目录才能被Tomcat自动管理成一个web站点,把web站点的目录分散到其他磁盘管理就需要配置虚拟目录.把web应用所在目录交给web服务器管理,这个过程称之为虚拟 ...

  5. SSM框架+slf4j 以Gradle实现

    环境:win10+jdk8+tomcat9+Intellij IDEA 首先,作为一个喜欢偷懒的人,管理jar之类的的事情太累,所以用了Gradle项目管理器 第一步: 新建一个gradle-web项 ...

  6. LeetCode 575. Distribute Candies (发糖果)

    Given an integer array with even length, where different numbers in this array represent different k ...

  7. WPF获得全局窗体句柄,并响应全局键盘事件

    场景 wpf窗体运行后,只能捕获当前Active窗体的按键事件,如果要监听windows全局事件,并对当前窗口事件响应. 第一步:导入Winows API public class Win32 { [ ...

  8. python基础6 迭代器 生成器

    可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...

  9. Xilinx ISE 14.1生成Rom内核并读取Rom中的数据

    <一>建立一个项目readDataFromRom 详细过程参照另一篇文章 http://www.cnblogs.com/LCCRNblog/p/3397666.html <二> ...

  10. js之学习正则表达式

    看了掘金的一个作者写的JS正则表达式完整教程 受益匪浅,感谢作者的无私奉献.在此,做下笔记. 目录 0. 目录 1. 正则表达式字符匹配 1.1.字符组 1.2.量词 1.3.多选分支 1.4.案例分 ...