数据库级别
一次性操作,创造数据库之类的只需要一次性操作
显示数据库
show databases; // 显示数据库
创建数据库
create database 数据库名称 default charset utf8 collate utf8_general_ci; // 创建数据库
使用数据库
use 数据库名称; // 使用数据库
删除数据库
drop database 数据库名称; // 删除数据库
表级别
一次性操作,创造数据表之类的也只需要一次性操作
查看数据库中所有表
use 数据库名称;
show tables; // 查看数据库中的表
desc 表名; // 查看具体某一表中的内容
创建表
create table 表名(nid int, name varchar(10)); // 创建表
create table 表名(
列名 类型 是否可以为空, // null表示空
列名 类型 是否可以为空 // not null 表示不可空
)engine=InnoDB default charset=utf8;
create table tb1 (
nid int not null default 1,
num int null
);
一张表只能有一个自增列
create tble tb1 (
nid int not null auto_increment primary key,
num int null
);
一张表之能有一个主键,唯一不能重复,并且不能为空,一般情况下会将自增列设置成主键
create table tb1( // 创建一张表
nid int not null auto_increment primary key,
age int not null default 10,
name varchar(16)
)engine-innodb default charset=utf8;
可以为null。其余跟主键相似。
外键就是表A中数据关联表B中的数据。
- 添加外键
// 添加外键语法
// 可以解读为:修改表,给表添加约束,约束的名称就是外键名称。外键字段就是表中需要约束的字段,与另一张表相关联
alter table 从表 add constraint 外键名称(形如:fk_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
// 添加外键举例
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;
// 添加部门
insert into part(caption) values('AD');
insert into part(caption) values('BD');
insert into part(caption) values('CD');
// 添加人
insert into userinfo(name,age,part_nid) values('wang',19,1);
insert into userinfo(name,age,part_nid) values('jave',30,1);
insert into userinfo(name,age,part_nid) values('ios',21,2);
insert into userinfo(name,age,part_nid) values('swift',40,30);
// 添加外键
alter table userinfo add constraint fk_userinfo_part foreign key userinfo(part_nid) references part(nid);
// 添加外键之后继续添加人,此时会报错。因为我们已经添加外键约束,此时外键最大为3,这时候我们添加30是有问题的。
insert into userinfo(name,age,part_nid) values('swift',40,30);
- 也可以在创建的时候添加外键
create table color(
nid int not null auto_increment primary key,
name varchar(10) not null default 'red'
)engine=innodb default charset=utf8;
create table fruit(
nid int not null auto_increment primary key,
color_id int not null,
name varchar(10) null,
constraint fk_fruit_color foreign key (color_id) reference color(nid)
)engine=innodb default charset=utf8;
删除表
drop table 表名; // 删除表
清空表内容
delete from 表名; // 清空表内容(但是表还会保留)。下次插入数据自增不会回到原点。
truncate table 表名; // 清空表内容(但是表还会保留)。下次插入数据自增会回到原点。效率较高一些。
修改表
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 从表 add constraint 外键名称(形如:fk_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
alter table 表名 drop foreign key 外键名称;
alter table 表名 alter 列名 set default 默认值;
alter table 表名 alter 列名 drop default;
数据行级别
需要多次操作
- 直接增加数据
// 增加多条数据
insert into 表名(列名1,列名2) values(列名1值,列名2值),(列名1值,列名2值);
// 增加单条数据
insert into 表名(列名1,列名2) values(列名1值,列名2值);
- 从一张表导入数据到另一张表
insert into 表1(列表1,列表2) select 列表1,列表2 from 表2;
// 创建表 userinfo
create table userinfo(
nid int not null auto_increment primary key,
name varchar(20),
age int not null default 1
)engine=innodb default charset=utf8;
// 创建表 part
create table part(
nid int not null auto_increment primary key,
caption varchar(10),
gender varchar(10)
)engine=innodb default charset=utf8;
// part表插入数据
insert into part(caption,gender) values('Java','1'),('Swift','2'),('MySQL','4');
// userinfo表插入数据
insert into userinfo(name,age) value('Lee',18);
// 从part表中查 caption,gender字段的值插入到表userinfo中name,age中。其中 gender 为varchar类型,age为int,类型。
// 如果内部可以转换成功的话,就可以成功插入
insert into userinfo(name,age) select caption,gender from part;
// 这种转换就会出错
insert into userinfo(name,age) select caption,caption from part;
delete from 表;
delete from userinfo;
// 会将列所有都改成统一值
update 表 set 列=值;
// nid为1 name改成Lee
update userinfo set name='Lee' where nid=1;
// nid为2 name改成Wo,age改为12
update userinfo set name='Wo',age=12 where nid=2;
select * from 表名;
// 查找nid大于等于12的所有值,并且*匹配所有值,也就是将userinfo表中的nid,name,age都拿出来
select * from userinfo where nid>=12;
// 查找nid大于等于12,只将name这一列拿出来
select name from userinfo where nid>=12;
select name,age from userinfo wherw nid>=12;
- 条件语句
select * from 表 where 各种条件;
// 满足id>1,name!='wa',num=12的所有值
select * from userinfo where id > 1 and name != 'wa' and num = 12;
// 满足(4~16)范围
select * from userinfo where id between 4 and 16;
select * from userinfo where id in (12,22,33);
select * from userinfo where id not in (12,22,33);
select * from userinfo where id in (select nid from part);
- 通配符(也就是模糊搜索)
// 查找userinfo中name列 W开头的所有字符串(多个字符)
// 例如:W122,W010
select * from userinfo where name like 'W%';
// 查找userinfo中name列 W开头的所有字符串(一个字符)
// 例如:W1
// W12 无法匹配
select * from userinfo where name like 'W_';
- 分页
// 表示从表中去限制条件的数据
select * from 表 limit 限制条件;
// 只取前5条
select * from userinfo limit 5;
// 用来做分页,表示从userinfo 从第5行开始之后取2行。(数据库计算从0开始)
select * from userinfo limit 5,2;
// 用来做分页,表示从userinfo 从第2行开始之后取5行
select * from userinfo limit 5 offset 2;
- 排序
select * from 表 order by 条件;
// 根据nid,进行从小到大排列
select * from userinfo order by nid asc;
// 根据age,从大到小排列
select * from userinfo order by age desc;
// 根据age,从大到小排列;如果age相同,根据nid从小到大排列
select * from userinfo order by age desc , nid asc;
- 分组
select * from 表 group by 条件
select * from 表 group by 条件 having 约束
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;
// 添加部门
insert into part(caption) values('AD'),('BD'),('CD');
// 添加人
insert into userinfo(name,age,part_nid) values('python',19,1),('jave',30,1),('ios',21,2),('swift',40,2),('wang',21,3),('lee',201,3);
// 添加外键
alter table userinfo add constraint fk_userinfo_part foreign key userinfo(part_nid) references part(nid);
// 通过part_nid 对表 userinfo 进行分组
select part_nid from userinfo group by part_nid;
// 报错,因为nid有多个值,不知道该如何取某一个值
select part_nid,nid from userinfo group by part_nid;
// 分组,取出part_nid,相同的为一组。取nid最大值
select part_nid , max(nid) from userinfo group by part_nid;
select part_nid ,max(nid),min(nid) from userinfo group by part_nid;
part_nid | max(nid) | min(nid) |
---|
1 | 2 | 1 |
2 | 4 | 3 |
3 | 6 | 5 |
// 其中 count(nid) 就是计算part_nid 相同的 nid 的个数。
select part_nid,max(nid),min(nid),sum(nid),count(nid) from userinfo group by part_nid;
part_nid | max(nid) | min(nid) | sum(nid) | count(nid) |
---|
1 | 2 | 1 | 3 | 2 |
2 | 4 | 3 | 7 | 2 |
3 | 6 | 5 | 11 | 2 |
// 别名
select part_nid as nid ,max(nid) as max,min(nid) as min,sum(nid) as sum,count(nid) as count from userinfo group by part_nid;
nid | max | min | sum | count |
---|
1 | 2 | 1 | 3 | 2 |
2 | 4 | 3 | 7 | 2 |
3 | 6 | 5 | 11 | 2 |
// 根据聚合条件进行筛选,此处不可用 where条件语句 应该用 having
select part_nid as nid ,max(nid) as max,min(nid) as min,sum(nid) as sum,count(nid) as count from userinfo group by part_nid having count>1;
nid | max | min | sum | count |
---|
1 | 2 | 1 | 3 | 2 |
2 | 4 | 3 | 7 | 2 |
3 | 6 | 5 | 11 | 2 |
- 联合
// 联合自动去重
select nickname
from A
union
select name
from B
// 联合不做任何处理
select nickname
from A
union all
select name
from B
// 创建表 userinfo
create table userinfo(
nid int not null auto_increment primary key,
name varchar(20),
age int not null default 1
)engine=innodb default charset=utf8;
// 创建表 part
create table part(
nid int not null auto_increment primary key,
caption varchar(10),
gender varchar(10)
)engine=innodb default charset=utf8;
// part表插入数据
insert into part(caption,gender) values('Java','1'),('Swift','2'),('MySQL','4');
// userinfo表插入数据
insert into userinfo(name,age) value('Lee',18);
// 无重合数据,全部展示
select caption from part union select nid from userinfo
caption |
---|
‘Java’ |
‘Swift’ |
‘MySQL’ |
1 |
// 因为会有重合,所有就默认去重
select nid from part union select nid from userinfo
// 不会去重
select nid from part union all select nid from userinfo
- 连表
// 无对应关系,全部显示
select A.num , A.name,B.name
from A,B
// 有对应关系
select A.num , A.name,B.name
from A,B
where A.nid = B.nid
select A.num, A.name ,B.name
from A left join B
on A.nid = B.nid
select A.num, A.name ,B.name
from A inner join B
on A.nid = B.nid
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;
// 添加部门
insert into part(caption) values('AD'),('BD'),('CD'),('DD');
// 添加人
insert into userinfo(name,age,part_nid) values('python',19,1),('ios',21,2),('wang',41,3);
// 添加外键
alter table userinfo add constraint fk_userinfo_part foreign key userinfo(part_nid) references part(nid);
// 查询结果相当于 userinfo 表查询每一行,然后part查询所有行进行匹配一次,
select * from userinfo,part;
nid | name | age | part_nid | nid | caption |
---|
1 | python | 19 | 1 | 1 | AD |
1 | python | 19 | 1 | 2 | BD |
1 | python | 19 | 1 | 3 | CD |
2 | ios | 21 | 2 | 1 | AD |
2 | ios | 21 | 2 | 2 | BD |
2 | ios | 21 | 2 | 3 | CD |
3 | wang | 41 | 3 | 1 | AD |
3 | wang | 41 | 3 | 2 | BD |
3 | wang | 41 | 3 | 3 | CD |
// 添加条件进行查询
select * from userinfo,part where userinfo.part_nid = part.nid;
nid | name | age | part_nid | nid | caption |
---|
1 | python | 19 | 1 | 1 | AD |
2 | ios | 21 | 2 | 2 | BD |
3 | wang | 41 | 3 | 3 | CD |
// 添加条件进行查询 on 之后是条件
select * from userinfo left join part on userinfo.part_nid = part.nid;
nid | name | age | part_nid | nid | caption |
---|
1 | python | 19 | 1 | 1 | AD |
2 | ios | 21 | 2 | 2 | BD |
3 | wang | 41 | 3 | 3 | CD |
select * from part left join userinfo on userinfo.nid = part.nid;
nid | caption | nid | name | age | part_nid |
---|
1 | AD | 1 | python | 19 | 1 |
2 | BD | 2 | ios | 21 | 2 |
3 | CD | 3 | wang | 41 | 3 |
4 | DD | NULL | NULL | NULL | NULL |
// 对 left join 进行过滤,有为NULL的值进行清理
select * from part inner join userinfo on userinfo.nid = part.nid;
nid | caption | nid | name | age | part_nid |
---|
1 | AD | 1 | python | 19 | 1 |
2 | BD | 2 | ios | 21 | 2 |
3 | CD | 3 | wang | 41 | 3 |
查询表内数据
select * from 表名; // 查询表内数据