MySQL笔记(二)
一、SQL语句“数据行”操作补充
增
1 insert into tb1(name,age) values('peng',20); 增加一条数据 2 3 insert into tb1(name,age) values('peng',20),('sheng',19); 增加多条数据,用逗号隔开 4 5 insert into tb2(name,age) select name,age from tb1; 将t2表的name,age列全部插入到t1表中
删
1 delete from tb1; 2 3 delete from db1 where id>5; where后面是条件语句,在很多地方都适用 4 5 delete from db1 where id!=5 ; 在MySQL中不等号的另外一种写法: id<>5 6 7 delete from db1 where id<5 or name='jack';
改
1 update tb2 set name='jack' where id>5 and name='lucy'; 2 3 update tb12 set name='robert',age=19 where id>12 and name='xx'
查
1 select * from tb1; 2 3 select name,age from tb1; 4 5 select where id>2 name='jack'; 6 7 select id,name as cname from tb12 where id > 10 or name ='xxx'; # 加个as表示给表头取一个别名,但是里面的内容不会变(name as cname)只是name取了别名 8 9 select name,age,11 from tb12; # 写一个常量(11)表示加了一列,并且这一列都是11
关于‘查’的其他:
1 select * from tb1 where id!=1; 2 3 select * from tb1 where id<>1; 4 5 select * from tb1 where id in (1,5,12); 6 7 select * from tb1 where id not in (1,5,12); 8 9 select * from tb1 where id between 2 and 6; # 闭区间 10 11 select * from tb12 where id in (select id from tb11) # in里面还可以去别的表查 会先执行括号里面的语句
通配符:下划线和百分号
以a开头 两种写法: 1、a% 表示%后面可以有任意多的字符 (ab,abc,acbhsjhj) 2、a_ 表示后面只能有一个位置(ab,ac) 拓展:%a%表示中间包含a的(只要有a就行) select * from tb12 where name like "a%" 表示以a开头的 select * from tb12 where name like "%a" 表示以a结尾的 select * from tb12 where name like "a_"
分页:(翻页查看,比如百度查阅)limit
1 select * from tb3 limit 10; 查看前十条数据 2 3 select * from tb3 limit 0,10;0表示起始位置,10表示查看多少条数据 4 5 select * from tb12 limit 10 offset 20; offset表示从哪开始,limit后面表示取多少条(这条代码和上面那条功能是一样的)
排序:order by desc asc
1 select * from 表 order by 列 asc - 根据 “列” 从小到大排列 2 select * from 表 order by 列 desc - 根据 “列” 从大到小排列 3 select * from 表 order by 列1 desc,列2 asc - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序 4 5 6 select * from tb12 order by id desc; 大到小 by后面表示通过id排列 7 select * from tb12 order by id asc; 小到大 8 记忆方法:abcd a在前面--asc从小到大排, d在后面--desc从大到小排。 9 10 select * from tb12 order by age desc,id desc; ★优先按age排,age如果重复的话再根据id --》desc排 11 12 取后10条数据: 13 select * from tb12 order by id desc limit 10;
分组:group by
1 select count(id),max(id),part_id from userinfo5 group by part_id; 【group by表示根据谁分组 max(id)重合的话取最大的id拿过来】 2 聚合函数:把相同的放一块 3 count 计数 4 max 5 min 6 sum 7 avg 8 9 ***** 如果对于聚合函数结果进行二次筛选时?必须使用having关键字,不能用where ***** 10 elect count(id),part_id from userinfo5 group by part_id having count(id) > 1; where里面一定不能出现聚合函数 11 12 select count(id),part_id from userinfo5 where id > 0 group by part_id having count(id) > 1;
连表操作:重要
两个表或多张表放在一起查看
1 连表操作(重要): 两个表或多张表放在一起查看 2 3 select * from userinfo5,department5; # 把两张表都拿出来,但没有告诉两张表的关系 4 写法1: 5 select * from userinfo5,department5 where userinfo5.part_id = department5.id; # 建立关系userinfo5.part_id = department5.id 6 7 写法2:(推荐) 8 select * from userinfo5 left join department5 on userinfo5.part_id = department5.id; # left join 左连接 两张表关系用on 9 # userinfo5左边全部显示 左边是userinfo5 10 select * from department5 left join userinfo5 on userinfo5.part_id = department5.id; 11 #相当与伪造了一个右连接 左边是department5 12 13 14 # select * from userinfo5 right join department5 on userinfo5.part_id = department5.id; 15 # department5右边全部显示 右边是department5 16 17 18 inner: 19 select * from userinfo5 inner join department5 on userinfo5.part_id = department5.id; 20 将出现null时的一行隐藏
对于自增补充:
1 2 desc t10; 看每个字段什么意思 3 4 show create table t10; 查看这个表是怎么创建的 是横的显示 5 6 show create table t10 \G; 竖的显示 看的更好 7 8 alter table t10 AUTO_INCREMENT=20; 修改自增值 9 10 11 12 MySQL: 自增步长 13 基于会话级别: (一次登录就是一个会话) 14 show session variables like 'auto_inc%'; ----> 查看全局变量 15 set session auto_increment_increment=2; ----> 设置会话步长 16 # set session auto_increment_offset=10; 17 基于全局级别: 18 show global variables like 'auto_inc%'; 查看全局变量 19 set global auto_increment_increment=2; 设置会话步长 20 # set global auto_increment_offset=10; 21 22 23 SqlServer:自增步长: 24 基础表级别: 25 CREATE TABLE `t5` ( 26 `nid` int(11) NOT NULL AUTO_INCREMENT, 27 `pid` int(11) NOT NULL, 28 `num` int(11) DEFAULT NULL, 29 PRIMARY KEY (`nid`,`pid`) 30 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=2 DEFAULT CHARSET=utf8 31 32 CREATE TABLE `t6` ( 33 `nid` int(11) NOT NULL AUTO_INCREMENT, 34 `pid` int(11) NOT NULL, 35 `num` int(11) DEFAULT NULL, 36 PRIMARY KEY (`nid`,`pid`) 37 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=20 DEFAULT CHARSET=utf8
1 desc t10; 看每个字段什么意思 2 3 show create table t10; 查看这个表是怎么创建的 是横的显示 4 5 show create table t10 \G; 竖的显示 看的更好 6 7 alter table t10 AUTO_INCREMENT=20; 修改自增值 8 9 MySQL: 自增步长 10 基于会话级别: (一次登录就是一个会话) 11 show session variables like 'auto_inc%'; ----> 查看全局变量 12 set session auto_increment_increment=2; ----> 设置会话步长 13 # set session auto_increment_offset=10; 14 基于全局级别: 15 show global variables like 'auto_inc%'; 查看全局变量 16 set global auto_increment_increment=2; 设置会话步长 17 # set global auto_increment_offset=10; 18 19 20 SqlServer:自增步长: 21 基础表级别: 22 CREATE TABLE `t5` ( 23 `nid` int(11) NOT NULL AUTO_INCREMENT, 24 `pid` int(11) NOT NULL, 25 `num` int(11) DEFAULT NULL, 26 PRIMARY KEY (`nid`,`pid`) 27 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=2 DEFAULT CHARSET=utf8 28 29 CREATE TABLE `t6` ( 30 `nid` int(11) NOT NULL AUTO_INCREMENT, 31 `pid` int(11) NOT NULL, 32 `num` int(11) DEFAULT NULL, 33 PRIMARY KEY (`nid`,`pid`) 34 ) ENGINE=InnoDB AUTO_INCREMENT=4, 步长=20 DEFAULT CHARSET=utf8
单列唯一索引和联合唯一索引
唯一索引:1、约束 2、加速查找 (索引就是为了加速查找)
唯一索引:单列唯一索引和联合唯一索引
create table t1(
id int ....,
num int,
xx int,
unique 唯一索引名称 (列名,列名), # 限制这个列名是唯一的 (联合唯一:这两个值不能完全一样) 只写一个列名是单列的唯一
constraint ....
)
唯一:
约束不能重复(可以为空)
PS: 主键不能重复(不能为空)
加速查找