4.外键(一对多): 作用:1.约束 2.节省空间 create table department ( id int auto_increment primary key, depart_name varchar(32) not null default ‘‘, num int not null default 0 )engine=Innodb charset=utf8; create table userinfo ( id int auto_increment primary key, name varchar(32) not null default ‘‘, depart_id int not null default 1, # constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)), # constraint fk_userinfo_depart foreign key (depart_id) references department(id) )engine=Innodb charset=utf8; 注意: 1.不能将创建外键的语句单独拿出来 先将表创建好以后再加约束外键,和删除外键 alter table userinfo add constraint fk_userinfo_depart foreign key (depart_id) references department(id); alter table userinfo drop foreign key 外键名称(fk_userinfo_depart ); #删除外键 2.外键关联的时候,必须关联的是表的主键ID 3.主键索引:加速查找+不能为空+不能重复 外键的变种:(重点) 1.唯一索引:unique create table 表名( id int, num int, unique(num) #num成为唯一 )engine=Innodb charset=utf8; 作用:num列的值不能重复,加速查找 2.联合唯一索引: create table 表名(id int, num int, unique(id,num) )engine =Innodb charset=utf8; 作用: num 列和id列的值不能重复,加速查找 3.多重联合索引: create table 表名(id int, num int, ... , unique(num,int,...) ) engine = Innodb charset=utf8;5.外键:一对一: 多对多: 高级查询: 增:insert into 表名(列名1,列名2,) values(值1,值2); 添加一条 insert into 表名(列名1,列名2) values (值1,值2),(值1,值2),(值1,值2); #添加多条 insert into 表名(列名1,列名2) select 列名1,列名2 from 表名; #从另外一个表中将数据复制到要操作的表中 删除:删除可以在where后面加条件 delete from 表名; delete from 表名 where id >10 delete from 表名 where id <10 delete from 表名 where id<=10 delete from 表名 where id>=10 delete from 表名 where id!=10 delete from 表名 where id=10 and name=‘xxx‘;# and:并且,两个条件都必须要成立 delete from 表名 where id=10 or name=‘xxx‘; #or :或者 只要满足一个条件成立 修改:可以在where后面加条件 update 表名 set 列名=‘xxx‘,列名=23 where id >10; 查询: 基本: select * from 表名; select 列名,列名 from 表名; 高级: 1. where 条件查询: select * from 表名 where id>10; select * from 表名 where id >10 and id<15; select * from 表名 where id > 10; != : 不等与 >= <= between and :闭区间 select * from 表名 where id between 9 and 12: in :在某一个集合中 select * from 表名 where id in (9,10,11,...); select * from t4 where id in (select id from t3 where id between 2 and 4) 是可以这样使用的, 但是不建议大家使用; 2. 通配符: like (alex) select * from 表 where name like ‘ale%‘ - ale开头的所有(多个字符串) select * from 表 where name like ‘ale_‘ - ale开头的所有(一个字符) 3.限制取几条: select * from 表名 limit 索引偏移量,去除多少数据; select * from t3 limit 0, 10; 第一页 select * from t3 limit 10, 10; 第二页 page = input(‘page:‘) page 索引偏移量 数据量(offset) 1 0 10 2 10 10 3 20 10 4 30 10 page (page-1)*offset offset 分页核心SQL: select * from t3 limit (page-1)*offset, offset;4.排序: order by: select * from 表名 order by 列名 desc; descending select * from 表名 order by 列名 asc; ascending 多列: create table t7( id int auto_increment primary key, num int not null default 0, age int not null default 0 )charset=utf8; insert into t7 (num, age) values (2, 12),(3,13),(4, 12); select * from t4 order by num desc, name asc; 如果前一列的值相等的话, 会按照后一列的值进行进一步的排序. 5.分组: select 列名,聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名; select age, count(num) from t7 group by age; select age, count(num) as cnt from t7 group by age; 显示别名 as having 的二次删选: select 列名,聚合函数 as 别名 from 表名 group by 列名 having 别名 > 条件; select age, count(num) as cnt from t7 group by age having cnt>1; where 和 having的区别: 1). having与where类似,可筛选数据 2). where针对表中的列发挥作用,查询数据 3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用 6.链表操作: select * from 表名,表名 where 表名.关联id=表名.关联id; 左连接: select * from userinfo left join department on userinfo.depart_id=department.id; 左边的表全部显示, 右边没有用到不显示 右连接: select * from userinfo right join department on userinfo.depart_id=department.id; 右边的表全部显示, 左边没关联的用null表示 内连接: 左右两边的数据都会显示 ps: a.只需要记住左连接 left join b.可以连接多张表 通过某一个特定的条件 注意查询的顺序: select name,sum(score) from 表 where id > 10 group by score having age> 12 order by age desc limit 2, 10 select * from score where
原文地址:https://www.cnblogs.com/sry622/p/11022628.html
时间: 2024-11-06 11:47:43