MySQL基础篇之SQL语言——DDL、DML、DQL、DCL

02、SQL

2.1、SQL通用语法

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

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

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

4、注释:

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

2.2、SQL分类

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

2.3、DDL

2.3.1、DDL-数据库操作

1、查询

  • 查询所有数据库

    SHOW DATABASES;
    
  • 查询当前数据库

    SELECT DATABASE();
    

2、创建

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

3、删除

DROP DATABASE [IF EXISTS] 数据库名;

4、使用

USE 数据库名;

2.3.2、DDL-表操作

2.3.2.1、查询

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

SHOW TABLES;

2、查询表结构

DESC 表名;

3、查询指定表的建表语句

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

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

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第1张图片

2.3.2.3、数据类型

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

(1)数值类型

类型 大小 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 bytes (-8388608,8388607) (0,16777215) 大整数值
INT或INTEGER 4 bytes (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 bytes (-263,263-1) (0,2^64-1) 极大整数值
FLOAT 4 bytes (-3.402823466 E+38,3.402823466351 E+38) 0和(1.175494351 E+38,3.402823466 E+38) 单精度浮点数值
DOUBLE 8 bytes (-1.7976931348623157 E+308, 1.7976931348623157 E+308) 0和(2.2250738585072014 E-308,1.7976931348623157 E+308) 双精度浮点数值
DECIMAL 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 小数值(精确点数)

① 精度:整个数字的位数;标度:小数的位数 如:123.45的精度是5,标度是2

② 举例:

  • 对于年龄可以定义为:age TINYINT UNSIGNED

  • 对于成绩可以定义为:score double(4,1)

    其中,4表示score的整体长度,1表示小数的位数

(2)字符串类型

类型 大小 描述
CAHR 0-255 bytes 定长字符串
VARCAHR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过255个字符的二进制数据
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65535 bytes 二进制形式的长文本数据
TEXT 0-65535 bytes 长文本数据
MEDIUMBLOB 0-16777215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16777215 bytes 中等长度文本数据
LONGBLOB 0-4294967295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4294967295 bytes 极大文本数据

① char、varchar的比较

  • char(10)存储一个字符时,会占用10个字符的空间,其余位用空格补位

    varchar(10)存储一个字符时,就占用1个字符的空间 【varchar(10)表示只能存储10个字符的数据】

  • char的性能好,varchar的性能较差

    原因:varchar在使用过程中要根据内容来计算所要占的空间

② 举例:

  • 对于用户名可以定义为:username varchar(50)
  • 对于性别可以定义为:gender char(1)

(3)日期时间类型

类型 大小 范围 格式 描述
DATA 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 1901至 2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

① 举例:

  • 对于生日可以定义为:birthday date

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

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

(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 '员工信息表';

查看表的结构:

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第2张图片

2.3.2.4、修改

1、在表中添加字段

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

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

alter table tb_employee add nickname varchar(20) comment '昵称';

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第3张图片

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 '用户名';

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第4张图片

4、修改表名

ALTER TABLE 表名 RENAME TO 新表名;

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

alter table tb_employee rename to employee;
2.3.2.5、删除

1、删除字段

ALTER TABLE 表名 DROP 字段名;

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

alter table tb_employee drop username;

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第5张图片

2、删除表

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

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

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

2.4、DML

2.4.1、DML介绍

1、DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。

2、包括:

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

2.4.2、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,...);

注意:

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

案例:

#给指定字段添加数据
insert into employee (id, workNo, employName, gender, age, idCard, entryDate) values (1, '1', '张三', '男', 20, '123456789012345678','2000-01-01');

#批量插入
insert into employee values (3, '3', '王五', '女', 25, '123456789012345678','2011-02-01'),(4, '4', '赵六', '女', 28, '123456789012345678','2002-02-01');

结果:

在这里插入图片描述

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

结果:

MySQL基础篇之SQL语言——DDL、DML、DQL、DCL_第6张图片

2.4.3、DML-删除数据

1、语法:

DELETE from 表名 [where 条件];

注意:

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

2、案例

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

-- 删除所有员工
delete from employee;

2.5、DQL

2.5.1、DQL介绍

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

2、查询关键字:select

3、DQL-语法

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

4、分类

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

2.5.2、DQL-基础查询

1、查询多个字段

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

2、设置别名

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

设置别名时,as可以省略。

3、去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

4、案例:

-- 基本查询
-- 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;

2.5.3、DQL-条件查询

1、语法:

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

2、条件

(1)比较运算符

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

(2)逻辑运算符

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

3、案例:

-- 条件查询
-- 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个_

2.5.4、DQL-聚合函数

1、介绍

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

2、常见聚合函数

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

3、语法

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

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

4、案例

-- 聚合函数
-- 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 = '广州';

2.5.5、DQL-分组查询

1、语法

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

2、where和having区别

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

3、案例:

-- 分组查询
-- 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
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

2.5.6、DQL-排序查询

1、语法:

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

2、排序方式;

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

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

3、案例:

-- 排序查询
-- 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 ;

2.5.7、DQL-分页查询

1、语法:

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

注意:

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

2、案例:

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

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

2.5.8、DQL-案例练习

按照需求完成如下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 ;

2.5.9、DQL-执行顺序

1、编写顺序

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

2、执行顺序

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

2.6、DCL

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

2.6.1、DCL-管理用户

1、查询用户

USE mysql;
SELECT * FROM user;

2、创建用户

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

3、修改用户密码

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

4、删除用户

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 数据库管理员) 使用。

2.6.2、DCL-权限控制

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

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

1、查询权限

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

2、授予权限

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

3、撤销权限

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

你可能感兴趣的:(mysql,sql,数据库,DML,DQL)