MySQL命令大全详解(为了方便阅读,很多地方使用小写)
MySQL中的关键字建议使用大写!
DDL语句:create alter drop show
数据库操作(databases):
-
create database 数据库名;
create database test; // 创建test数据库 create database test character set utf8; // 并设置编码格式
-
查询数据库
show databases; 查询数据库所有的库
- show create database 数据库名:查看某个数据库创建时定义的信息
- drop database 数据库名;删除指定的数据库操作 可以干掉数据库
- select database(); 查看正在使用的数据库 这里请注意 是database() 不是databases
- use 数据库名; 使用指定的数据库
的表操作(table);
- create table 表名(字段名1 类型(长度) 【约束】,字段名2 类型(长度) 【约束】,…);
CREATE TABLE category (
cid VARCHAR(32) PRIMARY KEY, // primary key 主键约束的意思 主键标记的列不能为空 不能有重复的值 且唯一
cname VARCHAR(50));
- show tables; 查看当前使用的数据库中所有的表
- desc 表名; 查看具体某个表的表结构
- drop table 表名;删除某个指定的表
- alter table 表名 add 列名 数据类型(长度) 【约束】; 给表数据增加一列
注意 : desc 是SQL关键字,所以你要想用这个关键字作为列名必须转移,也就是在列名上加 `` 进行转移,注意这不是单引号 而是 ` 请详见下图
- alter table 表名 modify 列名 数据类型(长度) 约束; 修改列的 数据类型、长度、及约束;
- alter table 表名 change 旧表名 新表明 数据类型(长度) 约束; 修改列名
- alter table 表名 drop 列名; 删除表中的某列
- rename table 旧表名 to 新表明; 修改表名
- insert into table 表名(表中字段1,表中字段2,…) values (值1,值2,…); 向表中添加一行数据
注意:
值与字段必须对应,个数相同,类型相同
值的数据大小必须在字段的长度范围内
除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
如果要插入空值,可以不写字段,或者插入 null。
- update 表名 set 字段名=值,字段名=值,… where 条件; 对表中已有的数据进行更新
- delete from 表名 where 条件; 删除表中部分符合条件的数据
delete from 表名 where 条件; // 删除表中符合条件的部分数据
delete from 表名; // 删除整个表(逐条删除)
truncate from 表名; // 先整表摧毁,再重新创建一个新的与原来表格式相同的表 -->这个快!!!
SQL约束
- 主键约束:primary key
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
主键的意义与作用
主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。
一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
// 对于已经建好的有主键的表可以进行修改
alter table product modify 主键列名 主键类型 not null auto_increment;//修改主键为非空,自增
创建表的时候声明主键:
- auto_increment:自动增长列
当向表中添加(insert into)新的数据的时候,可以不为自增列添加,也可以添加null值 ,自增列会自动递增赋值
- not null; 非空约束 意思就是这列值不能为null
- 外键约束:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
// 外键约束:在定义某个表的某个列为外键的时候一定要确保 主表已经存在,因为要创建联系,所以没有与主表的列之间的联系是无法创建外键约束的
查询语句(select)
- select * from 表名;查询整个表
- select pname,price from product; select 列名1,列名2 from 表名–> 就是从表名的所有列中 把 列名1 和列名2 的列单独查询并显示出来
- as ;就是给名字很长 或 之后学的 子查询 的一个简洁一些的名字 也叫别名 很实用
- distinct ; 用于去掉重复的值 放在要查询的列名前即可
- (+ - * / 。。。)运算结果表达式使用
- 运算符的使用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RxOx5gop-1607000524642)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201203154641799.png)]
在此 不 一 一 举例;
- select * from 表名 order by 排序字段 asc|desc; 根据表中的某列进行排序查询展示,asc是升序,desc是倒叙
聚合查询
count():统计指定列不为NULL的记录行数; SELECT COUNT(*) FROM product;
sum():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;SELECT SUM(price) FROM product WHERE c_id = 1;
max():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;SELECT MAX(price),MIN(price) FROM product;
min():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;SELECT MAX(price),MIN(price) FROM product;
avg():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;SELECT AVG(price) FROM product WHERE c_id = 2;
分组查询
select * from 表名 group by 字段名 having 条件; group by 就是根据表的某个字段的值,对该字段的值进行分组,having是在分组后执行的,分组后的筛选,不建议使用,分组已经吃掉很大内存了,再筛选,内存负担过重,不建议这样使用。(小数据量还可以考虑)。
where 和 having的区别;
// having是在分组后对数据进行过滤
// where是在分组前对数据进行过滤
// having后面可以使用分组函数(统计函数)
// where后面不可以使用分组函数
// 问题 : having 它会将你的分组数据再次筛选 --> 分组其实已经很浪费数据库性能 --> 在分组之后还要条件筛选(非常浪费数据库性能)
// having --> 被禁止使用的
多表查询
一对多关系:
在多的表中创建外键与一的表中的主键关联
这样关联之后,不能够再向多的表中添加一表中主键没有的数据
也不能删除一的表中,已经被多的表中外键引用了的数据,都会报错,如果要单独操作,需要先删除外简约束
多对多关系
准备:
- 设置外键:
- 设置外键1:
设置外键2:
这之后最好再给中间表设置一个 联合 主键
联合主键:
-
向联合表中添加数据:
-
向角色表中添加数据:
-
向中间表添加数据(数据存在):
-
删除中间表的数据:
-
向中间表添加数据(数据不存在) – 执行异常:
-
删除用户表或者角色表数据 – 执行异常:
链接查询
内连接
-
隐式内连接(不推荐使用):select * from A,B where 条件;
-
显示内连接:select * from A inner join B on 条件; (推荐写法)
外连接:(使用的关键字 outer join – outer可以省略)
-
左外连接:select * from A left outer join B on 条件;
-
右外连接:right outer join(了解):