常用的SQL语句汇总

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';

Leave a Reply