MySQL笔记总结

一 、认识数据库

任务1 认识数据库

1.1 了解数据库

数据库管理系统应用非常广泛,可以说应用在各行各业。不管是家庭、公司或大型企业,还是政府部门,都需要使用数据库来存储数据信息。对软件而言,无论是客户机/服务器(C/S)还是浏览器/服务器(B/S)架构的软件,只要涉及存储大量数据,一般都需要数据库支撑。传统数据库很大一部分用于商务领域,如证券行业、银行、销售部门、医院、公司或企业单位,以及国家政府部门、国防军工领域和科技发展领域等。随着信息时代的发展,数据库也相应地产生了一些新的应用领域,主要表现在多媒体数据库、移动数据库、空间数据库、信息检索系统、分布式信息检索和专家决策等几个方面。

1.2 了解数据库的几个概念

1.数据(Data)

数据的定义

数据实际上就是描述事物的符号记录。文本、数字、时间日期、图片、音频和视频等都是数据。

数据的特点

有一定的结构,有型与值之分。

数据的类型

数据的型分为整型、字符型、文本型等,而数据的值给出了符合定型的值,如INT(15)表示15位整型数据,VARCHAR(8)表示8个长度的字符。

2.数据库(DataBase,DB)

数据库是长期储存在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。

3.数据库管理系统(DBMS)

数据库管理系统的定义

数据库的管理系统定一个负期对数据库进行数据组织、数据操纵、维护、控制以及数据保护和数据服务等管理工作的软件系统,是数据库的核心。它能够让用户定义、创建和维护数据库以及控制对数据的访问。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。

数据库管理系统的主要功能

(1)数据模式定义:为数据库构建其数据框架。
(2)数据存取的物理构建:为数据模式的物理存取与构建提供有效的存取方法与手段。
(3)数据操纵:为用户使用数据库的数据提供方便,如查询、插入、修改和删除以及简单的算术运算及统计。
(4)数据的完整性、安全性定义与检查。
(5)数据库的并发控制与故障恢复。
(6)数据的服务:如复制、转存、重组、性能监测和分析等。

数据库管理系统一般要提供以下的数据语言

(1)数据定义语言:负责数据的模式定义与数据的物理存取构建。
(2)数据操纵语言:负责数据的操纵,如数据查询与增、删、改等。
(3)数据控制语言:负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等。

1.3 认识关系数据库

认识数据模型

数据模型由3部分组成,即模型结构、数据操作和完整性规则。
​
DBMS所支持的数据模型分为3种:层次模型、网状模型和关系模型。
​
用树形结构表示实体及其之间的联系的模型称为层次模型。该模型的实际存储数据由链接指针来体现联系。有且仅有一个结点无父结点,此结点即为根结点;其它结点有且仅有一个父结点。层次模型适合用来表示一对多的联系。
​
用网状结构表示实体及其之间的联系的模型称为网状模型。该模型允许结点有多于一个的父结点,可以有一个以上的结点无父结点。网状模型适合用于表示多对多的联系。
​
层次模型和网状模型本质上都是一样的。
存在的缺陷:难以实现系统扩充,插入或删除数据时,涉及大量链接指针的调整。
​
在关系模型中,一个关系就是一张二维表,通常将一个没有重复行、重复列的二维表看成一个关系,每个关系都有一个关系名。
二维表的每一行在关系中称为元组(记录),二维表的每一列在关系中称为属性(字段),每个属性都有一个属性名,属性值则是各元组属性的取值。

认识关系数据库

关系数据库是创建在关系模型基础上的数据库。
关系数据库是以二维表来存储数据库的数据的。
关系模式是对关系的描述,主要描述关系由哪些属性构成,即描述了表的结构。
在关系表中,通常指定某个字段或字段的组合的值来唯一地表示对应的记录,我们把这个字段或字段的组合称为主键(也叫主码或关键字)

1.4 关系数据库设计

数据库设计一般要经过需求分析、概念结构设计、逻辑设计、物理设计、数据库实施和数据运行等几个阶段。其中,概念结构设计阶段要对需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型(用E-R图表示),逻辑设计阶段是将概念结构转换为某个DBMS所支持的数据模型(如关系模型),并对其进行优化。

1.4.1 实体、属性、联系

客观存在并相互区别的事物称为实体,实体是一个抽象名词,是指一个独立的事物个体,自然界的一切具体存在的事物都可以看作为一个实体。一个人是一个实体,一个组织也可以看作为一个实体。

1.4.2 绘制E-R图

     可以用图来更加直观地描述实体和实体的联系,这样的图叫作E-R图(Entity-Relationship Approach)。一般情况下,用矩形表示实体,用椭圆表示实体的属性,用菱形表示实体之间的联系,并用无向直线将其与相应的实体连接起来。

​     在建立E-R图时,特别是对于多个实体的比较复杂的E-R图,可以首先设计局部E-R模式,然后把各局部E-R模式综合成一个全局的E-R模式,最后对全局E-R模式进行优化,得到最终的E-R模式。

1.4.3 从E-R图转换为关系模式
语法:关系名(属性名...)

1.5 数据库应用系统体系结构

目前,常用的以数据库为核心构成的应用系统多数采用了以下两种结构模式:客户机/服务器(Client/Server,C/S)模式和浏览器/服务器(Browser/Server,B/S)模式。

1.5.1 认识C/S服务器

C/S(Client/Server)结构模式,即大家熟知的客户机/服务器结构模式。Client和 Server常常分别处在相距很远的两台计算机上,Client 程序的任务是将用户的要求提交给 Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。C/S模式数据库应用系统的开发工具通常是Visual Basic(VB)、Visual C#、Visual C++/NET、Delphi、Power Builder(PB)等。

1.5.2 认识B/S服务器

B/S(Browser/Server)模式数据库是采用三层C/S模式,即浏览器和服务器结构。用户工作界面是通过WWW浏览器来实现,主要事务逻辑在服务器端(Server)实现,第一层是浏览器,第二层是Web服务器,第三层是数据库服务器。这种结构的核心是Web服务器,它负责接收远程(或本地)的HTTP(超文本传送协议)数据请求,然后根据查询条件到数据库服务器获取相关的数据,并把结果翻译成 HTML(超文本置标语言)文档传送给提出请求的浏览器。在三层结构中,数据库服务器完成所有的数据操作,Web服务器则负责接收请求,然后到数据库服务器中进行数据处理,再对客户机给予答复。

任务2 认识MySQL

2.1 认识SQL语言

SQL是结构化查询语言,是重要的关系数据库操作语言。

2.1.1 SQL语言特点

(1)一体化:SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库中的全部工作。

(2)使用方式灵活:SQL具有两种使用方式,一种是直接以命令方式交互使用;另一种是嵌入使用,嵌入C、C++、Fortran、COBOL和Java等主语言中使用。

(3)非过程化:SQL只需要提供操作要求,不必描述操作步骤,也不需要导航。使用时只需要告诉计算机“做什么”,而不需要告诉它“怎么做”。

(4)语言简洁,语法简单,好学好用:在ANSI标准中,只包含了94个英文单词,核心功能只用6个动词,语法接近英语口语。

2.1.2 SQL语言的基本语句

(1)数据查询语言(DQL):也称为数据检索语句,用来从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其它DQL常用的保留字有WHERE、ORDER BY、GROUP BY和HAVING。这些DQL保留字常与其它类型的SQL语句一起使用。

(2)数据操作语言(DML):包括动词INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除表中的行,也称为动作查询语言。

(3)事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括 BEGIN TRANSACTION、COMMIT和ROLLBACK。

(4)数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

(5)数据定义语言(DDL))其语句包括动词CREATE和DROP,用于在数据库中创建新表或删除表(CREATTABLE或DROP TABLE),为表加入索引等。它也是动作查询的一部分。

(6)指针控制语言(CCL):它的语句,如DECLARE CURSOR、FETCH INTO 和UPDATE WHERE CURRENT 用于对一个或多个表单独行的操作。

2.2 MySQL概述

MySQL的版本有:企业版(MySQL Enterprise Edition)、标准版(MySQL StandardCommunity Edition)。MySQL社区版是世界上流行的免费下载的开源数据库管理系统。商业客户可灵活地选择企业版、标准版和集群版等多个版本,以满足特殊的商业和技术需求。

2.3 认识MySQL5.5

MySQL5.5融合了MySQL数据库和InnoDB存储引擎的优点,能够提供高性能的数据管理解决方案,如下所列。

(1)InnoDB作为默认的数据库存储引擎,作为成熟、高效的事物引擎,目前已经被广泛使用,但MySQL 5.1之前的版本默认引擎均为MyISAM。新的InnoDB 存储和压缩选项有助于减少MySQL数据足迹(Data Footprint),并提高数据检索效率。

(2)提升了Windows系统下的系统性能和可扩展性。

(3)改善性能和可扩展性,全面利用各平台现代多核架构的计算能力,增强对MySQL多处理器支持,直至MySQL性能“不受处理器数量的限制”。

(4)提供新的SQL语法和分区选项,使应用程序的开发、调试和调整更加容易。

(5)提高易管理性和效率。

(6)提高可用性。

(7)改善检测与诊断性能。

2.4 MySQL的管理工具

MySQL管理工具中,命令行工具MySQL Command Line Client 用于管理 MySQL数据库,图形管理工具MySQL Administrator、MySQL Query Browser和 MySQL Workbench是常用的可视化管理工具。此外,phpMyAdmin是非常好的界面管理工具。

2.5 初识MySQL数据类型

在创建表时,必须为各字段指定数据类型,字段的数据类型决定了数据的存储形式和取值大小。MySQL支持的数据类型有数值型、精确数值型、浮点数据型、字符型、日期型、时间日期型、文本型、BLOB型和位数据型等。

2.6 初识MySQL的基本语句

MySQL的主要语句有CREATE、INSERT、UPDATE、DELETE、DROP和SELECT等。 例如,创建一个数据库TEST,在数据库中创建一个表NUMBER,然后进行一系列的操作:向表插入数据、查询数据、删除数据、删除表和删除数据库等。

可执行如下SQL语句。

mysql>CREATE DATABASE TEST;     //创建数据库TEST
mysql>USE TEST;     //指定到数据库TEST中操作
mysql>CREATE TABLE NUMBER(
NO CHAR (6) RPIMARY KEY,
N_NAME CHAR(8));    //创建表 NUMBER
mysql>INSERT INTO TABLE NUMBER VALUES('001','李明');      //向表 NUMBER 插入数据
mysql>UPDATE NUMBER SET N_NAME='李小明'WHERE NO='001';     //更新表 NUMBER的数据
mysql>SELECT *FROM NUMBERS; //查询表NUMBER的数据
mysql>DELETE FROM NUMBER;   //删除表NUMBER的数据
mysql>DROP TABLE NUMBER;    //删除表NUMBER
mysql>DROP DATABASE TEST;   //删除数据库TEST

二、 MySQL字符集与数据

任务3 MySQL数据类型

3.1 整数类型

整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT两类整数类型。MySQL数据库除了支持这两种类型以外,还扩展支持了TINYINT、MEDIUMINT和BIGINT。

3.2 浮点数类型和定点数类型

MySQL 中使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型),定点数类型就是DECIMAL型。

3.3 CHAR类型和VARCHAR

CHAR和VARCHAR的区别

(1)都可以通过指定n来限制存储的最大字符数长度,CHAR(20)和VARCHAR(20)将最多只能存储20个字符,超过的字符将会被截掉。n必须小于该类型允许的最大字符数。

(2)CHAR类型指定了n之后,如果存入的字符数小于n,后面将会以空格补齐,查询的时候再将末尾的空格去掉,所以CHAR类型存储的字符串末尾不能有空格,VARCHAR不受

(3)内部存储的机制不同。CHAR是固定长度,CHAR(4)不管是存入1个字符,2个字符还是4个字符(英文的),都将占用4个字节VARCHAR是存入的实际字符数+1个字<=255)或2个字节(n>255),所以VARCHAR(4),存入一个字符将占用2个字节;2个字符占用3个字节,4个字符占用5个字节。

(4)CHAR类型的字符串检索速度要比VARCHAR类型的快。

3.4 TEXT类型和BLOB类型

      BLOB类型和TEXT类型是对应的,不过存储方式不同,TEXT是以文本方式存储的,而BLOB是以二进制方式存储的。如果存储英文,TEXT区分大小写,而BLOB不区分大小写。TEXT可以指定字符集,BLOB不用指定字符集。

     二进制类型是在数据库中存储二进制数据的数据类型,如数码照片、视频和扫描的文档等数据。在MySQL是用BLOB数据类型存储这数据的。BLOB有4种类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。

3.5 日期和时间类型

     日期与时间类型是为了方便在数据库中存储日期和时间而设计的。MySQL中有多种表示日期和时间的数据类型,其中,YEAR类型表示年份,TIME类型表示时间,DATE类型表示日期,DATETIME和TIMESTAMP表示日期和时间。

     TIMESTAMP类型比较特殊,如果定义一个字段的类型为TIMESTAMP,这个字段的时间会在其他字段修改的时候自动刷新。所以这个数据类型的字段可以存放这条记录最后被修改的时间,而不是真正的存放时间。

3.6 ENUM类型和SET类型

这两种类型是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。被枚举的值必须用引号包围,不能为表达式或者一个变量估值。如果想用数值作为枚举值,那也必须得用引号引起。ENUM(枚举)类型,最多可以定义65535种不同的字符串,从中做出选择,只能并且必须选择其中一种,占用存储空间是一个或两个字节,由枚举值的数目决定。 SET(集合)类型其值同样来自于一个用逗号分隔的列表,最多可以有64个成员,可以选择其中的0个到不限定的多个,占用存储空间是1~8字节,由集合可能的成员数目决定。

三、 建库、建表与数据库管理

任务4 建立数据库和表

4.1 创建与管理数据库

4.1.1 创建库
create database [if not exists] 数据库名

4.1.2 查看库
show databases;
查看当前数据库
select database();
选定并使用数据库
use 数据库名

4.1.3 修改库
alter databse 数据库名

4.1.4 删除库
drop database [if not exists] 数据库名

4.2 创建与管理表

4.2.1 创建表
查看表
show tables;
创建表
表决定了数据库的结构,表是存放数据的地方,一个库需要什么表,各数据库表中有什么样的列(字段),是要合理设计的。
语法结构如下:
create table [if not exists] 表名

4.2.2 查看表
show tables;
查看表结构
describe <表名> 或 简写成 desc <表名>;

4.2.3 修改表

alter table 用于更改原有表的结构

alter table 表名

4.2.4 复制表
create table [if not exists] 表名

4.2.5 删除表
drop table [if not exists] 表名

4.3 表数据操作

4.3.1 插入数据
不指定列名:insert into <表名> values (值1,值2,...值n) 
指定列名:insert into <表名> (属性1,属性2,...属性n) values (值1,值2,...值n)
​
注:当指定列时可以只给部分字段赋值
   当不指定列时必须为每个字段赋值

4.3.2 修改数据
update <表名> set 属性1=值1,属性2=值2,...,属性n=值n where 条件表达式
修改字段名及数据类型
alter table <表名> change <旧字段名> <新字段名> <数据类型> [约束条件];
修改字段的基本数据类型或约束条件
alter table <表名> modify <字段名> <数据类型> [约束条件];

4.3.3 删除数据
delect from <表名> [where 条件表达式]
delect 和 truncate 仅仅删除表数据
drop 是表数据和表结构一起删除

任务5 建立和管理索引

5.1 认识索引

索引是一种特殊的数据库结构,可以用来快速查询数据表中的特定记录。

5.1.1 索引分类

MySQL 的索引包括普通索引( INDEX )、唯一性索引( UNIQUE )、主键索引( PRIMARY KEY )、全文索引( FULLTEXT )和空间索引( SPATIAL )。

(1)普通索引( INDEX )。 索引的关键字是 INDEX ,这是最基本的索引,它没有任何限制。

(2)唯一性索引( UNIQUE )。 关键字是 UNIQUE 。与普通索引类似,但是 UNIQUE 索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。在一个表上可以创建多个 UNIQUE 索引。

(3)主键索引( PRIMARY KEY )。 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。也可通过修改表的方法增加主键,但一个表只能有一个主键索引。

(4)全文索引( FULLTEXT )。 FULLTEXT 索引只能对 CHAR 、 VARCHAR 和 TEXT 类型的列编制索引,并且只能在 MyISAM 表中编制。在 MySQL 默认情况下,对于中文作用不大。

(5)空间索引( SPATIAL )。 SPATIAL 索引只能对空间列编制索引,并且只能在 MyISAM 表中编制。 另外,按索引建立在一列还是多列上,又可以分为单列索引、多列索引(复合索引)。

5.1.2 索引的设计原则

为了使索引的使用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。索引的设计原则如下。

(1)在主键上创建索引,在 InnoDB 中如果通过主键来访问数据效率是非常高的。

(2)为经常需要排序、分组和联合操作的字段建立索引,即那些将用于 JOIN 、 WHERE 判断和 ORDER BY 排序的字段。

(3)为经常作为查询条件的字段建立索引,如用于 JOIN 、 WHERE 判断的字段。

(4)尽量不要对数据库中某个含有大量重复的值的字段建立索引,如"性别"字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。

(5)限制索引的数目。

(6)尽量使用数据量少的索引。

(7)尽量使用前缀来索引。

(8)删除不再使用或者很少使用的索引。

5.2 索引的建立

5.2.1 创建表时创建

创建表的时候可以直接创建索引,这种方式最简单、方便。

5.2.2 用create index 语句创建
create index index_name on 表名

5.2.3 通过alter table 语句创建索引
alter table 表名 add index index_name

5.3索引的查看

show index from course;

5.4 索引的删除

删除索引是将表中已经存在的索引删除掉。

5.4.1 用drop index语句删除索引
drop index index_name on tbl_time;
index_name为要删除的索引名,tbl_name为索引所在的表。

5.4.2 用alter table语句删除索引
alter table tbl_time
|drop primary key
|drop index index_name
|drop foreign key fk_symbol

任务6 数据约束和参照完整性

在一个表中,通常某个字段或字段的组合唯一地表示一条记录。

在一个表中,有时要求某些列值不能重复。

在关系数据库中,表与表之间数据是有关联的。

6.1 PRIMARYKEY 约束

6.1.1 理解PRIMARY KEY 约束
PRIMARY KEY 也叫主键。可指定一个字段作为表主键,也可以指定两个及以上的字段作为复合主键,其值能唯一地标识表中的每一行,而且 PRIMARY KEY 约束中的列不能取空值。由于 PRIMARY KEY 约束能确保数据唯一,所以经常用来定义标志列。
可以在创建表时创建主键,也可以对表中已有主键进行修改或者增加新的主键。设置主键通常有两种方式:表的完整性约束和列的完整性约束。

6.1.2 表的完整性约束
单字段组成的语法格式:属性名 数据类型 primary key
多字段组成的语法格式:primary key (属性1,属性2,属性n)
注:多字段的组合可以唯一确定一条记录。

6.1.3 修改表的主键

修改表的主键,删除原来主键,增加s_name为主键

alter table 表名 drop primary key add primary key (s_name)

6.2 UNIQUE约束

6.2.1 理解QUNIQUE约束(唯一性约束)

UNIQUE 约束(唯一性约束)又称替代键。替代键是没有被选作主键的候选键。替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。可以为主键之外的其他字段设置 UNIQUE 约束。

语法格式:属性名 数据类型 unique

6.2.2 创建UNIQUE约束
默认值约束:属性名 数据类型 default 默认值
添加外键约束
alter table 表名 add [constraint 外键别名] foreign key (外键属性名) references 父表名 (属性名)
删除外键约束
alter table 表名 drop foreign key 外键别名
外键约束注意事项:
创建先创父表;
插入先插入父表数据;
删除先删除子表数据。

口诀:
创:先父后子
删:先子后父

6.2.3 修改UNIQUE约束
alter table 表名 add unique (设置的约束)
一个数据表只能创建一个主键。
外键用来建立主表(父表)与从表(子表)的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

四、 数据查询、数据处理与视图

任务7 数据库的查询

7.1 了解SELECT语法结构

select [all distinct] 属性名 from 数据表
其中,用[]表示可选项。
 SELECT 子句:指定要查询的列名称,列与列之间用逗号隔开。
 FROM 子句:指定要查询的表,可以指定两个以上的表,表与表之间用逗号隔开。 WHERE 子句:指定要查询的条件。执行顺序从左往右。
 GROUP BY 子句:用于对查询结构进行分组。
 HAVING 子句:指定分组的条件,通常在 GROUP BY 子句之后。
 ORDER BY 子句:用于对查询结果进行排序。
 LIMIT 子句:限制查询的输出结果行。
and 和 or 一定出现时,先执行 and ,后热行 or 。
and关键字可以用来连接多个条件,查询同时满足这些条件的记录
or关键字也是用来连接多个条件,查询满足其中一个条件的记录

7.2 认识基本子句

7.2.1 认识select子句
参数 说明
ALL 显示所有行,包括重复行,ALL是系统默认
DISTINCT 消除重复行
列名 指明返回结果的列,如果是多列,用逗号隔开
* 通配符,返回所有列值

7.2.2 使用as定义查询的列别名
select 字段 as 别名 from 表名

7.2.3 认识where子句

WHERE 子句指定查询的条件,限制返回的数据行。 WHERE 子句必须紧跟 FROM 子句之后,在 WHERE 子句中,使用一个条件从 FROM 子句的中间结果中选取行。

过滤类型 查询条件
比较运算 =,>,<,>=,<=,<>,!>,!<,!=
逻辑运算 and,or,not
字符串运算 like,escape
范围 between...and...,in
空值 is null,is not null

7.2.4 认识group by子句
group by子句主要根据字段对行分组。
(1) GROUP BY 子句后通常包含列名或表达式。也可以用正整数表示列,如指定3,则表示按第3列分组。
(2) ASC 为升序, DESC 降序,系统默认为 ASC ,将按分组的第一列升序排序输出结果。
分组查询
使用 group_concat() 函数将每个分组的name字段显示出来
count()函数对分组中人数进行统计(每个组的人数)

7.2.5 认识 order by 语句

使用order by子句后,可以保证结果中的行按一定顺序排列。

order by {列|表达式|正整数} [ASC|DESC]

7.2.6 认识having语句

使用 HAVING 子句的目的与 WHERE 子句类似,不同的是 WHERE 子句用来在 FROM 子句之后选择行,而 HAVING 子句用来在 GROUP BY 子句后选择行。语法结构如同 WHERE 。

7.3 使用聚合函数进行查询统计

常用函数 功能
SUM ( DISTINCT | ALL |*) 计算某列值的总和
COUNT ( DISTINCT | ALL | 列名) 计算某列值的个数
AVG ( DISTINCT | ALL | 列名) 计算某列值的平均值
MAX ( DISTINCT | ALL | 列名) 计算某列值的最大值
MIN ( DISTINCT | ALL | 列名) 计算某列值的最小值
VARIANCE / STDDEV ( DISTINCT | ALL | 列名) 计算特定的表达式中的所有值的方差/标准差
注:
(1) DISTINCT 表示在计算过程中去掉列中的重复值,如果不指定 DISTINCT 或指定 ALL ,则计算所有列值。
(2) COUNT (*)计算所有记录的数量,也包括空值所在的行。而 CONUT (列名)则只计算列的数量,不计该列中的空值。同样, AVG 、 MAX 、 MIN 和 SUM 函数也不计空的列值。即不把空值所在行计算在内,只对列中的非空值进行计算。

7.4 多表连接查询

7.4.1 全连接

多表查询实际上通过各个表之间的共同列的关联性来查询数据。连接的方式是将各个表用逗号分隔,用WHERE子句设定条件进行等值连接,这样就指定了全连接。

select 表名.列名[...n]
from 表1[...n]
where {连接条件 and | or 查询条件}

7.4.2 JOIN连接
select 表名.列名[...n]
from {表1 [连接方式] join 表2 on 连接条件 | using(字段)}
where 查询条件
内连接:inner join
外连接:outer join

7.5 嵌套查询

     MySQL 从4.1版开始支持嵌套查询功能,在此版本前,可以用 JOIN 连接查询来进行替代。嵌套查询通常是指在一个 SELECT 语句的 WHERE 或 HAVING 语句中,又嵌套有另外一个 SELECT 语句,使用子查询的结果作为条件的一部分。在嵌套查询中,上层的 SELECT 语句块称为父查询或外层查询,下层 SELECT 语句块称为子查询或内层查询。 SQL 标准允许 SELECT 多层嵌套使用,用来表示复杂的查询。子查询可以使用在 SELECT 、 INSERT 、 UPDATE 或 DELETE 语句中。

​     一般情况下,子查询是通过 WHERE 子句实现的,但实际上它还能应用于 SELECT 语句及 HAVING 子句。子查询嵌套的形式一般有3种:嵌套在 WHERE 子句中、嵌套在 SELECT 子句中、嵌套在 FROM 子句中。 子查询通常与 IN 、 EXISTS 谓词及比较运算符等操作符结合使用。如果按操作符分,又可以分为 IN 子查询、比较子查询和 EXISTS 子查询。

​     根据子查询的结果又可以将 MySQL 子查询分为4种类型:返回一个表的子查询是表子查询;返回带有一个或多个值的一行的子查询是行子查询;返回一行或多行,但每行上只有一个值的是列子查询;只返回一个值的是标量子查询,从定义上讲,每个标量子查询都是一个列子查询和行子查询。

7.5.1 嵌套在where子句中

这是子查询的最常用形式,语法结构如下。

select select_list
from tbl_name
where expression = (subquery)
​
注:(subquery)表示子查询,该子查询语句返回的是一个值,也就是列子查询,查询语句将以子查询的结果作为where子句的条件进行查询。

7.5.2 嵌套在select子句中

把子查询的结果放在select子句后面作为查询的一个列值,其值是唯一的。

select select_list,(subquery) from tbl_name; 

7.5.3 嵌套在from子句中

嵌套在from子句中查询通过子查询执行的结果来构建一张新的表,用来作为主查询的对象。

select select_list
from (subquery) as name
where expression;

7.5.4 in子查询

通过in关键字可以把原表中目标列的值和子查询返回的结果集进行比较,进行一个给定值是否在子查询结果集中的判断,如果列值与子查询的结果一致或存在与之匹配的数据行,则查询结果包含该数据行。

select select_list
from tbl_name
where expression in [not in] (subquery)

7.5.5 比较查询

比较子查询可以被认为是 IN 子查询的扩展,它使表达式的值与子查询的结果集进行比较运算。

 SELECT select _ list 
 FROM tbl_name 
 WHERE expression {<|<=|=|>|>=|!=|<>]{ ALL | SOME | ANY )( subquery );
ALL 、 SOME 和 ANY 操作符说明对比较运算的限制。
 ALL 指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回 TRUE ,否则返回 FALSE 。
SOME 或 ANY 是同义词,表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回 TRUE ,否则返回 FALSE 。

7.5.6 exist子查询

     在子查询中可以使用 EXISTS 和 NOT EXISTS 操作符判断某个值是否在一系列的值中。 外层查询测试子查询返回的记录是否存在,基于查询所指定的条件,子查询返回 TRUE 或 FALSE ,子查询不产生任何数据。

     使用 exists 关键学时,内层查询返用一个逻辑值( true 或者 false ),当内层查询语句查询到符合条件的记录时返回一个真值( true ),否则返回一个假值( false )。

    当内层查询返回真值时,外层查询进行查询,否则外层查询不进行查询。

    使用any关键字时,只要满足是内层查询返回结果中的一个值,外层查询就会匹配条件进行查询。

    使用all关键字,只有满足内层查询满足结果中的所有值,外层查询才会进行查询。

7.6 联合查询

union语句:用于将不同表中相同列中查询的数据显示出来(不包括重复数据)
union all语句:用于将不同表中相同列中查询的数据显示出来(包括重复数据)

联合查询是指将多个 SELECT 语句返回的结果通过 UNION 组合到一个结果集中。参与查询的 SELECT 语句中的列数和列的顺序必须相同,数据类型也必须兼容。

 SELECT ... UNION [ ALL | DISTINCT ] SELECT ...[ UNION [ ALL | DISTINCT ] SELECT ...]

其中, ALL 是指查询结果包括所有的行,如果不使用 ALL ,则系统自动删除重复行。查询结果的列标题是第一个查询语句中的列标题。 ORDER BY 和 LIMIT 子句只能在整个语句最后指定,且使用第一个查询语句中的列名、列标题或序列号,同时还应对单个的 SELECT 语句加圆括号。排序和限制行数对最终结果起作用。

任务8 MySQL运算符和函数

8.1 认识和使用运算符

    运算符是用来连接表达式中各个操作数的符号,其作用是指明对操作数所进行的运算。 MySQL 数据库支持使用运算符。通过运算符,可以使数据库的功能更加强大。而且,可以更加灵活地使用表中的数据。

     MySQL 运算符包括4类,分别是算术运算符、比较运算符、逻辑运算符和位运算符。 ​ 数据库中的表定义好以后,表中的数据代表的意义就已经定下来了。通过使用运算符进行运算,可以得到包含另一层意义的数据。

8.1.1 算术运算符

算术运算符是 MySQL 中最常用的一类运算符。 MySQL 支持的算术运算符包括加、减、乘、除、求余。

符号 表达式的形式 作用
+ x1+x2+...+ xn 加法运算
- x1-x2-...- xn 减法运算
* x1*x2...* xn 乘法运算
/ x1/x2 除法运算,返回x1除以x2的商
div x1 DIV x2 除法运算,返回商。同"/"(无小数)
% x1%x2 求余运算,返回x1除以x2的余数
mod MOD (x1,x2) 求余运算,返回余数。同"%"
"+" 运算符:用于获得一个或多个值的和。
"_" 运算符:用于从一个值中减去另一个值,并可以更改参数符号。
"*" 运算符:用来获得两个或多个值的乘积。
"/" 运算符:用来获得一个值除以另一个值得到的商。
"%" 运算符:用来获得一个或多个除法运算的余数。

8.1.2 比较运算符

比较运算符(又称关系运算符),用于比较两个表达式的值,其运算结果为逻辑值,可以为3种之一:1(真)、0(假)及 NULL (不能确定)。

运算符 含义
= 等于
> 、>= 大于、大于或等于
< 、<= 小于、小于或等于
<=> 相等或都等于空(两边都为空,结果为true)
<> 、 != 不等于

注:比较运算符中只有<=>可以和空比较。

"=" 运算符:相等返回1,不等返回0,空值不能使用等号和不等号判断。

"<=>" 运算符:与"="作用相等,唯一区别是它可以用来判断空值。

">" 运算符:用来判断左边的操作数是否大于右边的操作数。如果大于,返回1;否则返回0。

">=" 运算符:用来判断左边的操作数是否大于或等于右边的操作数。如果大于或等于,返回1;否则返回0。

"<" 运算符:用来判断左边的操作数是否小于右边的操作数。如果小于,返回1;否则返回0。

"<=" 运算符:用来判断左边的操作数是否小于或等于右边的操作数。如果小于或等于,返回1;否则返回0。

NULL 与 NULL 进行比较仍然返回 NULL 。

"<>"与"!="运算符:用于进行数字字符串和表达式不相等的判断,当 NULL与 NULL 用"<>"比较时仍然返回NULL。

"IS NULL" "IS NOT NULL"和"ISNULL"运算符:用来判断操作数是否为空值。为空时返回1,不为空返回0。

"IN"运算符:可以判断操作数是否落在某个集合中。表达式"x1 in (值1,值2,...,值 n )",如果x1等于其中任何一个值,返回1,否则则返回0。

"BETWEEN AND"运算符:可以判断操作数是否落在某个取值(包含取值)范围内。

"LIKE"运算符:用来匹配字符串。表达式"x1 LIKE s1",如果x1与字符串s1匹配,结果返回1。

"%"匹配任意个字符,"_"匹配一个字符。

"REGEXP"也用来匹配字符串,但它使用正则表达式匹配。

8.1.3 逻辑运算符

      逻辑运算符用来判断表达式的真假。逻辑运算符的返回结果只有 TRUE (1)和 FALSE (0)。如果表达式是真,结果返回1;如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符。 MySQL 中支持4种逻辑运算符。这4种逻辑运算符分别是与、或、非和异或。

     NOT 运算符用于逻辑非运算,它对跟在它后面的逻辑测试判断取反,把真变假,假变真。

     AND 运算符用于逻辑与运算,测试逻辑条件(两个或以上)的值全部为真,而且不为 NULL 值,则结果为真,否则为假。&&也是逻辑与运算符。

     OR 运算符用于逻辑或运算,测试逻辑条件(两个或以上)的值有一个为真,而且不为 NULL 值,则结果为真,全为假则结果为假。

     XOR 运算符用于逻辑异或运算。如果包含的值或表达式一个为真,而另一个为假并且不是 NULL ,那么它返回真值,否则返回假值。

8.1.4 位运算符

位运算符是在二进制上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,再将计算结果从二进制数变回十进制数。MySQL中支持6种位运算符,分别是按位与、按位或、按位异或、按位左移、按位右移和按位相反。

运算符 运算规则
& 位与
| 位或
^ 位异或
<< 位左移
>> 位右移
~ 位取反
0 and null 时候:因为and中只要有一个为0,结果一定为0
1 or null 时候:因为or中只要有一个为1,结果一定为1

8.1.5 运算符的优先级

当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。在一个表达式中按先高(优先级数字小)后低(优先级数字大)的顺序进行运算。

运算符 优先级
+(正)、(负)、~(按位 NOT ) 1
*(乘)、/(除)、%(模) 2
+(加)、-(减) 3
=, >, <, >=, <=, <>, !=, !>, !< 比较运算符 4
^(位异或)、&(位与)、(位或) 5
NOT 6
AND 7
ALL 、 ANY 、 BETWEEN 、 IN 、 LIKE 、 OR 、 SOME 8
=(赋值) 9

8.2 认识和使用函数

MySQL 数据库中提供了很丰富的函数。这些内部函数可以帮助用户更加方便地处理表中的数据。 MySQL 函数包括数学函数、聚合函数、日期和时间函数、控制流判断函数、字符串函数、系统信息函数、加密函数和格式化函数等。 SELECT 语句及其条件表达式都可以使用这些函数,同时, INSERT 、 UPDATE 和 DELETE 语句及其条件表达式也可以使用这些函数。

8.2.1 数学函数

数学函数是 MySQL 中常用的一类函数。主要用于处理数字,包括整型、浮点数等。数学函数包括绝对值函数、正弦函数、余弦函数和获取随机数的函数等。

函数名 功能
ABS(x) 返回某个数的绝对值
PI( ) 返回圆周率
GREATEST( ) LEAST( ) 返回一组数的最大值和最小值
SQRT(x) 返回一个数的平方根
RAND( )、RAND(x) 返回0~1的随机数
ROUND(x) ROUND(x,y) 返回距离x最近的整数 函数返回x保留到小数点后y位的值
SIGN(x) 返回x的符号 x是负数、0、正数分别返回-1、0、1
POW(x,y) EXP(x) 返回x的y次幂,即x^y 返回e的x次幂,即e^x
MOD(x,y) 返回余数
RADIANS(x) DEGREES(x) 函数将角度转换为弧度;函数将弧度转换为角度。这两个函数互为反函数
POWER(x,y) EXP(x) 返回x的y次幂 函数计算e的x次方,即e^x
SIN(x)、COS(x) 和 TAN(x)函数 SIN( )、COS( ) 和 TAN( )函数返回一个角度(弧度)的正弦、余弦和正切值
ASIN(x)、ACOS(x) 和 ATAN(x)函数 ASIN( )、ACOS( ) 和 ATAN( )函数返回一个角度(弧度)的反正弦、反余弦和反正切值。x的取值必须在-1~1
LOG(x) LOG10(x) 返回x的自然对数 返回x的以10为底的对数
FLOOR()向下取整
CEIL()向上取整

8.2.2 聚合函数

     聚合函数也叫作分组计算函数。这些函数常常是与 GROUP BY 子句一起使用的函数,作用是对聚合在组内的行进行计算。

     如果在不包含 GROUP BY 子句的语句中使用聚合函数,它等价于聚合所有行。

     COUNT ( expr )函数返回由 SELECT 语句检索出来的行的非 NULL 值的数目。

     AVG ( expr )函数返回expr的平均值。

     MIN ( expr )、 MAX ( expr )函数返回 expr 的最小或最大值。 MIN ()和 MAX ()可以有一个字符串参数,在这种的情况下,返回最小或最大的字符串值。

    SUM ( expr )函数返回 expr 的总和。注意,如果返回的集合没有行,它返回 NULL 。

8.2.3 日期和时间函数

日期和时间函数主要用于处理表中的日期和时间数据。日期和时间函数包括获取当前日期的函数、获取当前时间的函数、计算日期的函数和计算时间的函数等。

1. 获取当前日期
使用 CURDATE ()和 CURRENT DATE ()函数获取当前日期。

2. 获取当前时间
使用 CURTIME ()和 CURRENT _ TIME ()函数获取当前时间。

3. 返回当前日期和时间的函数
NOW ()、 CURRENT_TIMESTAMP 、 LOCAL TIME()和SYSDATE()函数都用来获取当前的日期和时间。

4. 返回年份、季度、月份和日期函数
YEAR ()函数分析一个日期值并返回其中年的部分; 
QUARTER ( d )函数返回日期 d 是本年第几季度,值的范围是1~4, MONTH ()函数分析一个日期值并返回其中关于月的部分,值的范围是1~12; 
DAY ()函数分析一个日期值并返回其中关于日期的部分,值的范围是1~31。

5. 返回指定日期在一年、一星期及一个月中的序数
DAYOFYEAR ()、 DAYOFWEEK ()和 DAYOFMONTH ()函数分别返回指定日期在一年、一星期及一个月中的序数。

6. 获取星期的函数
(1) DAYNAME ( d )函数返回日期 d 是星期几,显示其英文名,如 Monday 、 Tuesday 等。
(2) DAYOFWEEK ( d )函数也返回日期 d 是星期几,1表示星期日,2表示星期一,以此类推。
(3) WEEKDAY ( d )函数也返回日期 d 是星期几,0表示星期一,1表示星期二,以此类推。
其中,参数 d 可以是日期和时间,也可以是日期。

7. 获取星期数的函数
 WEEK ( d )函数和 WEEKOFYEAR ( d )函数都是计算日期 d 是本年的第几个星期。返回值的范围是1~53。

8. 获取天数的函数
DAYOFYEAR ( d )函数日期 d 是本年的第几天; DAYOFMONTH ( d )函数返回日期 d 是本月的第几天。

9. 对日期和时间进行算术操作
DATE _ ADD ()和 DATE _ SUB ()函数可以对日期和时间进行算术操作,它们分别用来增加和减少日期值。
关键字 间隔值的格式
DAY 日期
DAY_HOUR 日期:小时
DAY_MINUTE 日期:小时:分钟
DAY_SECOND 日期:小时:分钟:秒
HOUR 小时
HOUR_MINUTE 小时:分钟
HOUR_SECOND 小时:分钟:秒
MINUTE 分钟
MINUTE_SECOND 分钟:秒
MONTH
SECOND
YEAR
YEAR_MONTH 年—月

10. DATEDIFF 函数
 DATEDIFF (d1,d2)函数计算两个日期相隔的天数。

11. 日期和时间格式化的函数
DATE _ FORMAT ()和 TIME _ FORMAT ()函数可以用来格式化日期和时间值。
关键字 间隔值的格式
%a 缩写的星期名( Sun , Mon ...)
%b 缩写的月份名( Jan , Feb ...)
%d 月份中的天数
%H 小时(01,02...)
%I 分钟(00,01...)
%j 一年中的天数(001,002...)
%m 月份,2位(00,01..)
%M 长型月份的名字( January , February )
%p AM 或 PM
%r 时间,12小时的格式
%S 秒(00,01)
%T 时间,24小时的格式
%w 一周中的天数(0,1)
%W 长型星期的名字( Sunday , Monday ...)
%Y 年份,4位

8.2.4 控制流判断函数
  • if函数:建立一个简单的条件测试
  • case when
  • ifnull函数

8.2.5 字符串函数
1. CONCAT(str1,str2……)

返回来自于参数连接的字符串。如果任何参数是null,返回null。可以有超过两个的参数。数字参数会被转换为等价的字符串形式。

2. LEFT(str,en)

返回字符串str的最左面len个字符。

3. RIGHT(str,len)

返回字符串str的最右面len个字符。

4. SUBSTRING(str,pos,len)和MID(str,pos,len)

从字符串str返回长度为len个字符的子串,从位置pos开始。

5. REPEAT ( str , count )

返回由字符串 str 重复 count 次组成的一个字符串。如果 count <=0,返回一个空字符串。如果 str 或 count 是 NULL ,返回 NULL 。

任务9 创建和使用视图

9.1 认识视图

     从用户角度来看,视图是从一个特定的角度来查着数据库中的数据。从数据库系统内部来看,视图是由 SELECT 语句查询定义的虚拟表。从数据库系统外部来看,视图就如同一张表,对表能够进行的一般操作都可以应用于视图,例如查询、插入、修改和删除操作等。 ​ 视图是一个虚拟表,定义视图所引用的表称为基本表。视图的作用类似于筛选,定义视图的筛选可以来自当前或其他数据库的一个或多个表,也可以来自其他视图。

​     视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。 ​ 当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

9.2 视图的特性

(1)简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,还可以简化他们的操作。那些经常被使用的查询可以被定义为视图,从而使得用户不必为以后的每次操作指定全部的条件。 (2)安全性,用户通过视图只能查询和修改他们所能见到的数据,而不能授权到数据库特定行和特定列上。通过视图,用户可以被限制在数据的不同子集上,使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后的子集上。
(3)逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。

9.3 创建视图

 CREATE [ OR REPLACE ]
    VIEW view _ name [( column _ list )] 
    AS select _ statement 

说明
(1) view _ name 为视图名。视图属于数据库。在默认情况下,将在当前数据库中创建视图。如果要在其他给定数据库中创建视图,应将名称指定为 db _ name . view _ name 。
(2) CREATE VIEW 语句能创建新的视图,如果给定了 OR REPLACE 子句,该语句还能替换已有的视图。
(3) select _ statement 用来创建视图的 SELECT 语句,它给出了视图的定义。该语句可从基本表(一个或两个以上的表)或其他视图进行选择。
(4)默认情况下,由 SELECT 语句检索的列名将用作视图列名。如果想为视图列定义另外的名称,可使用可选的 column _ list 子句,列出由逗号隔开的列名称即可。但要注意, column _ list 中的名称数目必须等于 SELECT 语句检索的列数。
(5)视图是虚表,只存储对表的定义,不存储数据。

注意
(1)要求具有针对视图的 CREATE VIEW 权限,以及针对由 SELECT 语句选择的每一列上的某些权限。对于在 SELECT 语句中其他位置使用的列,必须具有 SELECT 权限。如果还有 OR REPLACE 子句,必须在视图上具有 DROP 权限。
(2)在视图定义中命名的表必须已存在,视图必须具有唯一的列名,不得有重复,就像基本表那样。
(3)视图名不能与表同名。
(4)在视图的 FROM 子句中不能使用子查询。
(5)在视图的 SELECT 语句不能引用系统或用户变量。
(6)在视图的 SELECT 语句不能引用预处理语句参数。问广机休网外新明厨山畔
(7)在视图定义中允许使用 ORDER BY ,但是,如果从特定视图进行了选择,而该视图使用了具有自己 ORDER BY 的语句,它将被忽略。
(8)在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用 CHECK TABLE 语句。
(9)在定义中不能引用 TEMPORARY 表,不能创建 TEMPORARY 视图。
(10)不能将触发程序与视图关联在一起。

9.4 查看视图

查看视图是指查看数据库中已存在的视图的定义。查看视图必须要有 SHOW VIEW 的权限, MySQL 数据库下的 user 表中保存着这个信息。查看视图的方法包括 SHOW TABLE 语句、 DESC 语句和 SHOW CREATE VIEW 语句等。

9.4.1 查看已创建的视图

视图是一个虚表,所以视图的查询还是如同查询基本表一样,用 SHOW TABLES 语句进行查看,可看到新创建的视图 。

show tables;

9.4.2 查看视图结构
desc 视图名称;

9.4.3 查看视图的定义
show create view 视图名;

9.5 使用视图

9.5.1 使用视图进行查询
select……from 视图名称 where……

9.5.2 使用视图更新基本表数据

使用试图更新基本表数据,是指在视图中进行插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作而更新基本表的数据。因为视图是一个虚拟表,其中没有数据,通过视图更新时,只能更新权限范围内的数据,超出了范围,就不能更新。

9.6 修改视图

alter view 视图名称 as select……;

9.7 删除视图

删除数据和新增数据类型,不能从多表视图中删除和新增数据。

删除了视图的记录,源表中的数据也会被删除。

drop view 视图名称

五、 创建和使用程序

任务10 建立和使用存储过程

10.1认识存储过程

从 MySQL 5.1版本开始支持存储过程和存储函数。在 MySQL 中,可以定义一段完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它,这样的语句集称为存储过程。存储过程是数据库对象之一。它提供了一种高效和安全的访问数据库的方法,经常被用来访问数据和管理要修改的数据。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程也是非常有用的。数据库中存储过程可以看作是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 ​ 存储过程更一种用来处理数据的方式,是一种没有返回值的函数。

10.1.2 存储过程的优点
  • 存储过程在创建时进行编译,以后每次调用及执行时不用再重新编译,而一般SQL语句每执行一次就需要编译一次,所以使用存储过程可以提高数据库执行速度。
  • 存储过程创建以后可以重复被调用,从而减少数据库开发人员的工作量。
  • 当对数据库进行复杂操作时(如对多个表进行增加、删除、修改、查询操作时),可将此复杂操作用存储过程封装起来,与数据库提供的事务处理结合在一起使用。
  • 安全性较高,可设定指定用户对存储过程的使用权。

10.1.3 存储过程的缺点
  • 可移植性差
  • 修改存储过程繁琐

10.2创建基本的存储过程

创建存储过程
create procedure 过程名字 ([in|out|inout 变量名字 数据类型[……]])
begin
body
end

查看存储过程
show procedure status

查看自定义的存储过程
show create procedure 存储过程名称

10.3执行存储过程

在创建存储过程之后,可以在程序、触发器或者存储过程中调用已经创建好的存储过程,但是必须使用到call语句。

call 存储过程名称

10.4创建带变量的存储过程

10.4.1 局部变量声明与赋值
1. 用DECLARE语句声明局部变量
declare 变量名[...] 数据类型 [default value];

2. 用set语句给变量赋值
set 变量名 = expr[,var_name = expr,...]

10.5创建带有流程控制语句的存储过程

使用if...then...else语句
if 条件 then 语句块
[elseif 条件 then 语句块]
……
[else 语句块]
end if;

10.6 修改存储过程

有两种方法可以修改存储过程,一种是使用 ALTER PROCEDURE 语句进行修改,另一种是删除并重新创建存储过程。

10.7 查看存储过程的定义

可以使用show命令查看创建的存储过程和语句块。

10.8 删除存储过程

可以使用drop procedure删除已经存在的存储过程。

drop procedure 过程名字;

任务11 建立和使用存储函数

11.1 认识存储函数

存储函数和存储过程一样,是在数据库中定义一些 SQL 语句的集合。一旦它被存储,客户端不需要再重新发布单独的语句,直接调用这些存储函数来替代即可,可以避免开发人员重复地编写相同的 SQL 语句。而且,存储函数和存储过程一样,是在 MySQL 服务器中存储和执行的,可以减少客户端和服务器端的数据传输。

11.2 创建存储函数

create function ……

定义边界用delimiter

11.3 调用存储函数

select ……

11.4 查看存储函数

show function status;

11.5 修改存储函数

通过 ALTER FUNCTION 语句来修改存储函数,一种方法是 ALTER PROCEDURE 语句进行修改,另一种方法是删除并重新创建存储函数。

11.6 删除存储函数

drop function if [if exists] 过程名称;

任务12 建立和使用触发器

12.1 认识触发器

触发器是一种特殊的存储过程,只要满足一定的条件,对数据进行 INSERT 、 UPDATE 和 DELETE 事件时,数据库系统就会自动执行触发器中定义的程序语句,以进行维护数据完整性或其他特殊的任务。

12.2 创建触发器

 CREATE TRIGGER trigger _ name trigger _ time trigger _ event 
 ON tbl _ name FOR EACH ROW trigger _ stmt

12.3 查看触发器

show triggers;

12.4 删除触发器

drop trigger 触发器名称

任务13 建立和使用事件

13.1 认识事件

     自 MySQL 5.1.6起, MySQL 增加了一个非常有特色的功能﹣﹣事件调度器( Event Scheduler ),可以用于定时执行某些特定任务(如删除记录、对数据进行汇总等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是, MySQL 的事件调度器可以精确到每秒钟执行一项任务,而操作系统的计划任务(如 Linux 下的 cron 或 Windows 下的任务计划)只能精确到每分钟执行一次。这一功能对于一些对数据实时性要求比较高的应用(如股票、赔率、比分等)是非常适合的。

​       事件调度器有时也可称为临时触发器( Temporal Triggers ),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器( Triggers )是基于某个表所产生的事件触发的,区别就在这里。 MySQL 事件调度器负责调用事件。这个模块是 MySQL 数据库服务器的一部分。它不断地监视一个事件是否需要调用。要创建事件,必须打开调度器。可以使用系统变量 EVENT _ SCHEDULER 来打开事件调度器, TRUE (或1或 ON )为打开, FALSE (或0或 OFF )为关闭。

13.2 创建事件

create event [if not exists] event_name

说明
(1) event - name :表示事件名。

(2) schedule :是时间调度,表示事件何时发生或者每隔多久发生一次。

      ① AT 子句:表示事件在某个时刻发生。 timestamp 表示一个具体的时间点,后面还可以加上一个时间间隔,表示在这个时间间隔后事件发生。 interval 表示这个时间间隔,由一个数值和单位构成, count 是间隔时间的数值。

    ② EVERY 子句:表示在指定时间区间内每隔多长时间事件发生一次。 STARTS 子句指定开始时间, ENDS 子句指定结束时间。

(3) DO sql _ statement :事件启动时执行的 SQL 代码。如果包含多条语句,可以使用 BEGIN … END 复合结构。

13.3 查看事件

show events [from schema_name]

13.4 修改事件

alter event event_name

13.5删除事件

drop event [if exists] [database name.] event name

六、数据库安全与性能优化

任务14 用户与权限

14.1 创建用户账户

14.1.1 用create user 创建用户
create user 用户 [identified by[password]'password']
                [,用户[identified by [password]'password']]

14.1.2 用set password 修改用户密码
set password [for user]=password('newpassword')

14.1.3 重命名用户名
rename user old_user to new_user,
                        [,old_user to new_user]

14.1.4 修改user表

user表是MySQL中最重要的一个权限表。可以使用desc语句来查看user表的基本结构。

insert into user …… values ……

14.2授予用户权限

MySQL 的权限可以分为多个层级。

(1)全局层级:使用 ON *.*语法赋予权限。

(2)数据库层级:使用 ON db _ name .*语法赋予权限。

(3)表层级:使用 ON db _ name . tbl _ name 语法赋予权限。

(4)列(字段)层级:语法结构采用 SELECT (col1,col2…)、 INSERT (col1,col2…)和 UPDATE (col1,col2...)。

14.3 初始 MySQL 账户安全

     MySQL 授权表 user 定义了初始 MySQL 用户账户和访问权限。

​     一般情况下, MySQL 创建两个 root 账户。在 Windows 中,一个 root 账户用来从本机连接 MySQL 服务器,它具有所有权限;另一个允许从任何主机连接,具有 test 数据库或其他以 test 开始的数据库的所有权限。初始账户均没有密码,因此任何人都可以用 root 账户不用任何密码来连接 MySQL 服务器。

​     一般情况下, MySQL 创建两个匿名用户账户,每个账户的用户名均为空。匿名账户没有密码,因此任何人都可以使用匿名账户来连接 MySQL 服务器。在 Windows 中,一个匿名账户用来从本机进行连接。它具有所有权限,同 root 账户一样。另一个可以从任何主机上连接,具有 test 数据库或其他以 test 开始的数据库的所有权限。 ​

    使用如下语句可以查看初始 root 账户和匿名用户账户信息。

 mysql > SELECT Host , User , password FROM mysql.user;

(1)为 root 账户指定密码,为匿名账户指定密码,可以使用 SET PASSWORD 语句,也可以使用 UPDATE 语句 注意: 使用 PASSWORD ()函数为密码加密。 使用 UPDATE 更新密码后,必须让服务器用 FLUSH PRIVILEGES 重新读授权表。

(2)删掉匿名账户。

DELETE FROM mysql.user WHERE User ='';

14.7 密码安全

在管理级别,绝不能将MySQL.user表的访问权限授予任何非管理账户。

任务15 数据库备份与恢复

15.1用 SELECT INO OUTFILE 备份表数据

使用 SELECT INTO OUTFILE 语句把表数据导出到一个文件中,并用 LOAD DATA INFILE 语句恢复数据。 例如:备份表 STUDENTS 。

 SELECT * FROM STUDENTS INTO OUTFILE ' STUDENTS . TXT ';

15.2用 LOAD DATA INFILE 恢复表数据

删除数据

delete from 表名;

恢复数据

load data infile …… into table 表名;

15.3用 mysqldump 备份与恢复

mysqldump 默认导出的.sql 文件中不仅包含了表数据,还包括导出数据库中所有数据表的结构信息。另外,使用 mysqldump 导出的.sql 文件如果不带绝对路径,默认是保存在 bin 目录下的。

mysqldump - hhostname - uusername - ppassword [ options ] db _ name [ Table ]> filename

15.4用 mysqllimport 恢复表数据

mysqlimport 客户端可以用来恢复表中的数据,它提供了 LOAD DATA INFILE 语句的﹣个命令行接口,发送一个 LOAD DATA INFILE 命令到服务器来运行。用 mysqlimport 恢复数据,大多数情况下直接对应 LOAD DATA INFILE 语句。

mysqlimport [ options ] db _ name filename

15.5用 SOURCE 恢复表和数据库

MySQL 最常用的数据库导入命令就是 source 。 source 命令的用法非常简单,首先进入 MySQL 数据库的命令行管理界面,然后选择需要导入的数据库,再使用 source 命令能够将备份好的. sql 文件导入到 MySQL 数据库中。

source 文件地址;

任务16 数据库性能优化

16.1 优化 MySQL 服务器

16.1.1 通过修改 my.ini 文件进行性能优化

MySQL 配置文件( my . ini )保存了服务器的配置信息,通过修改 my . ini 文件的内容可以优化服务器,提高性能。 假设用作 MySQL 服务器的计算机内存有4GB左右,主要的几个参数推荐设置如下。

 sort _ buffer _ size =6M //查询排序时所能使用的缓冲区大小
 read _ buffer _ size =4M //读查询操作所能使用的缓冲区大小
 join _ buffer _ size =8M //联合查询操作所能使用的缓冲区大小
 query _ cache _ size =64M //查询缓冲区的大小
 max _ connections =800 //指定MySQL允许的最大连接进程数

16.1.2 通过 MySQL 控制台进行性能优化

除了修改 my . ini 文件之外,还可以直接通过在 MySQL 控制台进行查看和修改设置。数据库管理人员可以使用 SHOW STATUS 或 SHOW VARIABLES 语句来查询 MySQL 数据库的性能参数,然后用 SET 语句对系统变量进行赋值。

1.查询主要性能参数

(1)用 SHOW STATUS 语句。

 SHOW STATUS LIKE 'value';

其中, value 参数是常用的几个统计参数。

. connections :连接 MySQL 服务器的次数。

. uptime : MySQL 服务器的上线时间。

· slow _ queries :慢查询的次数。

. com _ select :查询操作的次数。

. com _ insert :插入操作的次数。

· com _ delete :删除操作的次数。

· com _ update :更新操作的次数。

(2)用 SHOW VARIABLES 语句。

 SHOW VARIABLES LIKE ' value ';

其中, value 参数是常用的几个统计参数。

· key _ buffer _ size :表示索引缓存的大小。

· table _ cache :表示同时打开的表的个数。

· query _ cache _ size :表示查询缓冲区的大小。

· query _ cache _ type :表示查询缓存区的开启状态。0表示关闭,1表示开启。

· sort _ buffer _ size :表示排序缓存区的大小。这个值越大,排序就越快。

· innodb _ buffer _ pool _ size :表示 InnoDB 类型的表和索引的最大缓存。这个值越大,查询的速度就会越快。但是,这个值太大了也会影响操作系统的性能。

16.2优化表结构设计和数据操作

16.2.1 添加中间表

在实际的数据查询过程中,有时经常查询来自于两个及两个以上表的相关字段,这就要求进行基于多表的连接查询。如果经常进行连接查询,会浪费很多的时间,降低 MySQL 数据库的性能。为避免频繁地进行多表连接查询,提高数据库性能,可以建立一个中间表,这个表包含需要经常查询的相关字段,然后从基表中将数据插入中间表中,之后就可以使用中间表来进行查询和统计了,这样会快很多。

16.2.2 增加冗余字段

在建立表的时候有意识增加冗余字段,减少连接查询操作,提高性能。

16.2.3 合理设置表的数据类型和属性
1. 选取适用的字段类型

表中字段的长度设得尽可能小。

使用enum而不是varchar。

2. 为每张表设置一个ID

为数据库里的每张表都设置一个ID作为其主键,而且最好是一个INT型的主键(推荐使用unsigned),并设置自动增量(auto_increment)。

3. 尽量避免定义null。

16.2.4 优化插入记录的速度

有多种方法可以优化插入记录的速度。

(1)对于大量数据,可以先加载数据再建立索引,如果已建立了索引,可以先把索引禁止。这是因为 MySQL 会根据表的索引对插入的记录进行排序,不断地刷新索引,如果插入大量数据,会降低插入的速度。 禁止和启用索引的语法如下。

mysql > ALTER TABLE table _ name DISABLE KEYS ;
mysql > ALTER TABLE table _ name ENABLE KEYS ;

(2)加载数据时要采用批量加载,尽量减少 MySQL 服务器对索引的刷新频率。尽量使用 LOAD DATE INFILE 语句插入数据,而不用 INSERT 语句插入数据。如果必须使用 INSERT 语句,请尽量使他们集中在一起,一次插入多行记录,不要一次只插入一行。

16.2.5 对表进行分析、检查、优化和修复
1. 使用 NALYZE TABLE 语句分析表

MySQL 的 Optimizer (优化元件)在优化 SQL 语句时,首先需要收集相关信息,其中就包括表的 cardinality (可以翻译为"散列程度"),它表示某个索引对应的列包含多少个不同的值。如果 cardinality 远小于数据的实际散列程度,那么索引就基本失效了。

ANALYZE TABLE table _ name ;

各项表达的意义如下。 Table :表示表的名称。

Op :表示执行的操作。

analyze 表示进行分析操作, check 表示进行检查查找, optimize 表示进行优化操作。

Msg _ type :表示信息类型,其显示的值通常是状态( status )、警告( warning )、错误( error )和信息( info )这四者之一。

Msg _ text :显示信息。

2. 使用 CHECK TABLE 检查表

数据库经常可能遇到错误,譬如数据写入磁盘时发生错误,或是索引没有同步更新,或是数据库未关闭 MySQL 就停止了。遇到这些情况,数据库就可能发生错误。这时,可以使用 ChECK TABLE 来检查表是否有错误。

 CHECK TABLE table _ name;

3. 使用 OPTIMIZE TABLE 优化表

     当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收。另外,对于那些声明为可变长度的数据列(如 VARCHAR 型),时间长了会使得数据表出现很多碎片,减慢查询效率。               OPTIMIZE TABLE 语句可以消除删除和更新操作而造成的磁盘碎片,用于回收闲置的数据库空间,从而减少空间浪费。使用了 OPTIMIZE TABLE 命令后这些空间将被回收,并且对磁盘上的数据行进行重排。
     OPTIMIZE TABLE 只对 MyISAM 、 BDB 和 InnoDB 表起作用,只能优化表中的 VARCHAR 、 BLOB 和 TEXT 类型的字段。对于写比较频繁的表,要定期进行优化,一周或一个月一次,看实际情况而定。

OPTIMIZE TABLE table _ name ;

4. 使用 REPAIR TABLE 修复表
 REPAIR TABLE table _ name ;

这条语句同样可以指定选项,具体如下。

QUICK :最快的选项,只修复索引树。

EXTENDED :最慢的选项,需要逐行重建索引。

USE _ FRM :只有当 MYI 文件丢失时才使用这个选项,全面重建整个索引。

REPAIR TABLE 命令只对 MyISAM 和 ARCHIVE 类型的表有效。

16.3优化查询

16.3.1 查看 SELECT 语句的执行效果

MySQL 中,可以使用 EXPLAIN 语句和 DESCRIBE 语句来分析查询语句的执行效果。

1. 使用 EXPLAIN 语句

EXPLAIN 命令在解决数据库性能是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决, EXPLAIN 可以用来查看 SQL 语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

 explain select ... from ...[ where ...]

下面对 EXPLAIN 语句输出行的相关信息进行说明。

(1) id 表示 SELECT 的查询序列号。

(2) select _ type 表示查询类型。

(3) table :输出行所引用的表。

(4) type :这列最重要,显示出连接使用了哪种连接类别,是否使用索引,它是使用 EXPLAIN 命令分析性能瓶颈的关键项之一。

(5) possible _ keys :表示查询中可能用到哪个索引。如果该列是 null ,则没有相关的索引。

(6) key :显示查询实际使用的键(索引)。

(7) key _ len :显示使用的索引字段的长度。

(8) ref :显示使用哪个列或常数与索引一起来查询记录。

(9) rows :显示执行查询时必须检查的行数。

(10) Extra :包含解决查询的附加信息,也是关键参考项之一。想要让查询尽可能地快,那么就应该注意 Extra 字段的值为 usingfilesort 和 using temporary 的情况。

2. 使用DESCRIBE语句
describe select 语句

16.3.2 使用索引优化查询
explain select * from …… where ……

1. 查询语句中使用LIKE关键字
explain select * from …… where …… like ……

2. 查询语句中使用or关键字
explain select * from …… where …… or ……

3. 建有索引的字段上尽量不要使用函数进行操作

16.3.3 优化子查询

使用子查询可以一次性地完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是 MySQL 在执行带有子查询的查询时,需要先为内层子查询语句的查询结果建立一个临时表,外层查询语句在临时表中查询记录,查询完毕后再撤销这些临时表。这样,子查询的速度会受到一定的影响,特别是查询的数据量比较大时,这种影响就会随之增大。因此,尽量使用连接查询(全连接或 JOIN 连接)来替代子查询,连接查询不需要建立临时表,其速度会比子查询快。

16.3.4 优化慢查询
1. 查看相关系统变量,查询系统默认状态
show variables like 'long%';

2. 设置变量,优化慢查询
set long_query_time = 1;

16.4 优化性能的其他方面

下面列举的几种情形将导致引擎放弃索引而进行全表扫描,应尽量避免。

(1)不要滥用 MySQL 的类型自动转换功能。

(2)尽量避免在 WHERE 子句中对字段进行 NULL 值判断。 NULL 对于大多数数据库都需要特殊处理, MySQL 也不例外。不要以为 NULL 不需要空间,其实它需要额外的空间,并且,它在进行比较的时候程序会更复杂。当然,这里并不是说就不能使用 NULL 了,现实情况是很复杂的,在有些情况下,依然需要使用 NULL 值。

(3)尽量避免在 WHERE 子句中使用"!="或"<>"操作符。 MySQL 只有在使用く、<=、=、>、>=、 between 和 like 的时候才能使用索引。

(4)尽量避免 WHERE 子句对字段进行函数操作。

(5)尽量避免 WHERE 子句对字段进行表达式操作。

(6)尽量避免使用 IN 或 NOT IN 。对于连续的数值,能用 BETWEEN 就不要用 IN 。

总结:MySQL常用语句

· USE

USE DATABASENAME; //进入指定的数据库当中

· CREATE

 CREATE DATABASE DEFAULT CHARACTER SET UTF8; //创建库,并指定字符集   
 CREATE TABLE TABLENAME ( COLUMS ); //创建表,并且给表指定相关列
 CREATE INDEX ; //创建普通索引
 CREATE UNIQUE ; //创建唯一性索引
 CREATE VIEW ; //创建视图
 CREATE PROCEDURE ; //创建存储过程
 CREATE FUNCTION ; //创建存储函数
 CREATE EVENT ; //创建事件
 CREATE TRIGGER ; //创建触发器
 CREATE USER ; //创建用户

· SELECT

 SELECT VERSION ();//从服务器得到当前 MySQL 的版本号与当前日期
 SELECT USER ();//得到当前数据库的所有用户
 SELECT * FROM TABLENAME ;//查询表数据
 SELECT FUNCTIONNAME ;//调用存储函数
 INSERT [REPLACE] INTO TABLENAME VALUES;//向表插入数据,可以一次插入多行数据,数据之间用","分隔。
 UPDATE … SET ..;//更新表数据

· ALTER

ALTER DATABASE ;//修改数据库
ALTER TABLE ;//修改表
ALTER VIEW ;//修改视图
ALTER PROCEDURE ;//修改存储过程
ALTER FUNCTION ;//修改存储函数
ALTER EVENT ;//修改事件

· DELETE / DROP

DELETE FROM TABLENAME WHERE;//删除符合条件的表数据
DROP DATABASE DBNAME ;//删除库
DROP TABLE TABLENAME ;//删除表
DROPINDEXINDEXNAME ;//删除索引
DROP VIEW VIEWNAME ;//删除视图
DROP PROCEDURE PROCEDURENAME; //删除存储过程
DROP FUNCTIon functionnaMe ;//删除存储函数
DROP EVENT EVENTNAME ;//删除事件
DROP TRIGGER TRIGGERNAME ;//删除触发器
DROP UASE USERNAME ;//删除用户

· SHOW

SHOW STATUS ;//显示一些系统特定资源的信息,如正在运行的线程数量
SHOW VARIABLES ;//显示系统变量的名称和值
SHOW PRIVILEGES ;//显示服务器所支持的不同权限
SHOW DATABASES ;//查看所有数据库
SHOW TABLES ;//查看当前数据库中的所有表(视图)
SHOW INDEX FROM TABLENAME ;//显示表的索引
SHOW PROCEDURE STATUS ;//查看存储过程
SHOW CREATE PROCEDURE ;//查看预先指定的存储过程的文本
SHOW FUNCTION STATUS ;//查看存储函数
SHOW CREATE FUNCTION ;//查看预先指定的存储函数的文本
SHOW EVENTS ;//查看事件
SHOW TRIGGERS ;//查看触发器,注意,没有 status 

· DEACRIBE / DESC

 DEACRIBE TABLENA ME ;//将表当中的所有信息详细显示出来
 DESC VIEW ;//将视图当中的所有信息详细显示出来

· LOAD DATA INFILE / SELECT INTO OUTFILE

 SELECT * FROM pet INTO OUTFILE 'mytabe.txt'; //备份pet数据
 LOAD DATA LOCAL INFILE 'mytable . txt' INTO TABLE pet; //导入数据到表中

· GRANT / REVOKE

 GRANT all on *.* to peter @ localhost @ localhost identified by '123456';
//创建 MySQL 账户,并授予其权限
 REVOKE all on XSGL.* FROM peter@localhost ;// 回收用户权限

.其他

Mysqidump -- all - databases > all _ databases.sql; //备份数据库
CALL PROCEDURENAME ;
//调用一个使用 CREATE PROCEDURE 建立的预先指定的存储过程

你可能感兴趣的:(MySQL,数据库)