MySQL-----DDL、DML、DQL

目录

 1、SQL分类及书写规范

1.1、分类

1.2、书写规范 

 2、DDL:操作数据库

2.1、查询

2.2、创建数据库

2.3、删除数据库

 2.4、使用数据库

3、DDL:操作表

3.1、查询表

3.2、创建表

3.3、数据类型

3.3.1、数值

3.3.2、日期和时间

3.3.3、字符串 

3.3.4、 案例

3.4、删除表

3.5、修改表

4、 DML

4.1、添加数据

4.2、修改数据

4.3 、删除数据

 5、DQL

5.1、基础查询

5.1.1、语法

5.1.2、练习 

5.2、条件查询

5.2.1、语法及运算符

5.2.2、条件查询练习

5.2.3、模糊查询练习

5.3、排序查询

 5.3.1、语法

5.3.2、练习

 5.4、聚合函数

5.4.1、概念

5.4.2、聚合函数分类

5.4.3、聚合函数语法 

 5.4.4、练习

 5.6、分组查询

5.6.1、语法 

5.6.2、练习

 5.7、分页查询

5.7.1、语法

5.7.2、练习 


 1、SQL分类及书写规范

1.1、分类

- DDL(Data Definition Language) : 数据定义语言,用来定义数据库对象:数据库,表,列等。DDL简单理解就是用来操作数据库,表等

- DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改。DML简单理解就对表中数据进行增删改

- DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据)。DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。

- DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户。DML简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等。

1.2、书写规范 

- MySQL Windows 环境下是大小写不敏感的
- MySQL Linux 环境下是大小写敏感的
        数据库名、表名、表的别名、变量名是严格区分大小写的
        关键字、函数名、列名( 或字段名 ) 、列的别名 ( 字段的别名 ) 是忽略大小写的。
- 推荐采用统一的书写规范:
        数据库名、表名、表别名、字段名、字段别名等都小写
        SQL 关键字、函数名、绑定变量等都大写
- SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以 ; \g \G 结束
- 关键字不能被缩写也不能分行
- 关于标点符号
        必须保证所有的() 、单引号、双引号是成对结束的
        必须使用英文状态下的半角输入方式
        字符串型和日期时间类型的数据可以使用单引号(' ')表示 列的别名,尽量使用双引号(" "),而且不建议省略 as

 2、DDL:操作数据库

操作数据库主要就是对数据库的增删查操作。

2.1、查询

查询所有的数据库

SHOW DATABASES;

运行语句效果如下:  

上述查询到的是的这些数据库是mysql安装好自带的数据库,以后不要操作这些数据库。  

2.2、创建数据库

- 创建数据库

CREATE DATABASE 数据库名称;

运行语句效果如下:

在创建数据库的时候,我并不知道db1数据库有没有创建,直接再次创建名为db1的数据库就会出现错误。

为了避免上面的错误,在创建数据库的时候先做判断,如果不存在再创建。

 - 创建数据库(判断,如果不存在则创建)

CREATE DATABASE IF NOT EXISTS 数据库名称;

运行语句效果如下:

从上面的效果可以看到虽然db1数据库已经存在,再创建db1也没有报错,而创建db2数据库则创建成功。

2.3、删除数据库

删除数据库

DROP DATABASE 数据库名称; 

删除数据库(判断,如果存在则删除)  

DROP DATABASE IF EXISTS 数据库名称;

运行语句效果如下:

 2.4、使用数据库

数据库创建好了,要在数据库中创建表,得先明确在哪个数据库中操作,此时就需要使用数据库。

使用数据库

USE 数据库名称;

查看当前使用的数据库

SELECT DATABASE();

运行语句效果如下:

3、DDL:操作表

操作表也就是对表进行增(Create)删(Retrieve)改(Update)查(Delete)。

3.1、查询表

查询当前数据库下所有表名称

SHOW TABLES;

查询表结构

DESC 表名称; 

查看mysql数据库中func表的结构,运行语句如下:

其中,Filed为字段,Type为类型,。

3.2、创建表

创建表

CREATE TABLE 表名 (
    字段名1  数据类型1,
    字段名2  数据类型2,
    …
    字段名n  数据类型n
);

注意:最后一行末尾,不能加逗号  

在db1创建如下结构的表:

 

3.3、数据类型

MySQL 支持多种类型,可以分为三类:

3.3.1、数值

- tinyint:小整数型,占一个字节

- int:大整数类型,占四个字节
        eg : age int

- double : 浮点类型
        使用格式: 字段名 double(总长度,小数点后保留的位数)
        eg :表示分数0~100,保留两位小数:score double(5,2) ,其中,5为小数点前的100的位数3+保留的小数2  

3.3.2、日期和时间

 date : 日期值。只包含年月日
        eg :birthday date 
datetime : 混合日期和时间值。包含年月日时分秒

3.3.3、字符串 

char : 定长字符串。
        优点:存储性能高
        缺点:浪费空间
        eg : name char(10)  如果存储的数据字符个数不足10个,也会占10个的空间
varchar : 变长字符串。
        优点:节约空间
        缺点:存储性能底
        eg : name varchar(10) 如果存储的数据字符个数不足10个,那就数据字符个数是几就占几个的空间     

3.3.4、 案例

需求:设计一张学生表,请注重数据类型、长度的合理性
    1. 编号
    2. 姓名,姓名最长不超过10个汉字
    3. 性别,因为取值只有两种可能,因此最多一个汉字
    4. 生日,取值为年月日
    5. 入学成绩,小数点后保留两位
    6. 邮件地址,最大长度不超过 64
    7. 家庭联系电话,不一定是手机号码,可能会出现 - 等字符
    8. 学生状态(用数字表示,正常、休学、毕业...)

设计:

create table student(
    id int,
    name varchar(10),
    gender char(1),
    birthday date,
    score double(5, 2),
    email varchar(64),
    tel varchar(15),
    status tinyint
);

3.4、删除表

删除表

DROP TABLE 表名;

删除表时判断表是否存在

DROP TABLE IF EXISTS 表名;

运行语句效果如下:

3.5、修改表

修改表名

ALTER TABLE 表名 RENAME TO 新的表名;

-- 将表名student修改为stu
alter table student rename to stu;

添加一列

ALTER TABLE 表名 ADD 列名 数据类型;

-- 给stu表添加一列address,该字段类型是varchar(50)
alter table stu add address varchar(50);

修改数据类型

ALTER TABLE 表名 MODIFY 列名 新数据类型;

-- 将stu表中的address字段的类型改为 char(50)
alter table stu modify address char(50);

修改列名和数据类型

ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;

-- 将stu表中的address字段名改为 addr,类型改为varchar(50)
alter table stu change address addr varchar(50);

删除列

ALTER TABLE 表名 DROP 列名;

-- 将stu表中的addr字段 删除
alter table stu drop addr;

4、 DML

DML主要是对数据进行增(insert)删(delete)改(update)操作。

4.1、添加数据

给指定列添加数据

INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);

给全部列添加数据(可省略列名)

INSERT INTO 表名 VALUES(值1,值2,…); 

批量添加数据

INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;

-- 查询所有数据	
SELECT * FROM stu;

-- 给指定列添加数据
INSERT INTO stu (id, NAME) VALUES (1, '张三');

-- 给所有列添加数据,列名的列表可以省略的
INSERT INTO stu (id,NAME,sex,birthday,score,email,tel,STATUS) VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);

INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);

-- 批量添加数据
INSERT INTO stu VALUES 
	(2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),
	(2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),
	(2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);

4.2、修改数据

修改表数据

UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ;

注意:

  1. 修改语句中如果不加条件,则将所有该列数据都修改!

  2. 像上面的语句中的中括号,表示在写sql语句中可以省略这部分

举例:

- 将张三的性别改为女

update stu set sex = '女' where name = '张三'; 

- 将张三的生日改为 1999-12-12 分数改为99.99  

update stu set birthday = '1999-12-12', score = 99.99 where name = '张三';

- 注意:如果update语句没有加where条件,则会将表中所有数据全部修改!

update stu set sex = '女'; 

4.3 、删除数据

删除数据

DELETE FROM 表名 [WHERE 条件] ;

-- 删除张三记录
delete from stu where name = '张三';

-- 删除stu表中所有的数据
delete from stu;

 5、DQL

查询语法:

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

本节用到的表

-- 删除stu表
drop table if exists stu;


-- 创建stu表
CREATE TABLE stu (
 id int, -- 编号
 name varchar(20), -- 姓名
 age int, -- 年龄
 sex varchar(5), -- 性别
 address varchar(100), -- 地址
 math double(5,2), -- 数学成绩
 english double(5,2), -- 英语成绩
 hire_date date -- 入学时间
);

-- 添加数据
INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date) 
VALUES 
(1,'马运',55,'男','杭州',66,78,'1995-09-01'),
(2,'马花疼',45,'女','深圳',98,87,'1998-09-01'),
(3,'马斯克',55,'男','香港',56,77,'1999-09-02'),
(4,'柳白',20,'女','湖南',76,65,'1997-09-05'),
(5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'),
(6,'刘德花',57,'男','香港',99,99,'1998-09-01'),
(7,'张学右',22,'女','香港',99,99,'1998-09-01'),
(8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');

5.1、基础查询

5.1.1、语法

查询多个字段

SELECT 字段列表 FROM 表名;
SELECT * FROM 表名; -- 查询所有数据

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名; 

起别名

AS: AS 也可以省略 

eg:

-- 查询姓名,数学成绩,英语成绩
SELECT name AS 姓名, math AS 数学成绩, english AS 英语成绩 FROM stu;
SELECT name 姓名, math 数学成绩, english 英语成绩 FROM stu;

5.1.2、练习 

-- 基础查询
-- 查询name,age两列
SELECT name,age from stu;

-- 查询所有列的数据
SELECT * FROM stu;

-- 查询地址信息
SELECT address from stu;

-- 去除重复记录
SELECT DISTINCT address FROM stu;


-- 查询姓名,数学成绩,英语成绩
SELECT name AS 姓名, math AS 数学成绩, english AS 英语成绩 FROM stu;
SELECT name 姓名, math 数学成绩, english 英语成绩 FROM stu;

5.2、条件查询

5.2.1、语法及运算符

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

注:条件列表可以使用以下运算符 

5.2.2、条件查询练习

-- 条件查询
-- 查询年龄大于20岁的学员信息
SELECT * FROM stu WHERE age > 20;

-- 查询年龄大于等于20岁的学员信息
SELECT * FROM stu WHERE age >= 20;

-- 查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息
SELECT * FROM stu WHERE age >=20 && age <=30;
SELECT * FROM stu WHERE age >=20 AND age <=30;
SELECT * FROM stu WHERE age BETWEEN 20 AND 30;

-- 查询入学日期在'1998-09-01' 到 '1999-09-01'  之间的学员信息
SELECT * FROM STU WHERE hire_date BETWEEN "1998-09-01" AND "1999-09--01";

-- 查询年龄等于18岁的学员信息
SELECT * FROM stu WHERE age == 18; -- 错误,只需要一个=
SELECT * FROM stu WHERE age = 18;

-- 查询年龄不等于18岁的学员信息
SELECT * FROM stu WHERE age != 18;
SELECT * FROM stu WHERE age <> 18;

-- 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
SELECT * FROM stu WHERE age = 18 || age = 20 || age = 22;
SELECT * FROM stu WHERE age = 18 OR age = 20 OR age = 22;
SELECT * FROM stu WHERE age IN(18, 20, 22);

-- 查询英语成绩为 NULL的学员信息
-- null值的比较不能使用 =  或者 != 。需要使用 is  或者 is not
SELECT * FROM stu WHERE english = NULL; -- 这是不行的
SELECT * FROM stu WHERE english is NULL;

5.2.3、模糊查询练习

模糊查询使用like关键字,可以使用通配符进行占位:

(1)_ : 代表单个任意字符

(2)% : 代表任意个数字符  

-- 模糊查询 LIKE
-- 查询姓'马'的学员信息
SELECT * FROM stu WHERE name LIKE "马%";

-- 查询第二个字是'花'的学员信息  
SELECT * FROM stu WHERE name LIKE "_花%";

-- 查询名字中包含 '德' 的学员信息
SELECT * FROM stu WHERE name LIKE "%德%";

5.3、排序查询

 5.3.1、语法

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

上述语句中的排序方式有两种,分别是:

  • ASC : 升序排列 (默认值)

  • DESC : 降序排列

注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序  

5.3.2、练习

-- 排序查询
-- 查询学生信息,按照年龄升序排列 
SELECT * FROM stu ORDER BY age ASC; -- ASC可省略不写

-- 查询学生信息,按照数学成绩降序排列
SELECT * FROM stu ORDER BY math DESC;

-- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列
SELECT * FROM stu ORDER BY math DESC, english ASC;

 5.4、聚合函数

5.4.1、概念

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

5.4.2、聚合函数分类

5.4.3、聚合函数语法 

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

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

 5.4.4、练习

-- 聚合函数
-- 统计班级一共有多少个学生
SELECT COUNT(id) FROM stu; -- COUNT统计的列名不能为空
SELECT COUNT(english) FROM stu; -- 结果为7条
SELECT COUNT(*) FROM stu;

-- 查询数学成绩的最高分
SELECT MAX(math) FROM stu;

-- 查询数学成绩的最低分
SELECT MIN(math) FROM stu;

-- 查询数学成绩的总分
SELECT SUM(math) FROM stu;

-- 查询数学成绩的平均分
SELECT AVG(math) FROM stu;

-- 查询英语成绩的最低分
-- NULL值不参与聚合函数运算
SELECT MIN(english) FROM stu;

 5.6、分组查询

5.6.1、语法 

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

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义  

where 和 having 区别:

  • 执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。

  • 可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。  

执行顺序:where > 聚合函数 > having

5.6.2、练习

-- 分组查询
-- 查询男同学和女同学各自的数学平均分
SELECT sex, AVG(math) FROM stu GROUP BY sex;

-- 注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义
SELECT name, sex, AVG(math) FROM stu GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数
SELECT sex, AVG(math), COUNT(*) FROM stu GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math > 70 GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2个的
SELECT sex, AVG(math), COUNT(*) FROM stu WHERE math > 70 GROUP BY sex HAVING COUNT(*) > 2;

 5.7、分页查询

5.7.1、语法

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

注意: 上述语句中的起始索引是从0开始

起始索引 = (当前页码 - 1) * 每页显示的条数 

5.7.2、练习 

-- 分页查询
-- 从0开始查询,查询3条数据
SELECT * FROM stu LIMIT 0, 3;

-- 每页显示3条数据,查询第1页数据
SELECT * FROM stu LIMIT 0, 3;

-- 每页显示3条数据,查询第2页数据
SELECT * FROM stu LIMIT 3, 3;

-- 每页显示3条数据,查询第3页数据
SELECT * FROM stu LIMIT 6, 3;

-- 起始索引 = (当前页码 - 1) * 每页显示的条数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值