1、DDL: 数据定义语句,操作库或表
## 库操作
SHOW DATABASES;-- 查看数据库
CREATE DATABASE db;-- 创建数据库
USE db;-- 使用/切换数据库
SELECT DATABASE ();-- 查看当前数据库
DROP DATABASE db;-- 删除数据库
## 表操作
USE db1;-- 切换数据库
SHOW TABLES;-- 查看所有表
CREATE TABLE t_demo (-- 创建数据库
id INT PRIMARY KEY auto_increment,-- 指定该字段为主键,自增长
username VARCHAR (32),-- 字符长度为32个字节
update_time TIMESTAMP-- 时间戳类型,为空则自动填充为当前时间
) CHARACTER SET utf8mb4;-- 指定字符集的utf8mb4
CREATE TABLE t_demo_copy LIKE t_demo;-- 复制表
SHOW CREATE TABLE t_demo;-- 查看字符集或创建表语句
DESC t_demo;-- 查看表字段信息
ALTER TABLE t_demo ADD sex VARCHAR (3) AFTER username;-- 新增字段,after用于指定新字段位置
ALTER TABLE t_demo CHANGE sex gender VARCHAR (3);-- 修改某个字段的属性(名称、数据类型、字符集等)
ALTER TABLE t_demo MODIFY gender VARCHAR (3) DEFAULT '男';-- modify也可以用来修改字段属性
ALTER TABLE t_demo DROP gender;-- 删除某个字段
TRUNCATE TABLE t_demo;-- 清空整个表的数据
DROP TABLE t_demo_copy;-- 删除表
2、DML: 数据操作语句,操作数据
INSERT INTO stu (username,age,sex,address) VALUES ('郑八',22,'男','北京');-- 按指定字段插入一条数据
INSERT INTO stu VALUES (6,'钱多多',40,'男','杭州',99,23);-- 如果不指定字段则需要全字段值
DELETE FROM stu WHERE id=11;-- 删除某条数据,如果后面没有条件语句则会删除某个数据表所有数据
UPDATE stu SET username='钱八' WHERE id=6;-- 修改某条记录的字段值,如果没有指定条件语句则会更新整个表的所有记录
3、DQL: 数据查询语句,查询数据
3.1 条件查询
SELECT*FROM stu;-- 查询某个表的所有数据
SELECT username,address FROM stu;-- 查询指定字段的内容
SELECT DISTINCT address FROM stu;-- distinct表示去重,将查询出来的内容去除重复结果
SELECT username,(math+english) FROM stu;-- 查询语句中支持简单的计算
SELECT username AS 姓名,(math+english) 总分 FROM stu;-- 查询字段支持设置别名
SELECT*FROM stu WHERE math IS NULL;-- 查询为null的值不能用=号匹配,需要使用is null语句
SELECT*FROM stu WHERE math> 70;-- 条件查询,大于
SELECT*FROM stu WHERE sex !='男';-- 条件查询不等于,还可以用<>表示
SELECT*FROM stu WHERE math BETWEEN 60 AND 80;-- 区间条件可以使用between...and...类似逻辑与
select * from stu where age in (19,29,39);-- 集合条件查询,类似逻辑或
SELECT*FROM stu WHERE username LIKE '钱%';-- 模糊查询%代表任意多个字符
SELECT*FROM stu WHERE username LIKE '钱_';-- 模糊查询_表示单个字符(以当前字符集为准)
3.2 排序
SELECT*FROM stu ORDER BY IFNULL(math,85) ASC;-- 根据math的升序排序,默认是ASC升序,可以为null指定数值参与排序
SELECT*FROM stu ORDER BY age DESC;-- 按照年龄降序输出
SELECT*FROM stu ORDER BY english ASC,age DESC;-- 多个排序规则,先按英语成绩正序,成绩相同的再按年龄倒序
3.3 聚合
SELECT count(username) AS 人数 FROM stu;-- 统计username这个字段值的个数(排除null值);
SELECT avg(math),max(math),min(math),sum(math) FROM stu;-- 统计平均值、最大值、最小值、总分值(排除null值)
3.4 分组
SELECT sex,count(sex) AS 人数,avg(math),avg(english) FROM stu GROUP BY sex;-- 分组查询只能是分组的字段或聚合数据
-- where与having的区别:
-- 1、where在分组之前,having在分组之后
-- 2、where不能使用在聚合的情况下,having可以
SELECT sex,count(sex),avg(math) FROM stu WHERE sex='男' GROUP BY sex;-- 分组后的筛选只能使用having不能使用where
SELECT sex,count(sex) 人数,avg(math) FROM stu GROUP BY sex HAVING 人数> 3;-- 分组之后使用having筛选,可筛选聚合字段
SELECT sex,count(sex) 人数,max(math) FROM stu GROUP BY sex HAVING 人数> 3 ORDER BY count(sex) DESC;-- 分组查询加排序
3.5 分页
SELECT*FROM stu LIMIT 6,3;-- 从第7条开始后3条数据
3.6 约束
# 非空NOT NULL
CREATE TABLE stu (
id INT,
username VARCHAR ( 32 ) NOT NULL -- 创建表时设置非空
);
ALTER TABLE stu MODIFY username VARCHAR (32);-- 使用modify解除或设置非空限制
ALTER TABLE stu CHANGE username username VARCHAR (32) NOT NULL;-- 使用change同样可以设置或解除非空限制
# 唯一约束 UNIQUE
CREATE TABLE stu (
id INT,
username VARCHAR ( 32 ),
mobile VARCHAR ( 11 ) UNIQUE -- 创建表时设置唯一键
);
ALTER TABLE stu DROP INDEX mobile;-- 删除某字段的搜索即为取消唯一约束
ALTER TABLE stu MODIFY mobile VARCHAR (11) UNIQUE;-- 使用modify或change都可以给字段添加唯一性约束,但前提是当前表中该字段不存在重复项
# 主键PRIMARY KEY
CREATE TABLE stu (
id INT PRIMARY KEY,-- 创建表时指定主键
username VARCHAR ( 32 )
);
ALTER TABLE stu DROP PRIMARY KEY;-- 删除主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;-- 设置主键可使用modify或change操作
ALTER TABLE stu MODIFY id INT auto_increment;-- 设置字段值自增长,可以使用modify或change,不用关心主键,否则会报错
ALTER TABLE stu MODIFY id INT;-- 去掉自增长也一样,可以使用modify或change,但不能带主键属性
ALTER TABLE stu ADD PRIMARY KEY (id);-- 设置主键的另外一种方式
ALTER TABLE stu ADD PRIMARY KEY (id,username);-- 设置联合主键
# 外键
CREATE TABLE department (-- 部门信息表
id INT PRIMARY KEY auto_increment,
dep_name VARCHAR ( 20 ),
dep_location VARCHAR ( 20 )
) CHARACTER SET utf8mb4;
CREATE TABLE employee (-- 员工信息表
id INT PRIMARY KEY auto_increment,
username VARCHAR ( 32 ),
age INT,
dept_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY ( dept_id ) REFERENCES department ( id ) -- 给表添加外键,将dept_id与表department的id相关联
) CHARACTER SET utf8mb4;
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;-- 删除外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id) REFERENCES department (id);-- 添加外键
-- 添加数据
INSERT INTO department VALUES (1,'研发部','广州');--
INSERT INTO department VALUES (2,'销售部','深圳');--
INSERT INTO employee VALUES (1,'张三',29,1);--
INSERT INTO employee VALUES (2,'李四',29,1);--
INSERT INTO employee VALUES (3,'王五',29,1);--
INSERT INTO employee VALUES (4,'赵六',29,2);--
INSERT INTO employee VALUES (5,'田七',29,2);--
INSERT INTO employee VALUES (6,'钱八',29,2);--
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dept_id) REFERENCES department (id) ON UPDATE CASCADE;-- 修改外键设置级联更新
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;-- 删除外键约束
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dept_id) REFERENCES department (id) ON DELETE CASCADE ON update CASCADE;-- 修改外键设置级联更新与删除
4、DCL: 数据控制语句,权限控制,管理用户,授权
4.1、用户管理
# 查询,用户信息保存在mysql数据库的user表中
SHOW TABLES;
SELECT*FROM user;
# 创建用户
CREATE USER 'yusian' @'localhost' IDENTIFIED BY 'Root@123';
# 删除用户
DROP USER 'yusian'@'localhost';
# 修改用户密码
-- 方式一:修改表字段
UPDATE USER SET authentication_string=PASSWORD ('Root@123') WHERE USER='yusian';
FLUSH PRIVILEGES;-- 如果是修改数据库字段值的方式修改,则需要手动刷新用户权限以使其生效
-- 方式二:set password命令,当前用户可以直接使用set password=password('xxx');
SET PASSWORD FOR 'yusian' @'localhost'=PASSWORD ('Root@123'); -- 立即生效,不需要flush privileges
-- 如果忘记密码了,使用skip-grant-tables临时取消鉴权,然后进入mysql修改密码
# 1、停止mysql服务
# 2、mysqld --user=root --skip-grant-tables
# 3、mysql直接进入数据库控制台,修改密码
4.2、权限管理
SHOW GRANTS FOR 'root' @'localhost';-- 查看权限
# 授权
GRANT ALL ON*.*TO 'xxx' @'xxx';
GRANT SELECT ON db3.account TO 'yusian' @'localhost';
# 撤销权限
REVOKE ALL ON*.*FROM 'xxx' @'xxx';
REVOKE ALL ON db3.account FROM 'yusian' @'localhost';