第二章 - MySQL数据库语言基础

第二章 - MySQL数据库语言基础

2.1 MySQL数据库概述

MySQL是一个开放源码的小型、跨平台数据库管理系统,被广泛地应用在Internet上的中小型网站中。由于MySQL具有体积小、运行速度快、总体拥有成本低、开放源码的优势,许多中小型网站都为了降低网站总体拥有成本而选择了MySQL作为网站数据库。

2.1.1 MySQL数据库的发展背景

1996年发布了能够在小范围内使用的MySQL 1.0版。

1999年MySQL AB公司在瑞典成立。MySQL数据库从此能够支持事务处理了。

2000年MySQL数据库集成了存储引擎InnoDB,该引擎是最为成功的MySQL事务存储引擎。

2003年12月,MySQL 5.0版本发布,提供了视图和存储过程等功能。

2008年11月,MySQL 5.1发布,它提供了分区、事件管理,同时修复了大量的Bug。

2009年4月,甲骨文公司收购Sun公司,自此MySQL数据库进入Oracle时代。

2013年2月,甲骨文公司宣布MySQL 5.6正式版发布,首个正式版本号为5.6.10。2013年4月发布5.7.1版本。

2016年12月发布的mysql-installer-community-5.7.17版本

2.1.2 MySQL使用优势

MySQL数据库是开放源代码的数据库。 保证了MySQL数据库是一款可以自由使用的数据库。

MySQL数据库的跨平台性。 MySQL不仅可以在Windows系列的操作系统上运行,还可以在UNIX、Linux和Mac OS等操作系统上运行。

MySQL的价格优势。

功能强大使用方便。 MySQL数据库是一个多用户、多线程SQL数据库服务器,它是C/S结构的实现,由一个服务器守护程序mysqlId和很多不同的客户程序和库组成。MySQL能够快速、有效和安全的处理大量的数据,并达到是快速、健壮和易用的目标。

2.1.3 MySQL系统特性

使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。并为PHP、Java、C、C++、Python、Perl、Eiffel、Ruby和Tcl等多种编程语言提供了应用程序接口API。

支持Windows、Linux、Mac OS、AIX、FreeBSD、HP-UX、NovellNetware、OpenBSD、OS/2 Wrap以及Solaris等多种操作系统。

MySQL支持多线程,能够充分利用CPU资源。

能够自动优化SQL查询算法,有效地提高了信息查询速度。

能够作为一个单独的应用程序应用在客户端服务器网络环境中,也可以作为一个库嵌入到其他软件中。

提供多种自然语言支持,常见的编码如中文的GB2312、BIG5及国际通用转换格式UTF-8等,都可以用作数据表名和数据列名。

提供TCP/IP、ODBC和JDBC等多种数据库连接技术。

支持多种存储引擎,提供用于管理、检查、优化数据库操作的管理工具。
具有大型数据库所有常用功能,可以处理拥有亿万条记录级的海量数据。

2.1.4 MySQL发行版本

MySQL的目前一般可用版本已经经过严格标准的测试,可以保证其安全可靠地使用。

根据操作系统的类型来划分,大体上可以分为 Windows版、UNIX版、Linux版和Mac OS版。如果要下载MySQL数据库,要了解自己的操作系统,然后根据操作系统来下载相应的MySQL数据库。

根据发布顺序来划分,MySQL数据库可以分为4.0、5.0、5.1以及5.7等系列版本。

根据MySQL数据库的开发情况,可将其分为Alpha、Beta、Gamma和Generally Available等版本。

Alpha:处于开发阶段的版本,可能会增加新的功能或进行重大修改。
Beta:处理测试阶段的版本,开发已经基本完成,但是没有进行全面的测试。
Gamma:该版本是发行过一段时间的Beta版,比Beta版要稳定一些。
Generally Available:该版本已经足够稳定,可以在软件开发中应用。有些资料会将该版本称为Production版。

根据MySQL数据库用户群体的不同,将其分为社区版(Community Edition)和企业版(Enterprise)。

社区版是自由下载而且是免费开源的,但是没有官方的技术支持。

企业版提供了最全面的高级功能、管理工具和技术支持,实现了最高水平的MySQL数据库可扩展功能、安全性、可靠性和无故障运行时间。

2.1.5 MySQL 的新功能

支持JSON。JSON(Java Script Object Notation的缩写)是一种存储信息的格式,可以很好地替代XML。

性能和可扩展性。改进InnoDB的可扩展性和临时表的性能,从而实现更快的网络和大数据加载等操作。

改进复制以提高可用性的性能。改进复制包括多源复制、多从线程增强、在线GTIDs和增强的半同步复制。

性能模式提供更好的视角。增加了许多新的监控功能,以减少空间和过载,使用新的SYS模式显著提高易用性。

保证数据库的安全。以安全第一为宗旨,提供了很多新的功能,从而保证数据库的安全。

对多种性能进行了优化。重写了大部分解析器、优化器和成本模型,这提高了可维护性、可扩展性和性能。

支持GIS (Geographic information system,地理信息系统)。MySQL 5.7 全新的功能,包括 InnoDB 空间索引和Boost几何,同时提高完整性和标准符合性。



2.2 安装MySQL数据库

2.2.1 Linux / UNIX 上安装 MySQL

Linux 平台上推荐使用 RPM 包来安装 MySQL ,MySQL AB 提供了以下 RPM 包的下载地址:

MySQL - MySQL 服务器。如果不是只想连接运行在另一台机器上的 MySQL 服务器,请你选择该选项。
MySQL-client - MySQL 客户端程序,用于连接并操作 Mysql 服务器。
MySQL-devel - 库和包含文件,如果你想要编译其它如 Perl 模块等 MySQL 客户端,则需要安装该 RPM 包。
MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用 MySQL。
MySQL-bench - MySQL 数据库服务器的基准和性能测试工具。

以下安装 MySQL RMP 的实例是在 SuSE Linux 系统上进行,当然该安装步骤也适合应用于其他支持 RPM 的 Linux 系统,如: CentOS。

安装前,我们可以检测系统是否自带安装 MySQL:

rpm -qa | grep mysql

如果你系统有安装,那可以选择进行卸载:

rpm -e mysql  // 普通删除模式
rpm -e --nodeps mysql  // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除

MySQL 安装步骤如下:

使用 root 用户登陆你的 Linux 系统。

下载 MySQL RPM 包,下载地址为:MySQL 下载。

通过以下命令执行 MySQ L安装,rpm 包为你下载的 rpm 包:

[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm

以上安装MySQL服务器的过程会创建MySQL用户,并创建一个MySQL配置文件my.cnf。

你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。

以下是一些MySQL可选包的安装过程,你可以根据自己的需要来安装:

[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm

2.2.2 Window上安装MySQL

在Windows操作系统下,MySQL数据库的安装一般选择图形化界面安装,图形化界面包有完整的安装向导,安装和配置非常方便。

安装准备。在安装之前,需要到MySQL数据库的官方网站(http://dev.mysql.com/downloads)上找到要安装的数据库版本并进行下载。当然,读者也可以直接在一些搜索引擎中搜索下载链接。

MySQL下载完成后找到下载到本地的文件,并且解压缩包,简单安装步骤如下。

(1) 双击MySQL安装程序(mysql-installer-community-5.7.17.0.msi),弹出如图1-8所示的“打开文件-安全警告”窗口。

image

(2)在图1-8所示的窗口中单击“运行”按钮,进入MySQL Installer的协议许可协议界面,如图1-9所示,选择I accept the license terms按钮,表示接受用户安装时的许可协议。

image

(3)单击next按钮,进入安装类型选择界面如图1-10所示。可以选择需要的版本,左侧提供5种安装类型
默认选中Developer Default选项。
Server only表示仅作为服务器
Client only表示仅作为客户端
Full表示完全安装类型
Custom表示自定义安装类型。

image

(4)单击next按钮,进入将要安装或更新的应用程序界面如图1-11所示。

image

5)单击Execute按钮,进入账户和角色界面,按要求设置root账户密码。如图1-12为root用户设置密码

image

(6)单击next按钮,如图1-13所示,进入开始安装和配置MySQL服务器界面,依次按照提示,保持默认选择,就可以进入安装完成后的界面,如图1-14所示。

image

单击图1-14所示的Finish按钮就可以运行MySQL数据库了。

image

MySQL服务的配置

(1)右击“计算机”图标,在弹出的快捷菜单中选择“属性”命令,在弹出的对话框中选择“高级系统设置”,弹出“系统属性”对话框。

image

(2)在“系统属性”对话框中,选择“高级”选项,单击“环境变量”按钮,弹出“环境变量”对话框。

image

(3)在“环境变量”对话框中,定位到“系统变量”中的path选项,单击“编辑”按钮,将弹出“编辑系统变量”对话框。

image

(4)在“编辑系统变量”对话框中,将MySQL服务器的bin文件夹位置(G:\Program Files\MySQL\MySQL Server 5.7\bin)添加到变量值文本框中,注意要使用“;”与其他变量值进行分隔,最后,单击“确定”按钮。

(5)环境变量设置完成后,再使用MySQL命令即可成功连接MySQL服务器。

(6)断开MySQL服务器。连接到MySQL服务器后,可以通过在MySQL提示符下输入exit或者quit命令断开MySQL连接,格式如下:

mysql> quit; 

2.2.3 验证MySQL安装

在成功安装MySQL后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证MySQL是否工作正常。

使用 mysqladmin 工具来获取服务器状态:

使用 mysqladmin 命令俩检查服务器的版本,在linux上该二进制文件位于 /usr/bin on linux ,在window上该二进制文件位于C:\mysql\bin 。

[root@host]# mysqladmin --version

linux上该命令将输出以下结果,该结果基于你的系统信息:

mysqladmin  Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386

如果以上命令执行后未输入任何信息,说明你的MySQL未安装成功。

使用 MySQL Client(MySQL客户端) 执行简单的SQL命令

你可以在 MySQL Client(MySQL客户端) 使用 MySQL 命令连接到MySQL服务器上,默认情况下MySQL服务器的密码为空,所以本实例不需要输入密码。

命令如下:

[root@host]# mysql

以上命令执行后会输出 mysql > 提示符,这说明你已经成功连接到 MySQL 服务器上,你可以在 mysql > 提示符执行 SQL 命令:

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.13 sec)

MySQL安装后需要做的

MySQL 安装成功后,默认的 root 用户密码为空,你可以使用以下命令来创建root用户的密码:

[root@host]# mysqladmin -u root password "new_password";

现在你可以通过以下命令来连接到MySQL服务器:

[root@host]# mysql -u root -p
Enter password:*******

注意:在输入密码时,密码是不会显示了,你正确输入即可。
Linux系统启动时启动 MySQL

如果你需要在Linux系统启动时启动 MySQL 服务器,你需要在 /etc/rc.local 文件中添加以下命令:

/etc/init.d/mysqld start

同样,你需要将 mysqld 二进制文件添加到 /etc/init.d/ 目录中。



2.3 MySQL工作流程

2.3.1 MySQL工作流程

image

(1)操作系统用户启动MySQL服务。

(2)MySQL服务启动期间,首先将配置文件中的参数信息读入服务器内存。

(3)根据MySQL配置文件的参数信息或者编译MySQL时参数的默认值生成一个服务实例进程Instance。

(4)MySQL服务实例进程派生出多个线程为多个客户机提供服务。

(5)数据库用户访问MySQL服务器的数据时,首先需要选择一台登录主机,然后在该登录主机上开启客户机,输入正确的账户名、密码,建立一条客户机与服务器之间的“通信链路”。

(6)接着数据库用户就可以在MySQL客户机上输入MySQL命令或SQL语句,这些MySQL命令或SQL语句沿着该通信链路传送给MySQL服务实例,这个过程称为客户机向MySQL服务器发送请求。

(7)MySQL服务实例负责解析这些MySQL命令或SQL语句,并选择一种执行计划运行这些MySQL命令或SQL语句,然后将执行结果沿着通信链路返回给客户机,这个过程称为MySQL服务器向MySQL客户机返回响应。

(8)数据库用户关闭MySQL客户机,通信链路被断开,该客户机对应的MySQL会话结束。

2.3.2 MySQL的启动和登录

启动MySQL服务

(1)cmd控制台启动。这种方式非常简单,net start mysql57 表示启动MySQL服务,net stop mysql57 表示关闭MySQL服务。

(2)手动启动。执行“开始”“设置”“控制面板”“管理工具”“服务”命令进行设置,打开的窗口(执行“开始”“运行”命令并输入services.msc后按Enter键也可以弹出窗口)。

image

更改MySQL服务的启动类型,选中MySQL57服务项右击,在弹出的快捷菜单中选择“属性”命令,弹出的对话框。

image

上图可以看到,可以更改服务状态为“停止”、“暂停” 和“ 恢复”,还可以设置服务的启动类型。在“启动类型”下拉列表框中可以选择“自动”、“手动”和“已禁用”选项,说明如下。

自动 :MySQL服务自动启动,可以手动将服务状态变为停止、暂停和重新启动等。如果读者经常练习MySQL数据库的操作,最好将MySQL设置为自动启动,这样可以避免每次手动启动MySQL服务。

手动 :MySQL服务需要手动启动,启动后可以改变服务状态,如停止和暂停等。如果读者使用MySQL数据库的频率很低,可以考虑将MySQL服务设置为手动启动,这样可以避免MySQL服务长时间占用系统资源。

已禁用 :MySQL服务不能启动,也不能改变服务状态。

登录MySQL数据库

MySQL服务启动后,可以通过客户端来登录MySQL数据库。Windows操作系统下有两种登录MySQL数据库的方式:

执行cmd命令,在打开的DOS窗口中以命令行的方式登录MySQL数据库;

在MySQL客户端直接登录数据库。

(1) 在DOS窗口中登录MySQL数据库。通过DOS窗口登录MySQL数据库执行语句时,可以执行“开始” “运行”命令,在弹出的对话框中输入cmd后按Enter键,即可进入DOS窗口。

登录成功后会出现“Welcome to the MySQL monitor”的欢迎语。

C:\Users\Administrator>net start mysql57
请求的服务已经启动。
C:\Users\Administrator>mysql -u root -p
Enter password: ****
Mysql>
上述执行语句的代码中,
-u后面紧跟着数据库的用户名,此处使用root用户进行登录;
-p表示用户密码,按Enter键输入密码,输入的密码使用星号(*)表示。

(2) MySQL客户端登录数据库。在Windows7操作系统中,执行“开始” “所有程序” MySQL MySQL 5.7目录。

MySQL Command Line Client
MySQL Command Line Client-Unicode

它们都是MySQL客户端的命令行工具,也可以称为MySQL的DOS窗口或控制台。通过在控制台中执行语句可以登录MySQL数据库,然后执行其他的相关SQL语句进行操作。

DOS窗口和控制台包含一些说明性的语句如下:

Commands end with ; or \g:说明MySQL控制台下的命令是以分号(;)或“\g”来结束的,遇到这个结束符就开始执行命令。

Your MySQL connection id is 5:id表示MySQL数据库的连接次数,如果数据库是新安装的,且是第一次登录,则显示1。如果安装成功后已经登录过,将会显示其他的数字。

Server version:Server version之后的内容表示当前数据库版本,这里安装的版本是5.7.17-enterprise-commercial-advanced。

Type 'help;' or '\h' for help:表示输入“help;”或者\h可以看到帮助信息。

Type ‘\c’ to clear the current input statement:表示遇到\c就清除当前输入语句。

例如,登录MySQL数据库成功后可以直接输入“help;”或\h查看帮助信息,直接在控制台中输入“help;”语句按Enter键,输出结果如下:

mysql> help


2.4 MySQL数据库工作简介

MySQL数据库管理系统提供了许多命令行工具,这些工具可以用来管理MySQL服务器、对数据库进行访问控制、管理MySQL用户以及数据库备份和恢复工具等。另外,MySQL还提供了图形化的管理工具,这使得对数据库的操作更加简单。

2.4.1 MySQL服务器端的常用工具

(1)mysqld:SQL后台程序(即MySQL服务器进程)。该程序必须运行之后,客户端才能通过连接服务器来访问数据库。

(2)mysqld_safe:服务器启动脚本。在UNIX和NetWare中推荐使用mysqld_safe来启动mysqld服务器。mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。

(3)mysql.server:服务器启动脚本。在UNIX中的MySQL分发版包括mysql.server脚本。该脚本用于使用包含为特定级别的、运行启动服务的脚本的、运行目录的系统。它调用mysqld_safe来启动MySQL服务器。

(4)mysql_multi:服务器启动脚本,可以启动或停止系统上安装的多个服务器。

(5)myisamchk:用来描述、检查、优化和维护MyISAM表的实用工具。

(6)mysqlbug:MySQL缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告。

(7)mysql_install_db:该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。

2.4.2 MySQL客户端常用工具

(1)myisampack:压缩MyISAM表以产生更小的只读表的一个工具。

(2)mysql:交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具。

(3)mysqlaccess:检查访问主机名、用户名和数据库组合的权限的脚本。

(4)MySQLadmin:执行管理操作的客户程序,例如创建或删除数据库,重载授权表,将表刷新到硬盘上,以及重新打开日志文件。MySQLadmin还可以用来检索版本、进程,以及服务器的状态信息。

(5)mysqlbinlog:从二进制日志读取语句的工具。在二进制日志文件中包含执行过的语句,可用来帮助系统从崩溃中恢复。

(6)mysqlcheck:检查、修复、分析以及优化表的表维护客户程序。

(7)mysqldump:将MySQL数据库转储到一个文件(例如SQL语句或tab分隔符文本文件)的客户程序。

(8)mysqlhotcopy:当服务器在运行时,快速备份MyISAM或ISAM表的工具。

(9)mysql import:使用load data infile将文本文件导入相关表的客户程序。

(10)mysqlshow:显示数据库、表、列以及索引相关信息的客户程序。

(11)perror:显示系统或MySQL错误代码含义的工具。

2.5 MySQL图形化管理工具

MySQL的图形管理工具有很多,常用的有MySQL Workbench、phpMyAdmin和Navicat等软件。本书选用MySQL Workbench软件作为可视化操作的管理工具

MySQL WorkBench软件的安装步骤如下:

(1)双击安装文件“mysql-workbench-community-6.2.5-win32.msi”。进入“安全警告”界面,单击next按钮,进入安装向导界面。

image

(3)依次单击next按钮,以此进入选择安装类型、和准备安装项目界面。

image

(4)单击Install按钮,进入安装过程,最后单击Finish按钮,即可完成MySQL Workbench软件的安装。

image

(5)选择“开始”“所有程序”,

image

单击MySQL 下的MySQL Workbench 6.2CE命令,即可进入如图1-26的MySQL Workbench界面,接下来就可以利用MySQL Workbench软件实现MySQL数据库的可视化操作了。

MySQL Workbench工具包含以下4个基本功能区域。

image

MySQL Workbench工具包含以下4个基本功能区域。

主菜单:实现MySQL的主要功能操作。
Shortcut(快捷方式):完整的可视化数据库设计和建模。
MySQL Connections :连接信息.
Models  :连接方式、MySQL Workbench工具版本信息。

(6)创建连接。在图形界面中最常用的还是对数据库的基本操作,例如,执行SQL语句实现数据库的添加、数据库表的添加和数据添加、删除以及修改等操作。如果要实现这些操作首先要连接到数据库,单击主菜单Database| Manage Connections命令,弹出Manage Server Connections对话框。在如图1-27所示的对话框中输入连接名称,输入完成后单击Test Connection按钮进行测试,输入root密码,测试成功后,单击OK按钮。返回主界面单击Close按钮即可完成连接。

image



2.6 MySQL基本语法

MySQL语言是一系列操作数据库及数据库对象的命令语句,因此使用MySQL数据库就必须掌握构成其基本语法和流程语句的语法要素,这主要包括常量、变量、关键词、运算符、函数、表达式和控制流语句等。

字符集是最基本的MySQL脚本组成部分,也是MySQL数据库对象的描述符号。

MySQL能够支持39种字符集和127个校对原则。本节着重介绍latin1、UTF-8和gb2312字符集的用法,同时也介绍常量、变量、标识符和关键词的使用。

2.6.1 字符集与标识符

字符集与标识符。 字符集及字符序概念 。字符(Character)是指人类语言中最小的表义符号。例如‘A’、 ‘7’、“%”等字母、数字和特殊符号。字符校对原则(Collation)也称为字符序,是指在同一字符集内字符之间的比较规则。

字符集只有在确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符校对原则,其中有一个是默认字符校对原则(Default Collation)。

MySQL服务器默认的字符集是latin1。MySQL的字符集支持可以细化到4个层次:服务器(Server)、数据库(DataBase)、数据表(Table)和连接层(Connection)。
如果不进行设置,那么连接层级、客户端级和结果返回级、数据库级、表级、字段级都默认使用latin1字符集。

MySQL的字符集通过show character set语句查看。在命令窗口中执行如下命令,即可查看到MySQL的39种字符集。

mysql> show character set;

对于任何一个给定的字符集至少有一个校对原则,也可能有几个校对原则。例如,执行显示latin1系列的命令:

mysql> show collation like ‘latin1%’;

字符集与标识符(说明)

系统启动时默认的字符集是latin1。

UTF-8是针对Unicode字符的一种变长字符编码。例如,如果是UTF-8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

gb2312是简体中文字符集,GBK是是在国家标准GB 2312基础上扩容后兼容GB 2312的标准。

GBK、GB2312等与UTF-8之间都必须通过Unicode编码才能相互转换。对于一个网站、论坛来说,如果英文字符较多,则建议使用UTF-8节省空间。不过现在很多论坛的插件一般只支持GBK。

标识符和关键字。

MySQL的脚本由一条或多条MySQL语句组成,脚本文件后缀名一般为 .sql。

标识符。标识符用来命名一些对象,其通用命名规则是: 标识符由以字母或下划线开头的字母、数字或下划线(_)序列组成。对于标识符是否区分大小写取决于当前的操作系统, Windows下是不敏感的, 但对于大多数 linux\unix 系统来说, 这些标识符大小写是敏感的。

关键字。MySQL的关键字众多,不同版本的MySQL语言关键词也略有变化。MySQL5.7大约有400个左右关键词。所有关键字有自己特定的含义,尽量避免作为标识符。

2.6.2 MySQL字符集的转换过程

编译MySQL时,系统默认的字符集是latin1。可以通过如下方法进行转换。

(1)最简单的修改方法,就是修改MySQL的my.ini(C:\Program Files \MySQL\MySQL Server 5.7)文件中的字符集,查找[mysql]键值,在下面加上一行“default-character-set=utf8” 。修改完后,重启MySQL的服务,使用下列语句查看,发现数据库编码均已改成utf8。

mysql> show variables like 'character%';

(2)还有一种修改字符集的方法,就是使用MySQL的命令。用命令行的方式修改,只是临时更改,当服务器重启后,又将恢复默认设置。

mysql> set character_set_client = utf8; 
mysql> set character_set_connection = utf8; 
mysql> set character_set_database = utf8; 
mysql> set character_set_results = utf8; 
mysql> set character_set_server = utf8; 

(3) 如果设置表的MySQL默认字符集为utf8,并且通过UTF-8编码发送查询,有时存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这个句子。

MySQL> set nameS ('UTF8');

与这3个语句等价。

mysql> set character_set_client =(UTF8);
mysql> set character_set_results =(UTF8);
mysql> set character_set_connection =(UTF8); 

2.6.3 MySQL中的字符集层次设置

MySQL对于字符集的支持细化到4个层次:服务器(Server)、数据库(DataBase)、数据表(Table)和连接(Connection)。

MySQL对于字符集的指定可以细化到一个数据库、一张表和一列,可以细化到应该用什么字符集。 MySQL用下列的系统变量描述字符集。

(1) character_set_server和collation_server :这两个变量是服务器的字符集,默认的内部操作字符集。

(2)character_set_client:客户端来源数据使用的字符集,这个变量用来决定MySQL怎么解释客户端发到服务器的SQL命令文字。

(3)character_set_connection和collation_connection :连接层字符集。这两个变量用来决定MySQL怎么处理客户端发来的SQL命令。

(4)character_set_results:查询结果字符集,当SQL有结果返回的时候,这个变量用来决定发给客户端的结果中文字量的编码。

(5)character_set_database和collation_database :当前选中数据库的默认字符集,create database命令有两个参数可以用来设置数据库的字符集和比较规则。

(6)character_set_system:系统元数据的字符集,数据库、表和列的定义都是用的这个字符集。它有一个定值,是UTF-8 。

对于以“collation_”开头的同上面对应的变量,用来描述字符集校对原则。

表的字符集: create table的参数里可以设置,为列的字符集提供默认值。

列的字符集:决定本列的文字数据的存储编码。列的比较规则比collation_connection高。也就是说,MySQL会把SQL中的文字直接量转成列的字符集后再与列的文字数据比较。

字符集的依附关系

image



2.7 MySQL数据类型

2.7.1 常量与变量

1、常量

常量也称为文字值或标量值,是指某个过程中值始终不改的量。MySQL的常量类型和用法。

image

2、系统变量

变量就是在某个过程中,其值是可以改变的量。系统变量包括全局系统变量和会话系统变量两种类型。全局变量和会话变量的区别:

全局变量 在MySQL启动时由服务器自动将它们初始化为默认值,主要影响整个mysql实例的全局设置,大部分全局变量都是作为mysql的服务器调节参数存在。对全局变量的修改会影响到整个服务器。

会话变量 在每次建立一个新的连接时,由MySQL来初始化。会话变量的定义是前面加一个@符号,随时定义和使用,会话结束就释放。即对会话变量的修改,只会影响到当前的会话,也就是当前的数据库连接。

大多数的系统变量应用于其他SQL语句时,必须在名称前加两个@符号。例如:

select @@version,current_date;

显示系统变量清单的格式。

show [global|session] variables [like ‘字符串’];

【实例】查看字符“a”开头的系统变量命令如下:

show variables like ‘a%’;

修改系统变量的值。

在MySQL中,有的系统变量的值是不能改变的,如@@version和系统日期,而有些系统变量是可以通过set语句来修改的,例如将全局系统变量sort_buffer_size的值改为25000。

set @@global.sort_buffer_size=25000;

对于当前会话,把系统变量sql_select_limit的值设置为100

set @@session.sql_select_limit=100;

执行如下命令可以显示。

select  @@local.sql_select_limit;
//set @@local.sql_select_limit=default;

2.7.2 数据类型

数据类型是数据的一种属性,其可以决定数据的存储格式、有效范围和相应的值范围限制。

MySQL的数据类型包括字符串类型、整数类型、浮点数类型、定点数类型、日期和时间类型和二进制数据类型。

在MySQL中创建表时,需要考虑为字段选择哪种数据类型是最合适的。选择了合适的数据类型,会提高数据库的效率。

1、字符串类型

字符串类型是在数据库中存储字符串的数据类型。

字符串类型包括char、varchar、blob、text、enum和set。字符串类型可以分为2类:普通的文本字符串类型(char和varchar)和特殊类型(set和enum)。它们之间都有一定的区别,取值的范围不同,应用的地方也不同。

(1)普通的文本字符串类型,即char和varchar类型,char列的长度被固定为创建表所声明的长度,取值在1~255之间;varchar列的值是变长的字符串,取值和char一样。下面介绍普通的文本字符串类型如表2-2所示。

类型 取值范围 说明
[national] char(m) [binary|ASCII|unicode] 0~255个字符 固定长度为m的字符串,其中m的取值范围为0~255。National关键字指定了应该使用的默认字符集。Binary关键字指定了数据是否区分大小写(默认是区分大小写的)。ASCII关键字指定了在改列中使用latin1字符集。Unicode关键字指定了使用UCS字符集
char 0~255个字符 Char(m)类似
[national] varchar(m) [binary] 0~255个字符 长度可变,其他和char(m)类似

(2)特殊类型set和enum 。特殊类型set和enum的介绍如表2-3所示。

类型 最大值 说明
Enum (“value1”, “value2”, …) 65 535 该类型的列只可以容纳所列值之一或为null
Set (“value1”, “value2”, …) 64 该类型的列可以容纳一组值或为null
说明:在创建表时,使用字符串类型时应遵循以下原则:
(1)从速度方面考虑,要选择固定的列,可以使用char类型。
(2)要节省空间,使用动态的列,可以使用varchar类型。
(3)要将列中的内容限制在一种选择,可以使用enum类型。
(4)允许在一个列中有多于一个的条目,可以使用set类型。
(5)如果要搜索的内容不区分大小写,可以使用text类型。

2、数字类型

数字类型总体可以分成整型和浮点型两类。

整数类型

整数类型是数据库中最基本的数据类型。标准SQL中支持integer和smallint这两类整数类型。这些类型包括准确数字的数据类型(numeric、decimal、integer和smallint),还包括近似数字的数据类型(float、real和double precision)。其中的关键词int是integer的同义词。

数据类型 取值范围 说明 单位
tinyint 符号值:-127 ~ 127
无符号值:0 ~ 255
最小的整数 1字节
bit 符号值:-127 ~ 127
无符号值:0 ~ 255
最小的整数 1字节
bool 符号值:-127 ~ 127
无符号值:0 ~255
最小的整数 1字节
smallint 符号值:- 32768 ~ 32767
无符号值:0 ~ 65535
小型整数 2字节
mediumint 符号值:-8388608 ~ 8388607
无符号值:0 ~ 16777215
中型整数 3字节
int 符号值:-2147683648 ~ 2147683647
无符号值:0 ~ 4294967295
标准整数 4字节
bigint 符号值:-9223372036854775808 ~ 9223372036854775807
无符号值:0 ~ 18446744073709551615
大整数 8字节

浮点数据类型

MySQL中使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(float型)和双精度浮点数(double型)。定点数类型就是decimal型,关键词dec是decimal的同义词。

数据类型 取值范围 说明 单位
float +(-)3.402823466E+38 单精度浮点数 8或4字节
double +(-)1.7976931348623157E+308
+(-)2.2250738585072014E-308
双精度浮点数 8字节
decimal 可变 一般整数 自定义长度
说明:在创建表时,使用哪种数字类型,应遵循以下原则。
(1)选择最小的可用类型,如果值永远不超过127,则使用tinyint比int强。
(2)对于完全都是数字的,可以选择整数类型。
(3)浮点类型用于可能具有小数部分的数。例如货物单价、网上购物交付金额等。 

3、日期和时间数据类型

日期与时间类型是为了方便在数据库中存储日期和时间而设计的。

MySQL中有多种表示日期和时间的数据类型。其中,year类型表示年份;date类型表示日期;time类型表示时间;datetime和timestamp表示日期和时间。其中的每种类型都有其取值的范围,如赋予它一个不合法的值,将会被“0”代替。下面介绍日期和时间数据类型。

类型 取值范围 说明
date 1000-01-01 日期,格式YYYY-MM-DD
time -838:58:59
835:59:59
时间,格式HH:MM:SS
datetime 1000-01-01 00:00:00
9999-12-31 23:59:59
日期和时间,格式YYYY-MM-DD HH:MM:SS
timestamp 1970-01-01 00:00:00
2037年的某个时间
时间标签,在处理报告时使用显示格式取决于M的值
year 1901-2155 年份可指定两位数字和四位数字的格式

4、二进制类型

二进制类型是在数据库中存储二进制数据的数据类型。二进制类型包括binary、varbinary、bit、tinyblob、blob、mediumblob和longblob类型。tinytext、longtext和text等适合存储长文本的类型,也放在这里介绍。

其中,text和blob类型。它们的大小可以改变,text类型适合存储长文本,而blob类型适合存储二进制数据,支持任何数据,例如文本、声音和图像等。下面介绍text和blob类型,如表2-7所示。

类型 最大长度(字节数) 说明
tinyblob 2^8~1(225) 小blob字段
tinytext 2^8~1(225) 小text字段
blob 2^16~1(65 535) 常规blob字段
text 2^16~1(65 535) 常规text字段
mediumblob 2^24~1(16 777 215) 中型blob字段
mediumtext 2^24~1(16 777 215) 中型text字段
longblob 2^32~1(4 294 967 295) 长blob字段
longtext 2^32~1(4 294 967 295) 长text字段


2.8 MySQL运算符和表达式

运算符是用来连接表达式中各个操作数的符号,其作用是指明对操作数所进行的运算。
MySQL数据库通过使用运算符,不但可以使数据库的功能更加强大,而且可以更加灵活的使用表中的数据。
MySQL运算符包括4类,分别是算术运算符、比较运算符、逻辑运算符和位运算符。
需要说明的是:MySQL中的select语句具有输出功能,能够显示函数和表达式的值。

1、算术运算符

算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括:加、减、乘、除、求余。下面列出算术运算符的符号和作用,如表2-8所示。

符号 作用
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 求余运算
div 除法运算,返回商。同“/”
mod 求余运算,返回余数。同“%”
说明:
加(+)、减(-)和乘(*)可以同时运算多个操作数。除号(/)和求余运算符(%)也可以同时计算多个操作数,但是这 两个符号计算多个操作数不太好。

div()和mod()这两个运算符只有两个参数。进行除法和求余的运算时,除以零的除法是不允许的,MySQL会返回null。

【实例】使用算术运算符进行加、减、乘、除、求余等运算。

mysql> select 3+2,1.5*3,3/5,100-23.5,5%3;
+-----+-------+--------+-------------+------+
| 3+2 | 1.5*3 | 3/5     | 100-23.5 | 5%3  |
+-----+-------+--------+----------+-----------+
|   5  |   4.5 | 0.6000  |     76.5  |      2  |
+-----+-------+--------+----------+--------+
1 row in set (0.01 sec)

2、比较运算符

比较运算符是查询数据时最常用的一类运算符。

select语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较运算符的符号、名称和应用示例。

运算符 作用 示例
= 等于 Id=5
> 大于 Id>5
< 小于 Id<5
=> 大于等于 Id=>5
<= 小于等于 Id<=5
!=或<> 不等于 Id!=5
Is null Idis null
运算符 作用 示 例
Is not null 非空 Id is not null
Between 区间比较 Id between1 and 15
In 属于 Id in (3,4,5)
Not in 不属于 Name not in (shi,li)
Like 模式匹配 Name like (‘shi%’)
Not like 模式匹配 Name not like (‘shi%’)
Regexp 常规表达式 Name正则表达式

下面对几种较常用的比较运算符进行详解。

运算符“=”。如果相等,返回1,否则返回0。 
运算符“<>”和“!=”.“<>”和“!=”用来判断数字、字符串、表达式等是否不相等。如果不相等,则返回1;否则,返回0。
运算符“>”。如果大于,返回1;否则,返回0。同样空值(null)不能使用“>”来判断。
<”运算符、“<=”运算符和“>=”运算符都与“>”运算符使用方法基本相同,这里不再赘述。

【实例】使用比较运算符进行判断运算。

mysql> select 'A'>'B',1+1=2, 'X'<'x', 7<>7, 'a'<= 'a';
+---------+-------+---------+------+-----------+
| 'A'>'B' | 1+1=2 | 'X'<'x' | 7<>7 | 'a'<= 'a' |
+---------+-------+---------+------+-----------+
|      0   |       1 |        0 |     0 |           1 |
+---------+-------+---------+------+-----------+
1 row in set (0.02 sec)

运算符“is null”。“is null”用来判断操作数是否为空值(null)。操作数为null时,结果返回1;否则,返回0。is not null刚好与is null相反。

【实例】 运用is null、is not null运算符的用法。

mysql> select  null is not  null,17.3 is null, 11.7 is not null;
+-------------------+--------------+------------------+
| NULL IS NOT  NULL | 17.3 IS NULL | 11.7 IS NOT NULL |
+-------------------+--------------+------------------+
|                0     |            0    |                1     |
+-------------------+--------------+------------------+
1 row in set (0.00 sec)

运算符“between and”。“between and”用于判断数据是否在某个取值范围内。也可以添加not运算符对一个between运算进行取反。其表达式如下:

x1 between m and n 

如果x1大于等于m,且小于等于n,结果将返回1,否则将返回0。

【实例】运用“between and”运算符判断一个数是否在某 个范围。

mysql> select 11.7  not between 0 and 10, 51  between 0 and 70;
+-----------------------------+----------------------+
| 11.7  NOT  between 0 AND 10 | 51  between 0 AND 70 |
+-----------------------------+----------------------+
|                           1       |                    1     |
+-----------------------------+----------------------+
1 row in set (0.00 sec)

运算符“in”。“in”用于判断数据是否存在于某个集合中。其表达式如下:

x1 in(值1,值2,…,值n)

如果x1等于值1到值n中的任何一个值,结果将返回1。如果不是,结果将返回0。

【实例】 运用“in”运算符判断某值是否在指定的范围内

mysql> select 7 in(1,2,5,6,7,8,9), 3 not  in (1,10);
+---------------------+-----------------+
| 7 IN(1,2,5,6,7,8,9) | 3 NOT IN (1,10) |
+---------------------+-----------------+
|                   1     |               1    |
+---------------------+-----------------+
1 row in set (0.00 sec)

运算符“like”。“like”用来匹配字符串。其中,“%”匹配任意个字符,“_”匹配一个字符。其表达式如下:

x1 like s1 

如果x1与字符串s1匹配,结果将返回1。否则返回0。

【实例】使用like运算符,判断某字符串是否与指定的字符串匹配。

mysql> select  'MySQL' like 'MY%', 'APPLE'  like  'A_';
+--------------------+-------------------------------+
| 'MySQL' like 'MY%' | 'APPLE'  like  'A_'  |
+--------------------+-------------------------------+
|                   1     |                            0        |
+--------------------+-------------------------------+
1 row in set (0.00 sec) 

运算符regexp。

regexp同样用于匹配字符串,但其使用的是正则表达式进行匹配。使用regexp运算符匹配字符串,其使用方法非常简单。regexp运算符经常与“”、“$”和“.”一起使用。“”用来匹配字符串的开始部分;“$”用来匹配字符串的结尾部分;“.”用来代表字符串中的一个字符。其表达式格式如下:

x1 regexp '匹配方式' 

如果x1满足匹配方式,结果将返回1;否则将返回0。

regexp运算符一般用来与表中的字段值匹配,判定该值是否以指定字符开头、中间的一个字符或结尾,同时判定是否包含指定的字符串。在以后的相关章节中介绍实例。

3、逻辑运算符

逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回1。如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符。

MySQL中支持4种逻辑运算符,分别是与、或、非和异或。下面是4种逻辑运算符的符号及作用。

逻辑运算符 作用
&& 或 and
|| 或 or
! 或 not
xor 异或

与运算

“&&”或者“and”是与运算的两种表达方式。如果所有数据不为0且不为空值(null)时,结果返回1;如果存在任何一个数据为0时,结果返回0;如果存在一个数据为null且没有数据为0时,结果返回null。与运算符支持多个数据同时进行运算。

或运算

“||”或者“or”表示或运算。所有数据中存在任何一个数据不为非0的数字时,结果返回1;如果数据中不包含非0的数字,但包含null时,结果返回null;如果操作数中只有0时,结果返回0。或运算符“||”也可以同时操作多个数据。

非运算

“!”或者not表示非运算。通过非运算,将返回与操作数据相反的结果。如果操作数据是非0的数字,结果返回0;如果操作数据是0,结果返回1;如果操作数据是null,结果返回null。

【实例】 逻辑运算符and、or、not示例。

mysql>select not('A'='B'),('c' ='C')and('c'<'D')or(1=2);
+--------------+----------------------------------+
| NOT('A'='B') | ('c' ='C') AND ('c'<'D') OR(1=2) |
+--------------+----------------------------------+
|          1   |                         1        |
+--------------+----------------------------------+
1 row in set (0.00 sec)

异或运算

xor表示异或运算。只要其中任何一个操作数据为null时,结果返回null;如果

【实例】 逻辑运算符&&、xor示例。

mysql> select ('c'='C') && (1=2),('A'='a')xor(1+1=3);
+--------------------+---------------------+
| ('c'='C') && (1=2) | ('A'='a')XOR(1+1=3) | 
+--------------------+---------------------+
|                  0     |                   1     |
+--------------------+---------------------+
1 row in set (0.02 sec)

4、位运算符

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

MySQL中支持6种位运算符。分别是:按位与、按位或、按位取反、按位异或、按位左移和按位右移。6种位运算符的符号及作用如表2-11所示。

符号 作用
& 按位与。进行该运算时,数据库系统会先将十进制的数转换为二进制的数。然后对应操作数的每个二进制位上进行与运算。1和1相与得1,与0相与得0。运算完成后再将二进制数变回十进制数
| 按位或。将操作数化为二进制数后,每位都进行或运算。1和任何数进行或运算的结果都是1,0与0或运算结果为0
~ 按位取反。将操作数化为二进制数后,每位都进行取反运算。1取反后变成0,0取反后变成1
^ 按位异或。将操作数化为二进制数后,每位都进行异或运算。相同的数异或之后结果是0,不同的数异或之后结果为1
<< 按位左移。“m<<n”表示m的二进制数向左移n位,右边补上n个0。例如,二进制数001左移1位后将变成0010
>> 按位右移。“m>>n”表示m的二进制数向右移n位,左边补上n个0。例如,二进制数011右移1位后变成001,最后一个1直接被移出

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,然后进行位运算。再将计算结果从二进制数变回十进制数。

【实例】 位运算符示例。

mysql> select 3&2,2|3,100>>5, ~1,6^4;
+-----+-----+--------+----------------------+-----+
| 3&2 | 2|3 | 100>>5 | ~1                       | 6^4 |
+-----+-----+--------+----------------------+-----+
|   2  |   3 |      3   | 18446744073709551614 |   2  |
+-----+-----+--------+----------------------+-----+
1 row in set (0.00 sec)

5、表达式和运算符的优先级

表达式

在SQL语言中,表达式就是常量、变量、列名、复杂计算、运算符和函数的组合。一个表达式通常都有返回值。与常量和变量一样,表达式的值也具有某种数据类型。根据表达式的值的类型,表达式可分为字符型表达式、数值型表达式和日期型表达式。

运算符的优先级

当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。在一个表达式中按先高(优先级数字小)后低(优先级数字大)的顺序进行运算。运算符优先级如表2-12所示。按照从高到低,从左到右的级别进行运算操作。如果优先级相同,则表达式左边的运算符先运算。

优先级 运算符
1 !
2 ~
3 ^
4 *,/,div,%,mod
5 +,-
6 >>,<<
7 &
8 |
9 =,<=>,<,<=,>,>=,!=,<>,in,is,null,like,regexp
10 between and,case,when,then,else
11 not
12 &&,and
13
14 := (赋值号)


2.9 MySQL常用函数

MySQL数据库中提供了很丰富的函数。这些内部函数可以帮助用户更加方便地处理表中的数据。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数和格式化函数等。

select语句及其条件表达式都可以使用这些函数。同时,insert 、update和delete语句及其条件表达式也可以使用这些函数。

1、数学函数

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

函 数 功能描述
abs 返回表达式的绝对值
acos 反余弦函数,返回以弧度表示的角度值
asin 反正弦函数, 返回以弧度表示的角度值
atan 反正切函数, 返回以弧度表示的角度值
celling 返回大于或等于指定数值表达式的最小整数
cos 返回以以弧度为单位的角度的余弦值
degree 弧度值转换为角度值
exp 返回给定表达式为指数的e值
floor 返回小于或等于指定数值表达式的最大整数
greatest 获得一组数中的最大值
Least 获得一组数中的最小值
log 返回给定表达式的自然对数
log10 返回给定表达式的以10 为底的对数
PI 常量,圆周率
pow 返回给定表达式的指定次方的值
radians 角度值转换为弧度值
rand 返回0~1之间的随机float数
round 返回指定小数的位数的表达式的值
sign 返回某个数的符号
sin 返回以以弧度为单位的角度的正弦值
sqrt 返回给定表达式的平方根
tan 返回以以弧度为单位的角度的正切值

【实例】 floor()、celling()和log(5)函数示例。

mysql>select floor(3.67),celling(4.71), log(5);
+-------------+---------------+--------------------+
| floor(3.67) | celling(4.71) |     log(5)            |
+-------------+---------------+--------------------+
|             3 |                5 | 1.6094379124341003 |
+-------------+---------------+--------------------+
1 row in set (0.05 sec)

【实例】 利用取随机数rand()和四舍五入round()输出6090和2565之间的任意整数。

mysql>select  60+ round(30*rand(),0) , 25+ round(40*rand(),0); 
+------------------------+------------------------+
| 60+ round(30*rand(),0) | 25+ round(40*rand(),0) |
+------------------------+------------------------+
|                     76     |                     39      |
+------------------------+------------------------+
1 row in set (0.00 sec)

(1)rand()返回的数是完全随机的,而rand(x)函数的x相同时,它被用作种子值,返回的值是相同的。

(2)四舍五入round(x)返回离x最近的整数,也就是对x进行四舍五入处理。round(x,y)返回x保留到小数点后y位的值,在截取时进行四舍五入处理。

2、字符串函数

字符串函数主要用于处理字符串数据和表达式,MySQL中的字符串函数包括计算字符串长度函数、合并函数、替换函数、比较函数和查找字符串位置函数等。

函数名称 功能描述
char_length 返回字符串中字符的个数。
concat 返回连接参数产生的字符串
left 返回从字符串左边开始指定个数的字符
length 返回给定字符串字节长度
lower 将大写字符数据转换为小写字符数据后返回字符表达式
ltrim 删除起始空格后返回字符表达式
replace 用第3个表达式替换第一个字符串表达式中,出现的所有第2个给定字符串表达式
repeat 以指定的次数重复字符表达式
reverse 返回字符表达式的反转
right 返回从字符串右边开始指定个数的字符
rtrim 截断所有尾随空格后返回一个字符串
space 返回由重复的空格组成的字符串。
substring 求子串函数
upper 返回将小写字符数据转换为大写的字符表达式

【实例】 利用concat()函数连接字符串。

mysql> select concat('MY',' SQL','5.7'),concat('ABC',null,'DEF');
+---------------------------+---------------------------+
| concat('MY',' SQL','5.7') | concat('ABC', null,'DEF') |
+---------------------------+---------------------------+
| MYSQL5.7                  | null                      |
+---------------------------+---------------------------+
1 row in set (0.04 sec)
说明:concat()函数返回来自于参数连接的字符串。
如果任何参数是null,返回null。
可以有超过2个的参数。数字参数会被变换为等价的字符串形式。

【实例】 利用substring()函数返回指定字符串,并利用reverse()逆序输出。

mysql> select substring('ABCDEFGH',2,6),
    -> reverse(substring('ABCDEFGH',2,6));
+---------------------------+-----------------------------------+
| substring('ABCDEFGH',2,6) | reverse(substring('ABCDEFGH',2,6))|
+---------------------------+-----------------------------------+
| BCDEFG                   | GFEDCB                           |
+---------------------------+-----------------------------------+
1 row in set (0.00 sec)

3、日期和时间函数

日期和时间函数主要用于处理表中的日期和时间数据。

日期和时间函数包括获取当前日期的函数、获取当前时间的函数、计算日期的函数和计算时间的函数等。

函数名 功能描述
curdate 获取当前系统的日期
curtime 获取当前系统的时间
date_add 可以对日期和时间进行加法运算
date_sub 可以对日期和时间进行减法运算
datediff 计算两个日期相隔的天数
date_format 用来格式化日期值
day 获取指定日期的日期整数
dayname 以英文名方式显示,返回指定日期是星期几,如Tuesday等
dayofmonth 返回指定日期在一个月中的序数
dayofweek 返回指定日期在一个星期中的序数
dayofyear 返回指定日期在一年中的序数
hour 返回指定时间的小时数
minute 返回指定时间的分钟数
month 获取指定日期的月份整数
now/sysdayte 返回当前日期和时间
quarter 获取指定日期的季度整数
second 返回指定时间的秒钟数
time_format 用来格式化时间值
UTC_DATE 用来输出世界标准时间的日期
UTC_TIME 用来输出世界标准时间
year 获取指定日期的年份整数

常用日期时间函数举例

【实例】 利用curdate()和curtime()函数返回当前日期和时间。

mysql>select curdate(),curtime();

【实例】返回指定日期在一年、一星期及一个月中的序数

 mysql>select dayofyear(20170512),dayofmonth('2017-05-12'),
      >dayofweek(now());

date_add()和date_sub()函数可以对日期和时间进行算术操作,它们分别用来增加和减少日期值。date_add()和date_sub()函数的语法格式为:

date_add | date_sub(date, interval int keyword)

Date表示日期和时间,interval关键字表示一个时间间隔。

关键字 间隔值的格式
day 日期
day_hour 日期∶小时
day_minute 日期∶小时∶分钟
day_second 日期∶小时∶分钟∶秒
hour 小时
hour_minute 小时∶分钟
hour_ second 小时∶分钟∶秒
minute 分钟
minute_ second 分钟∶秒
month
second
year
year_month 年-月

【实例】计算指定时间的45分钟前是什么时间。

mysql>select date_sub(‘2017-10-1 10:10:10’, interval 45 minute);

【实例】7月15日放假,现在离放假还有多少天。

mysql>select datediff(‘2017-7-15’,now());

日期和时间格式化的函数。

date_format()和time_format()函数可以用来格式化日期和时间值。语法格式如下。

date_format/ time_format(date | time, fmt)

其中,date和time是需要格式化的日期和时间值,fmt是日期和时间值格式化的形式, 表2-17列出了MySQL中的日期/时间格式化代码。

关键字 间隔值的格式
%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位

【实例】按照指定格式码输出日期。

mysql> select date_format(now(),'%W,%d,%m, %Y , %r, %p');
+--------------------------------------------+
| date_format(now(),'%W,%d,%m, %Y , %r, %p') |
+--------------------------------------------+
| Monday,24,04, 2017 , 08:53:25 AM, AM        |
+--------------------------------------------+
1 row in set (0.03 sec)

4、聚合函数

聚合函数也叫作分组统计函数。这些函数的主要功能如表2-18所示。常用语对聚合在组内的数据表行进行计算。

函数 功 能 描 述
avg 返回组中数据的平均值,忽略null值
count 返回组中项目的数量
max 返回多个数据比较的最大值, 忽略null值
min 返回多个数据比较的最小值, 忽略null值
sum 返回组中数据的和, 忽略null值

5、其他函数

系统信息函数

系统信息函数用来查询MySQL数据库的系统信息。例如,查询数据库的版本,查询数据库的当前用户等。

函 数 功 能
database() 返回当前数据库名
benchmark(n,expr) 将表达式expr重复运行n次
charset(str) 返回字符串str的字符集
Connection_id() 返回当前客户连接服务器的次数
found_rows() 将最后一个MySQL>select查询(没有以limit语句进行限制)返回的记录行数返回
get_lock(str,dur) 获得一个由字符串str命名的并且有dur秒延时的锁定
Is_free_lock(str) 检查以str命名的锁定是否释放
Last_insert_id() 返回由系统自动产生的最后一个autoincrement id的值
Master_pos_wait(log,pos,dur) 锁定主服务器dur秒直到从服务器与主服务器的日志log指定的位置pos同步
Release_lock(str) 释放由字符串str命名的锁定
user()或system_user() 返回当前登录用户名
version() 返回MySQL服务器的版本

【实例】返回MySQL服务器的版本、当前数据库名和当前用户名信息,并查看当前用户连接MySQL服务器的次数。

mysql> select  version(),database(),user(),connection_id();

加密函数

password(str)函数可以对字符串str进行加密。一般情况下,password(str)函数主要是用来给用户的密码加密的。

【实例】使用password(str)函数对字符串“student1357”加密。

mysql> select password('student1357');
+-------------------------------------------+
| password(' student1357')                  |
+-------------------------------------------+
| *839D903605F413D56D2A0635F7A10D019E48785E |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

例如,可以修改学生Li Ping的密码为student1357,并加密密码:

mysql>set password FOR 'Li Ping'@'localhost' = password('student1357'); 

格式化函数

format()函数把数值格式化为以逗号分隔的数字序列。format()的第一个参数x是被格式化的数据,第二个参数y是结果的小数位数。

format()函数语法格式为:

format(x, y) 

【实例】利用格式函数format()码处理数据。

mysql> select format(2/3,2), format(123456.78,0);

用户根据工作需要,可以创建用户定义函数,还可以利用流程控制语句编写较为实用的程序,以提高程序开发和运行的质量。

posted @ 2023-10-02 21:12  WNAG_zw  阅读(137)  评论(0编辑  收藏  举报