MySQL笔记之SQL语言——DDL、DML、DQL、DCL

145 阅读13分钟

SQL语言

SQL语法

1、SQL语句可以单行或多行书写,以分号结尾。

2、SQL语句可以使用空格/缩进来增强语句的可读性。

3、MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。

4、注释:

  • 单行注释:--注释内容#注释内容(MySQL特有)
  • 多行注释:/*注释内容*/

SQL分类

分类全称说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库、表、字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

DDL-数据库操作

查询

  • 查询所有数据库

    SHOW DATABASES;
    
    
  • 查询当前数据库

    SELECT DATABASE();
    
    

创建

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

删除

DROP DATABASE [IF EXISTS] 数据库名;

使用

USE 数据库名;

DDL-表操作

查询

  1. 查询当前数据库所有表

    SHOW TABLES;
    
    
  2. 查询表结构

    DESC 表名;
    
    
  3. 查询指定表的建表语句

    SHOW CREATE TABLE 表名;
    
    

创建

CREATE TABLE 表名(
    字段1 字段1类型[COMMENT 字段1注释],
    字段2 字段2类型[COMMENT 字段2注释],
    字段3 字段3类型[COMMENT 字段3注释],
    ……
    字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];

注意:[……]为可选参数,最后一个字段后面没有逗号

数据类型

  1. MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。

  2. 字符串类型

  3. 日期时间类型

  4. 案例:根据需求创建表(设计合理的数据类型、长度)

    设计一张员工信息表,要求如下:

    (1)编号(纯数字)

    (2)员工工号(字符串类型,长度不超过10位)

    (3)员工姓名(字符串类型,长度不超过10位)

    (4)性别(男/女,存储一个汉字)

    (5)年龄(正常人年龄,不可能存储负数)

    (6)身份证号(二代身份证号均为18位,身份证中有X这样的字符)

    (7)入职时间(取值年月日即可)

    create table tb_employee(
        id int comment '编号',
        workNo varchar(10) comment '员工工号',
        employName varchar(20) comment '员工姓名',
        gender char(1) comment '性别',
        age tinyint unsigned comment '年龄',
        idCard char(18) comment '身份证号',
        entryDate date comment '入职时间'
    ) comment '员工信息表';
    
    

修改

  1. 在表中添加字段

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

    案例:为tb_emplyee表增加一个新的字段"昵称"为nickname,类型为varchar(20)

    alter table tb_employee add nickname varchar(20) comment '昵称';
    
    
  2. 在表中修改数据类型

    ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
    
    
  3. 在表中修改字段名和字段类型

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

    案例:将tb_employee表的nickname字段修改为username,类型为varchar(30)

    alter table tb_employee change nickname username varchar(30) comment '用户名';
    
    
  4. 修改表名

    ALTER TABLE 表名 RENAME TO 新表名;
    
    

    案例:将tb_employee表的表名修改为employee

    alter table tb_employee rename to employee;
    
    

删除

  1. 删除字段

    ALTER TABLE 表名 DROP 字段名;
    
    

    案例:将tb_employee表的字段username删除

    alter table tb_employee drop username;
    
    
  2. 删除表

    • 删除表

      DROP TABLE [IF EXISTS] 表名;
      
      
    • 删除指定表,并重新创建表

      TRUNCATE TABLE 表名;
      
      

      使用truncate删除表,可以删除表中的数据,最后重新创建一个空表,表中只有表的结构。

      注意:在删除表时,表中的全部数据也会被删除。

DML操作

DML介绍

  1. DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。
  2. 包括:
    • 添加数据(INSERT)
    • 修改数据(UPDATE)
    • 删除数据(DELETE)

DML-添加数据

  1. 给指定字段添加数据

    INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2,...);
    
    
  2. 给全部字段添加数据

    INSERT INTO 表名 VALUES (值1,值2,...);
    
    
  3. 批量添加数据

    INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
    
    
    INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),(值1,值2,...);
    
    

    注意:

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

DML-修改数据

  1. 语法:

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

    注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。

  2. 案例

    -- 修改id为1的数据,将employeeName修改为zhangsan
    update employee set employName = 'zhangsan' where id = 1;
    
    -- 修改id为1的数据,将employName修改为小昭,gender修改为女
    update employee set employName = '小昭', gender = '女' where id = 1;
    
    -- 将所有员工的入职日期修改为 2008-01-01
    update employee set entryDate = '2018-01-01';
    
    

DML-删除数据

  1. 语法:

    DELETE from 表名 [where 条件];
    
    
  2. 案例

    -- 删除gender为男的员工
    delete from employee where gender = '男';
    
    -- 删除所有员工
    delete from employee;
    
    

DQL

介绍

DQL英文全称是Data Query Language(数据查询语言),用来查询数据库中表的记录。

关键字

查询关键字:select

DQL语法

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

分类

  • 基本查询
  • 条件查询(where)
  • 聚合函数(count、max、min、avg、sum)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)

DQL基础查询

查询多个字段

SELECT 字段1,字段2,字段3 ... FROM 表名;
SELECT * FROM 表名;

设置别名

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

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

案例

-- 基本查询
-- 1.查询指定字段 employeeName,workNo,age 返回
select employName,workNo,age from employee;

-- 2.查询所有字段返回
select * from employee;

-- 3.查询所有员工的工作地址,起别名
select workAddress as '工作地址' from employee;
select workAddress '工作地址' from employee;

-- 4.查询公司员工的上班地址(不用重复)
select distinct workAddress from employee;

DQL-条件查询

语法

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

条件

(1)比较运算符

比较运算符功能
大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
BETWEEN … AND …在某个范围之内(含最小、最大值)
IN(…)在in之后的列表中的值,多选一
LIKE 占位符模糊匹配(_匹配单个字符,%匹配任意个字符)
IS NULL是 NULL

(2)逻辑运算符

逻辑运算符功能
AND 或 &&并且(多个条件同时成立)
OR 或||或者(多个条件任意一个成立)
NOT 或 !非,不是

案例

-- 条件查询
-- 1.查询年龄等于28的员工信息
select * from employee where age = 28;

-- 2.查询年龄小于20的员工信息
select * from employee where age < 20;

-- 3.查询年龄小于等于28的员工信息
select * from employee where age <= 28;

-- 4.查询没有身份证号的员工信息
select * from employee where idCard is null;

-- 5.查询有身份证号的员工信息
select * from employee where idCard is not null;

-- 6.查询年龄不等于28的员工信息
select * from employee where age != 28;
select * from employee where age <> 28;

-- 7.查询年龄在15岁(包含)到20岁(包含)之间的员工信息
select  * from employee where age >= 15 and age <=20;
select  * from employee where age >= 15 && age <=20;
select  * from employee where age between 15 and 20;

-- 8.查询性别为女且年龄小于28岁的员工信息
select * from employee where gender = '女' and age < 28;

-- 9.查询年龄等于18 或 28 或38的员工信息
select * from employee where age = 18 or age = 28 or age = 38;
select * from employee where age in (18, 28, 38);

-- 10.查询姓名为两个字的员工信息
select * from employee where employName like '__';

-- 11.查询身份证号最后一位为X的员工信息
select * from employee where idCard like '%X';
select * from employee where idCard like '_________________X';#17个_

DQL-聚合函数

介绍

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

常见聚合函数

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

注意:null值不参与所有聚合函数运算。

案例

-- 聚合函数
-- 1.统计该企业员工数量
select count(*) num from employee;

-- 2.统计该企业员工的平均年龄
select avg(age) avgAge from employee;

-- 3.统计该企业员工的最大年龄
select max(age) maxAge from employee;

-- 4.统计该企业员工的最小年龄
select min(age) minAge from employee;

-- 5.统计广州地区员工的年龄之和
select sum(age) sumAge from employee where workAddress = '广州';

DQL-分组查询

语法

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

where和having区别

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

案例

-- 分组查询
-- 1.根据性别分组,统计男性员工和女性员工的数量
select gender,count(*) from employee group by gender;

-- 2.根据性别分组,统计男性员工与女性员工的平均年龄
select gender, avg(age) from employee group by gender;

-- 3.查询年龄小于28的员工,并根据工作地址分组,获取员工数量大于等于2的工作地址
select workAddress, count(*) address_count from employee where age < 28 group by workAddress having count(*) >= 2;

注意:

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

DQL-排序查询

语法格式:

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

排序方式

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

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

案例

-- 排序查询
-- 1.根据年龄对公司的员工进行升序排序
select * from employee order by age asc;
select * from employee order by age;

-- 2.根据入职时间,对员工进行降序排序
select * from employee order by entryDate desc ;

-- 3.根据年龄对员工进行升序排序,年龄相同,再按照入职时间进行降序排序
select * from employee order by age asc , entryDate desc ;
select * from employee order by age, entryDate desc ;

DQL-分页查询

语法

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

注意:

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

案例

-- 分页查询
-- 1.查询第1页员工数据,每页展示3条记录
select * from employee limit 0,3;
select * from employee limit 3;

-- 2.查询第二页员工数据,每页展示3条记录
select * from employee limit 3,3;

总结-案例练习

按照需求完成如下DQL语句编写

1.查询年龄为20,21,22,23岁的女性员工信息。

2.查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。

3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。

4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。

5.查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。

-- 1.查询年龄为20,21,22,23岁的女性员工信息。
select * from employee where age in (20,21,22,23) and gender = '女';

-- 2.查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。
select * from employee where gender = '男' and  ( age between 20 and 40 ) and employName like '___';

-- 3.统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender, count(*) from employee where age < 60 group by gender;

-- 4.查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select employName, age from employee where age <= 35 order by age asc , entryDate desc;

-- 5.查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from employee where gender = '男' and (age between 20 and 40) order by age asc, entryDate asc limit 5 ;

DQL-执行顺序

编写顺序

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

执行顺序

① FROM 
	表名列表
② WHERE 
	条件列表
③ GROUP BY 
	分组字段列表
  HAVING 
	分组后条件列表
④ SELECT 
	字段列表
⑤ ORDER BY 
	排序字段列表
⑥ LIMIT 
	分页参数

DCL

简介

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。

DCL-管理用户

查询用户

USE mysql;
SELECT * FROM user;

创建用户

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

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';

删除用户

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

练习案例

-- 创建用户 itcast,只能够在当前主机localhost访问,密码是123456
create user 'itcast'@'localhost' identified by '123456';

-- 创建用户heima,可以在任意主机访问该数据库,密码是123456
create user 'heima'@'%' identified by '123456';

-- 修改用户heima的访问密码是1234
alter user 'heima'@'%' identified  with  mysql_native_password by '1234';

-- 删除itcast@localhost用户
drop user 'itcast'@'localhost';

注意:

  • 主机名可以使用%通配。
  • 这类SQL开发人员操作的比较少,主要是DBA(Database Administrator 数据库管理员) 使用。

DCL-权限控制

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

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

查询权限

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

授予权限

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

撤销权限

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