MySQL语句

数据库级别

一次性操作,创造数据库之类的只需要一次性操作

显示数据库
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中的数据。

  1. 添加外键
// 添加外键语法
// 可以解读为:修改表,给表添加约束,约束的名称就是外键名称。外键字段就是表中需要约束的字段,与另一张表相关联
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);
  1. 也可以在创建的时候添加外键
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;

数据行级别

需要多次操作

  1. 直接增加数据
// 增加多条数据
insert into 表名(列名1,列名2) values(列名1值,列名2值),(列名1值,列名2值);
// 增加单条数据
insert into 表名(列名1,列名2) values(列名1值,列名2值);
  1. 从一张表导入数据到另一张表
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;
  • 其他
  1. 条件语句
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);
  1. 通配符(也就是模糊搜索)
// 查找userinfo中name列 W开头的所有字符串(多个字符)
// 例如:W122,W010
select * from userinfo where name like 'W%';
// 查找userinfo中name列 W开头的所有字符串(一个字符)
// 例如:W1
// W12 无法匹配
select * from userinfo where name like 'W_';
  1. 分页
// 表示从表中去限制条件的数据
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;
  1. 排序
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;
  1. 分组
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;
part_nidmax(nid)
12
24
36
select part_nid ,max(nid),min(nid) from userinfo group by part_nid;
part_nidmax(nid)min(nid)
121
243
365
// 其中 count(nid) 就是计算part_nid 相同的 nid 的个数。
select part_nid,max(nid),min(nid),sum(nid),count(nid) from userinfo group by part_nid;
part_nidmax(nid)min(nid)sum(nid)count(nid)
12132
24372
365112
// 别名
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;
nidmaxminsumcount
12132
24372
365112
// 根据聚合条件进行筛选,此处不可用 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; 
nidmaxminsumcount
12132
24372
365112
  1. 联合
// 联合自动去重
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
nid
1
2
3
// 不会去重
select nid from part union all select nid from userinfo
nid
1
2
3
1
  1. 连表
// 无对应关系,全部显示
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;
nidnameagepart_nidnidcaption
1python1911AD
1python1912BD
1python1913CD
2ios2121AD
2ios2122BD
2ios2123CD
3wang4131AD
3wang4132BD
3wang4133CD
// 添加条件进行查询
select * from userinfo,part where userinfo.part_nid = part.nid;
nidnameagepart_nidnidcaption
1python1911AD
2ios2122BD
3wang4133CD
// 添加条件进行查询 on 之后是条件
select * from userinfo left join part on userinfo.part_nid = part.nid;
nidnameagepart_nidnidcaption
1python1911AD
2ios2122BD
3wang4133CD
select * from part left join userinfo on userinfo.nid = part.nid;
nidcaptionnidnameagepart_nid
1AD1python191
2BD2ios212
3CD3wang413
4DDNULLNULLNULLNULL
// 对 left join  进行过滤,有为NULL的值进行清理
select * from part inner join userinfo on userinfo.nid = part.nid;
nidcaptionnidnameagepart_nid
1AD1python191
2BD2ios212
3CD3wang413

查询表内数据

select * from 表名; // 查询表内数据
    原文作者:程序渣渣猿
    原文地址: https://www.jianshu.com/p/3d68047d216b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞