天天看點

MySql系列03:MySql中DDL、DCL、DML、TCL

【1】SQL语言入门

我们都知道,数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,但具体是如何操作的呢?这就涉及到我们本节要讲的SQL语言。

SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。

SQL是由IBM公司在1974~1979年之间根据E.J.Codd发表的关系数据库理论为基础开发的,其前身是“SEQUEL”,后更名为SQL。由于SQL语言具有集数据查询、数据操纵、数据定义和数据控制功能于一体,类似自然语言、简单易用以及非过程化等特点,得到了快速的发展,并于1986年10月,被美国国家标准协会(American National Standards Institute,ANSI)采用为关系数据库管理系统的标准语言,后为国际标准化组织(International Organization for Standardization,ISO)采纳为国际标准。

MySql系列03:MySql中DDL、DCL、DML、TCL

【2】SQL语言分为五个部分:

1、数据查询语言(Data Query Language,DQL):DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。

2、数据操作语言(Data Manipulation Language,DML):DML主要用于对数据库中的数据进行增加、修改和删除的操作,其主要包括:

1) INSERT:增加数据
2) UPDATE:修改数据
3) DELETE:删除数据
           

3、数据定义语言(Data Definition Language,DDL):DDL主要用针对是数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)进行创建、修改和删除操作。其主要包括:

1) CREATE:创建数据库对象
2) ALTER:修改数据库对象
3) DROP:删除数据库对象
           

4、 数据控制语言(Data Control Language,DCL):DCL用来授予或回收访问 数据库的权限,其主要包括:

1) GRANT:授予用户某种权限
2) REVOKE:回收授予的某种权限
           

5、事务控制语言(Transaction Control Language,TCL):TCL用于数据库的事务管理。其主要包括:

1) START TRANSACTION:开启事务
2) COMMIT:提交事务
3) ROLLBACK:回滚事务
4) SET TRANSACTION:设置事务的属性 
           

【3】认识数据库表

表(Table)是数据库中数据存储最常见和最简单的一种形式,数据库可以将复杂的数据结构用较为简单的二维表来表示。二维表是由行和列组成的,分别都包含着数据,如表所示。

MySql系列03:MySql中DDL、DCL、DML、TCL

每个表都是由若干行和列组成的,在数据库中表中的行被称为记录,表中的列被称为是这些记录的字段。

记录也被称为一行数据,是表里的一行。在关系型数据库的表里,一行数据是指一条完整的记录。

字段是表里的一列,用于保存每条记录的特定信息。如上表所示的学生信息表中的字段包括“学号”、“姓名”、“性别”和“年龄”。数据表的一列包含了某个特定字段的全部信息。

【4】创建数据库表 t_student

建立一张用来存储学生信息的表

字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息

学号是主键 = 不能为空 + 唯一

姓名不能为空

性别默认值是男

Email唯一

(1)创建数据库:

MySql系列03:MySql中DDL、DCL、DML、TCL

(2)新建查询:

MySql系列03:MySql中DDL、DCL、DML、TCL

(3)创建数据库表:

##这是一个单行注释
/*
多行注释
多行注释
多行注释
*/
/*
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
*/
-- 创建数据库表:
create table t_student(
        sno int(6), -- 6显示长度 
        sname varchar(5), -- 5个字符
        sex char(1),
        age int(3),
        enterdate date,
        classname varchar(10),
        email varchar(15)
);
-- 查看表的结构:展示表的字段详细信息
desc t_student;
-- 查看表中数据:
select * from t_student;
-- 查看建表语句:
show create table t_student;
/*
CREATE TABLE `t_student` (
  `sno` int DEFAULT NULL,
  `sname` varchar(5) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `enterdate` date DEFAULT NULL,
  `classname` varchar(10) DEFAULT NULL,
  `email` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/
           

【5】数据库表列类型

1.整数类型

MySql系列03:MySql中DDL、DCL、DML、TCL

MySQL支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示

主键自增:不使用序列,通过auto_increment,要求是整数类型

2.浮点数类型

MySql系列03:MySql中DDL、DCL、DML、TCL

需要注意的是与整数类型不一样的是,浮点数类型的宽度不会自动扩充。 score double(4,1)

score double(4,1)–小数部分为1位,总宽度4位,并且不会自动扩充。

3.字符串类型

MySql系列03:MySql中DDL、DCL、DML、TCL

CHAR和VARCHAR类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式。CHAR类型长度固定,VARCHAR类型的长度可变。

因为VARCHAR类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少字符时推荐使用VARCHAR类型,这样可以大大地节约磁盘空间、提高存储效率。

CHAR和VARCHAR表示的是字符的个数,而不是字节的个数

4.日期和时间类型

MySql系列03:MySql中DDL、DCL、DML、TCL

TIMESTEMP类型的数据指定方式与DATETIME基本相同,两者的不同之处在于以下几点:

(1) 数据的取值范围不同,TIMESTEMP类型的取值范围更小。

(2) 如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋与了NULL值,MySQL会自动将该字段赋值为系统当前的日期与时间。

(3) TIMESTEMP类型还可以使用CURRENT_TIMESTAMP来获取系统当前时间。

(4) TIMESTEMP类型有一个很大的特点,那就是时间是根据时区来显示的。例如,在东八区插入的TIMESTEMP数据为2017-07-11 16:43:25,在东七区显示时,时间部分就变成了15:43:25,在东九区显示时,时间部分就变成了17:43:25。

【6】DML_添加数据

注意事项

int 宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节

时间的方式多样 ‘1256-12-23’ “1256/12/23” “1256.12.23”

字符串不区分单引号和双引号

如何写入当前的时间 now() , sysdate() , CURRENT_DATE()

char varchar 是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数。

如果不是全字段插入数据的话,需要加入字段的名字

-- 查看表记录:
select * from t_student;
-- 在t_student数据库表中插入数据:
insert into t_student values (1,'张三','男',18,'2022-5-8','软件1班','[email protected]');
insert into t_student values (10010010,'张三','男',18,'2022-5-8','软件1班','[email protected]');
insert into t_student values (2,'张三','男',18,'2022.5.8','软件1班','[email protected]');
insert into t_student values (2,"张三",'男',18,'2022.5.8','软件1班','[email protected]');
insert into t_student values (7,"张三",'男',18,now(),'软件1班','[email protected]');
insert into t_student values (9,"易烊千玺",'男',18,now(),'软件1班','[email protected]');
insert into t_student (sno,sname,enterdate) values (10,'李四','2023-7-5');
           

【7】DML_修改,删除数据

注意事项

1.关键字,表名,字段名不区分大小写

2.默认情况下,内容不区分大小写

3.删除操作from关键字不可缺少

4.修改,删除数据别忘记加限制条件

-- 修改表中数据
update t_student set sex = '女' ;
update t_student set sex = '男' where sno = 10 ;
UPDATE T_STUDENT SET AGE = 21 WHERE SNO = 10;
update t_student set CLASSNAME = 'java01' where sno = 10 ;
update t_student set CLASSNAME = 'JAVA01' where sno = 9 ;
update t_student set age = 29 where classname = 'java01';
-- 删除操作:
delete from t_student where sno = 2;
           

【8】DDL_修改,删除数据库表

-- 查看数据:
select * from t_student;
-- 修改表的结构:
-- 增加一列:
alter table t_student add score double(5,2) ; -- 5:总位数  2:小数位数 
update t_student set score = 123.5678 where sno = 1 ;
-- 增加一列(放在最前面)
alter table t_student add score double(5,2) first;
-- 增加一列(放在sex列的后面)
alter table t_student add score double(5,2) after sex;
-- 删除一列:
alter table t_student drop score;
-- 修改一列:
alter table t_student modify score float(4,1); -- modify修改是列的类型的定义,但是不会改变列的名字
alter table t_student change score score1 double(5,1); -- change修改列名和列的类型的定义
-- 删除表:
drop table t_student;
           

【9】DDL和DML的补充

【1】sql展示:

-- 创建表:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        sex char(1) default '男' check(sex='男' || sex='女'),
        age int(3) check(age>=18 and age<=50),
        enterdate date,
        classname varchar(10),
        email varchar(15) unique
);
-- 添加数据:
insert into t_student values (null,'张三','男',21,'2023-9-1','java01班','[email protected]');
insert into t_student values (null,'李四','男',21,'2023-9-1','java01班','[email protected]');
insert into t_student values (null,'露露','男',21,'2023-9-1','java01班','[email protected]');
-- 查看学生表:
select * from t_student;
-- 添加一张表:快速添加:结构和数据跟t_student 都是一致的
create table t_student2
as
select * from t_student;
select * from t_student2;
-- 快速添加,结构跟t_student一致,数据没有:
create table t_student3
as
select * from t_student where 1=2;
select * from t_student3;
-- 快速添加:只要部分列,部分数据:
create table t_student4
as
select sno,sname,age from t_student where sno = 2;
select * from t_student4;
-- 删除数据操作 :清空数据
delete from t_student;
truncate table t_student;
           

【2】delete和truncate的区别

从最终的结果来看,虽然使用TRUNCATE操作和使用DELETE操作都可以删除表中的全部记录,但是两者还是有很多区别的,其区别主要体现在以下几个方面:

(1)DELETE为数据操作语言DML;TRUNCATE为数据定义语言DDL。

(2) DELETE操作是将表中所有记录一条一条删除直到删除完;TRUNCATE操作则是保留了表的结构,重新创建了这个表,所有的状态都相当于新表。因此,TRUNCATE操作的效率更高。

(3)DELETE操作可以回滚;TRUNCATE操作会导致隐式提交,因此不能回滚(在第十章中会讲解事务的提交和回滚)。

(4)DELETE操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“Affected rows:4”);截断操作不会返回已删除的行量,结果通常是“Affected rows:0”。

DELETE操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;TRUNCATE操作则会重新从1开始自增。

繼續閱讀