02-SQL

SQL

Structured Query Language,结构化查询语言

通用语法

  1. SQL语句可以单行或多行书写,以分号(;)结尾
  2. SQL语句可以使用空格/缩进来增强语句的可读性
  3. MySQL数据库的SQL语句不区分大小写关键字建议大写
  4. 注释:
    • 单行注释:--注释内容 或 #注释内容(MySQL特有
    • 多行注释:/* 注释内容 */

SQL分类

分类 全称 说明
DDL Data Definition Language 数据定义语言,定义数据库对象(数据库,表,字段)
DML Data Manipulation Language 数据操作语言,对数据库表中的数据进行增删改
DQL Data Query Language 数据选择语言,查询数据库中表的记录
DCL Data Control Language 数据控制语言,创建数据库用户,控制数据库的访问权限

DDL

数据库操作

查询

查询所有数据库

SHOW DATABASES;

查询当前数据库

SELECT DATABASE();

创建

CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集][COLLATE 排序规则];

[ ]里的内容都是可选的,写的时候不要加[ ]

注意:字符集如果用UTF8时,默认是3个字节,而数据库中有特殊字符为4个字节,这时默认字符集就为utf8mb4

删除

DROP DATABASE[IF EXISTS] 数据库名;

使用

USE 数据库名;

表操作

查询

查询当前数据库所有表

SHOW TABLES;

查询表结构

DESC 表名;

查询指定表的建表语句

SHOW CREATE TABLE 表名;

展示创建表时设置的各种comment注释

创建

不要在系统库中执行任何操作

操作前,一定先select database()检查当前所在数据库,如果在系统库,use 自定义库

CREATE TABLE 表名(
	字段1 字段1类型 [COMMENT '字段1注释'],
    字段2 字段2类型 [COMMENT '字段2注释'],
    字段3 字段3类型 [COMMENT '字段3注释'],
    ...
    字段n 字段n类型 [COMMENT '字段n注释']
    -- 注意,最后一行没有,(逗号)
    -- 注释要加到''里
)[COMMENT '表注释'];

数据类型

修改

添加字段

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT '注释'] [约束];

修改数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT '注释'] [约束];

删除字段

ALTER TABLE 表名 DROP 字段名;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

删除表

DROP TABLE [IF EXISTS] 表名;

删除指定表,并重新创建该表

TRUNCATE TABLE 表名;

删除表时,表中数据全会被删除

DML

Data Manipulation Language

对表中数据记录进行增删改操作

  • 添加数据 (INSERT)
  • 修改数据 (UPDATE)
  • 删除数据 (DELETE)

添加数据

指定字段添加数据

insert into 表名(字段1,字段2,...,字段n) values(值1,值2,...,值n);
-- values也可以写成value

所有字段添加数据

insert into 表名 values(值1,值2,...,值n);

批量添加数据

insert into 表名(字段1,字段2,...,字段n) values(值1,值2,...,值n),(值1,值2,...,值n),(值1,值2,...,值n)...;

insert into 表名 values(值1,值2,...,值n),(值1,值2,...,值n),(值1,值2,...,值n)...;

-- 多段数据间用逗号分隔即可

注意:

  • 插入数据时,指定字段顺序需要与值的顺序一一对应
  • 字符串与日期型数据应包含在引号
  • 插入数据的大小,应在字段的规定范围内

修改数据

UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,... [WHERE 条件];

条件可以有,也可以没有,不加WHERE 条件就会修改该表所有数据

删除数据

DELETE FROM 表名 [WHERE 条件];

注意:

  • 条件可有可无,如果无,则会删除整张表的所有数据
  • DELETE语句不能删除某一个字段的值(可以使用UPDATE)

DQL

Data Query Language

用来查询数据库中表的记录

关键字:SELECT

基本查询

1.查询多个字段

SELECT 字段1,字段2,字段3 FROM 表名;
	
SELECT * FROM 表名;
-- 尽量不要写 * ,如果要返回全部字段,就把所有字段全写上

2.设置别名

SELECT 字段1 [AS 别名1],字段2 [AS 别名2] ... FROM 表名;

-- 这个不会修改字段的值,要修改还是要通过表操作:
-- alter table 表名 change 旧字段名 新字段名 数据类型(长度);

3.去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件

比较运算符 功能
>,>=,<,<=,= 正常的大于小于,大小于等于,等于
<> 或 != 不等于
BETWEEN...AND... 在某个范围之内(含最小最大值)
IN(...) 在in之后的列表中的值,多选一
LIKE 占位符 模糊匹配(_匹配单个字符,%匹配任意个字符)
IS NULL 是NULL
逻辑运算符 功能
AND 或 && 并且(多个条件同时成立)
OR 或 II 或者(多个条件任意一个成立)
NOT 或 ! 非,不是
-- 判定NULL值
select * from 表名 where 字段名 is null;

-- 查询age等于18或20或40的员工信息
select * from 表名 where age=18 or age=20 or age=40;
select * from 表名 where age in(18,20,40)
-- in()中的条件满足其一即可

-- 查询name为两个字的员工信息
select * from 表名 where name like '__';

-- 查询身份证最后一位是X的员工信息
select * from 表名 where idcard like '%X';
select * from 表名 where idcard like '_________________X';
-- %:表示前面不管有多少字符,只要最后一位是X就行
-- _:可以用17个_来表示前面的字符,X就是第18位

分组查询

聚合函数

一列数据作为一个整体,进行纵向计算

常见聚合函数

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

语法:

SELECT 聚合函数(字段序列) FROM 表名

注意: NULL值不参与所有聚合运算

分组查询

语法:

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件];
-- 字段列表可以有多个,可以用聚合函数,中间逗号隔开

Where 与 having的区别

  • 执行时机: where是分组前过滤,不满足where条件,不参与分组;having是分组之后对结果进行过滤
  • 判断条件:where不能对聚合函数进行判断,having可以
-- 根据性别分组,统计男员工和女员工的数量
 select gender,count(gender) from emp group by gender;
 
-- 根据性别分组,统计男员工和女员工的平均年龄
 select gender,avg(age) from emp group by gender;
 
-- 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
 select address,count(*) from emp where age<45 group by address having count(*) >= 3

注意:

  • 执行顺序:where >聚合函数 > having
  • 分组之后,查询的一般为聚合函数和分组字段,查询其他字段无意义

排序查询

语法:

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;

排序方式

  • ASC:升序(默认值)
  • DESC:降序

注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

分页查询

语法:

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数

注意:

  • 起始索引从0开始,起始索引=(查询页数-1) * 每页显示记录数,索引是记录行,不是页数
  • 分页查询是数据库方言,不同数据库管理系统有不同的实现,MySQL中是LIMIT
  • 如果查询的是第一页数据,起始索引可以省略,直接

用于查询前几个员工

执行顺序

编写顺序

SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

执行顺序

FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
SELECT
	字段列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

通过别名来测试

select e.name ename e.age eage from emp e where e.age>15 order by eage;

DCL

Data Control Language

用来管理数据库用户,控制数据库的访问权限

管理用户

查询用户

USE mysql;
SELECT * FROM user;

创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

create user 'syz'@'%' identified by '1234';
-- 可以在任意主机访问该数据库

修改密码

alter user 'syz'@'%' identified with mysql_native_password by '123456';
-- 'syz'@'%' 范围与创建时一致

删除用户

DROP USER '用户名'@'主机名';

权限控制

MySQL中定义了很多种权限,但常用的就以下几种

权限 说明
ALL,ALL PRIVILEGES 所有权限
SELECT 查询权限
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表

查询权限

SHOW GRANTS FOR '用户名'@'主机名';

授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

grant all on myfirstdb.* to 'syz'@'%';

撤销权限

REVOKE 权限列表 ON 数据库名.表名 from '用户名'@'主机名';

revoke all on myfirst.* from 'syz'@'%';

注意:

  • 多个权限之间,使用逗号分割
  • 授权时,数据库名和表名可以使用*进行通配,代表所有
posted @ 2024-09-13 21:44  SyzTak  阅读(14)  评论(0)    收藏  举报