前言:mysql以’;'为一条语句的结束符
注释格式:
-- <注释内容> 单行注释 注意:空格必须有
#<注释内容> 单行注释
/* <注释内容> */ 多行注释
net start mysql 启动mysql服务
net stop mysql 停止mysql服务
mysqld --skip-grant-tables 使用无验证的方式启动mysql服务 注意:启动的mysqld进程可能需要手动结束
mysqldump -u<用户名> -p<密码> <数据库名> > <保存路径> 备份某一数据库
mysql -u <用户名> -p<密码> 登录mysql(-p 可回车后以星号的显示方式输入密码) 注意:p和密码之间没有空格
mysql -h <IP地址> -u <用户名> -p<密码> 建立一个关于IP地址的连接
mysql --host=<IP> --user=<用户名> --password=<密码> 建立连接的另一种写法
exit/quit; #退出当前连接
-- 还原数据库:在要还原的数据库中输入下面命令即可
source <sql文件路径位置>;
数据定义语言 DDL
show DataBases; #查看数据库
show create database <数据库名>; #可以查看该数据库的字符集
create database <数据库名>; #创建数据库
create database if not exists <数据库名>; #判断如果没有该数据库再创建
create database <数据库名> character set <字符集名>; #创建时设置数据库的字符集
alter database <数据库名> character set <字符集名>; #修改字符集
drop database <数据库名>; #删除数据库
drop database <数据库名> if exists <数据库名>; #如果存在删除
select database(); #查询当前正在使用的数据库名
use <数据库名>; #使用数据库(进入数据库)
show tables; #显示当前数据库的表
desc <表名>; #查询表结构
create table <表名>(
<列名1> <数据类型1>,
<列名2> <数据类型2>,
<列名3> <数据类型3>
); #创建表
drop table <表名>; #删除表
drop table if exists <表名>; #如果存在该表删除
create table <表名> like <要复制的表名>; #复制表
alter table <表名> character set <字符集名>; #修改字符集
alter table <旧表名> rename to <新表名>; #修改表名
alter table <表名> add <列名> <数据类型>; #添加一列
alter table <表名> change <列名> <新列名> <新数据类型>; #修改表的列
alter table <表名> modify <列名> <新数据类型>; #修改列的数据类型
alter table <表名> drop <列名>; #删除一列
数据操作语言 DML
insert into <表名>(<列名1>,<列名2>,<列名3>) values(<值1>,<值2>,<值3>); #添加一条数据 注意:1. 列名和赋给的值必须一一对应。 2. 字符串等使用单引号('')和双引号("")都可以。
select * from <表名>; #查询表
delete from <表名> [where语句]; #删除表中的记录 注意:1. "[]"表示可选。 2. 不填写where语句,表示删除表中的所有数据。
truncate table <表名>; #用来删除表中的所有数据。它先删除表,然后在创建一个一模一样的空表。 注意:效率相对较高。delete 需要一条一条的删除记录,而truncate 直接删除表,再创建表。
update <表名> set <列名1> = <值1>, <列名2> = <值2> [where语句] #修改表中的数据 注意:如果不加where条件,就会将表中的记录都修改。
数据查询语言 DQL
-- order by 排序子句
-- order by <要排序的字段1> <排序方式1>, <要排序的字段2> <排序方式2>,...
select * from <表名> order by <字段1> <排序方式1>, <字段2> <排序方式2>; #将查询的所有记录按照字段1的排序方式1排序,再将字段1值相同的按照字段2的排序方式2排序。 注意:ASC为升序排序,DESC为降序排序。
-- 聚合函数 (count,max,min,sum,avg)
select count(<列名>) from <表名>; #计算该列的非空值的记录的个数
select count(ifnull(<列名>,0)) from <表名>; #该列的值如果为null,返回0。所以计算的是该表有多少条数据。
select max(<列名>) from <表名>; #计算该列的最大值。(min() 求最小,sum() 求和,avg() 求平均)
-- group by 分组子句
select <要分组的字段>, <聚合函数> from <表名> group by <分组字段>; #分组查询 注意:查询的字段必须是分组字段或者聚合函数,即要查询的是每一组共有的值,要忽略组内个性。
select <要分组的字段>, <聚合函数> from <表名> where <筛选条件> group by <分组字段> having <筛选条件>; #满足where的筛选条件后再进行分组,分组后的结果满足having筛选条件的进行显示。 注意:having的筛选条件可以是聚合函数,where不能使用聚合函数。
-- limit 分页查询子句
select * from <表名> limit <记录的下标>,<显示条数>; #从记录的下标开始查询显示条数的记录。 如:..limit 3,3; 从下标为3的记录(即第四条记录)开始显示3条记录。
select distinct <字段名> from <表名>; #distinct是去重的关键字 注意:去重时要求结果集完全一样。
select <字段名/查询函数> as <别名> from <表名>; #as起别名。
/*
运算符:>, <, >=, <=, =, <>, !=;
! or not, and or &&, or or ||, between..and, is null, is not null, in
*/
select * from <表名> where <int字段名> between 10 and 20; #查询<int字段名>的值在10 到 20 之间的记录(包含10和20)。
select * from <表名> where <字段名> is null; #查询该字段的值为null的记录。
select * from <表名> where <字段名> in (<值1>, <值2>); #查询该字段值为值1或值2中的记录。
-- 模糊查询:like 占位符: '_'单个任意字符,'%'多个任意字符(0或多个)。
select * from <表名> where name like '刘%'; #查询姓刘的人
-- 约束:
-- 主键约束:primary key;
-- 非空约束:not null;
-- 唯一约束:unique;
-- 外键约束:foreign key;
CREATE TABLE <表名>(
id INT(10) PRIMARY KEY AUTO_INCREMENT, -- 设置主键为自动增长
name VARCHAR(20) NOT NULL,
-- primary key(id, name), --将id和name设为联合主键
phone_number VARCHAR(20) UNIQUE,
class_id int(10), -- 所在公司的id (外键)
CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id) -- 创建class_id为外键,fk_class_id —— <约束名>; class_id —— <外键的字段名>; class —— <引用表>; id —— <引用列> 注意:引用列必须用unique约束。
);
alter table <表名> add primary key(id);
alter table <表名> modify name varchar(20) [AUTO_INCREMENT]; #通过修改字段的属性, 可以删除/定义约束。
alter table <表名> drop index phone_number; #去掉phone_number字段的唯一约束
alter table <表名> drop primary key; #删除主键约束
alter table <表名> drop foreign key fk_class_id; #删除外键约束
alter table <表名> add CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id); #添加外键约束。
-- 级联操作(和外键相关。如设置级联更新时,修改外键关联的另一个表的主键的值时,所有外键值等于关联主键的值相同的外键值也会修改;删除主键值时,相同的外键值会置为空)
-- on update cascade 级联更新;on delete cascade 级联删除。 可以一起设置,也可以分开设置。
alter table <表名> add CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id) on update cascade; #添加外键约束,设置级联更新。
alter table <表名> add CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id) on delete cascade; #添加外键约束,设置级联删除。
多表查询
select * from <表1>,<表2>; #双表查询笛卡尔积
select <字段列表> from <表1>,<表2> where <条件>; #隐式内连接
select <字段列表> from <表1> [inner] join <表2> on <条件>; #显式内连接
select <字段列表> from <表1> left [outer] join <表2> on <条件>; #左外连接
select <字段列表> from <表1> right [outer] join <表2> on <条件>; #左外连接
-- 子查询
-- 1. 子查询是单行单列的; 直接使用 运算符:>, <, =, <=, >=, <>;
-- 2. 子查询是多行单列的; 使用 in (<子查询语句>);
-- 3. 子查询是多行多列的; 将子查询视为另一张表添加在from后面。
事务
-- 开启事务:start transaction;
-- 回滚事务:rollback;
-- 提交事务:commit; 注意:在mysql中,单条DML(增删改)看为事务,会自动提交。
set @@autocommit·= 0; #设为手动提交
select @@autocommit; #查看DML语句的提交方式
-- 事务的四大特征:原子性,持久性,隔离性,一致性
-- 事务的隔离级别:
-- read uncommitted 读未提交,存在脏读、不可重复读(在同一个事物中读到的两个数据不一样)、幻读。
-- read committed 读已提交,解决脏读问题。
-- repeatable read 可重复读,解决不可重复读问题。(Mysql默认)
-- serializable 串行化。当隔离级别设置为串行化时,一个事务对某个表执行操作过程中,另一个事务不能对同一张表进行操作。解决所有问题。
set global transaction isolation level <级别字符串>; #设置数据库的隔离级别
select @@tx_isolation; #查询隔离级别
数据库控制语言 DCL
create user '<用户名>'@'<主机名>' identified by '<密码>'; #创建用户
drop user '<用户名>'@'<主机名>'; #删除用户
update user set password = password('<新密码>') where user = '<用户名>'; #修改用户密码(使用DML修改密码)
set password for '<用户名>'@'<主机名>' = password('<新密码>'); #修改密码的另一种方式(使用DCL修改密码)
show grants for '<用户名>'@'<主机名>'; #查看用户的权限
grant <权限列表> on <数据库名>.<表名> to '<用户名>'@'<主机名>'; #授予用户权限
grant all on *.* to '<用户名>'@'<主机名>'; #给该用户赋予对所有数据库的所有表的所有权限
revoke <权限列表> on <数据库名>.<表名> from '<用户名>'@'<主机名>'; #撤销权限