MySQL编程语言

MySQL编程语言

MySQL服务器正确安装完毕之后, 就在机器系统上搭建好了一个完整的DBMS, 此时数据库的使用者就可以通过命令行或者GUI界面等多种客户端实用工具,来建立与MySQL数据库服务器的连接,从而实施各种数据库相关的操作。然而,不论使用哪种方式的客户端工具,其与MySQL数据库服务器交互的实质,都是通过结构化查询语言(Structured Query Language, SQL)来实现的,所以SQL是各类数据库交互方式的基础。因而本书主要采用命令行纯文本的方式重点介绍MySQL数据库交互过程中常用的SQL语句的语法及使用。

结构化查询语言SQL

与其他程序语言不同,SQL由很少的词构成,这些词被称为关键字,每一个SQL语句都由一个或多个关键字关键字组成。设计SQL的目的就是要能够很好的提供一种从数据库读写数据的简单而有效的方法。SQL具有如下优点:

  1. SQL不是某个特定数据库供应商专有的语言,所有的关系型数据库都支持SQL;
  2. SQL简单易学。它的全部语句都是由描述性很强的英语单词组成,而这些英语单词的数目并不多。
  3. SQL尽管看上去非常简单,但是它实际上是一种强有力的语言,灵活使用其他语言元素可以进行非常复杂和高级的数据库操作。

当前,尽管许多DBMS供应商都通过增加语句或指令的方式,对SQL进行了各自的扩展,但它们都遵循标准SQL,即ANSI SQL,并以标准SQL为主体,MySQL也不例外。它们的这种扩展的主要目的是提供执行特定操作的额外功能或简化方法。因此,读者对于MySQL数据库交互操作的学习,应以SQL为基础。

另外需要指出的是,SQL语句不区分大小写。许多SQL开发人员习惯对于所有的SQL关键字使用大写,而对所有的列和表的名称使用小写,这样的书写方式可以使代码更易于阅读和调试。(因为我是中国人,使用大写非常麻烦,大写切换需要先切换到英语再切换到英语大写,另外自己对大写的英语单词不敏感,所以我决定先使用小写,日后熟练了再改用大写。)

MySQL语言的组成

MySQL数据库所支持的SQL语言主要包含以下几个部分:

  1. 数据定义语言(DDL):数据定义语言主要用于对数据库及数据库中的各种对象进行创建、删除、修改等操作。其中,数据库对象主要有表、默认约束、规则、视图、触发器、存储过程等。数据定义语言包括的主要SQL语句有以下三个:

    • create:用于创建数据库或数据库对象;
    • alter:用于对数据库或数据库对象进行修改;
    • drop:用于删除数据库或数据库对象。
      对于不同的数据库对象,这三个SQL语句分别说使用的语言格式是不同的。
  2. 数据库操纵语言(DML):数据库操纵语言主要用于操纵数据库中的各种对象,特别是检索和修改数据。数据库操纵语言包括的主要SQL语句如下:

    • select:用于从表或视图中检索数据,是使用最为频繁的SQL语句之一;
    • insert:用于将数据插入到表和或视图中;
    • update:用于修改表或视图中的数据,其即可修改表或视图中的一行数据,也可以修改多行或全部数据;
    • delete:用于从表或视图中删除数据,其中可以根据条件删除指定的数据。
  3. 数据控制语言(DCL):数据控制语言主要用于安全管理,例如确定哪些用户可以查看或修改数据库中的数据。数据控制语言包括的主要SQL语句如下;

    • grant:用于授予权限,可把语句许可或对象许可的权限授予其他用户和角色;
    • revoke:用于收回权限,其功能与grant相反,但不影响该用户或角色从其他角色中作为成员继承的许可权限。
  4. MySQL扩展增加的语言要素
    这部分不是标准的SQL所包含的内容,而是为了用户编程的方便所增加的语言要素。这些语句包括常量、变量、运算符、表达式、函数、流程控制语句等。

    • 常量:
      • 字符串常量:是指用单引号或双引号括起来的字符序列,分为ASCII字符串变量和Unicode字符串变量。
      • 数值常量:可分为整数常量和浮点数常量。
      • 十六进制常量:一个十六进制值通常指定为一个字符串常量,每对十六进制数字被转换为一个字符,其最前面有一个大写字母“X”或小写字母“x”。
      • 日期时间常量:是用单引号将表示日期时间的字符串括起来而构成的。
      • 位字段值:可以用b'value'格式的符号书写字段值。其中,value是用0或1书写的二进制值。位字段符号可以方便地指定分配给BIT列的值。
      • 布尔值:只包含两个可能的值,TRUE和FALSE。其中FALSE的数字值为0,TRUE的数字值为1。
      • NULL值:通常用于表示“没有值”“无数据”等含义,它与数值类型的0或字符串类型的空字符是完全不同的。
    • 变量:
      在MySQL中,变量分为用户变量和系统变量。在使用时,用户变量前常添加一个符号@,用于将其与列名区分开;而大多数系统变量应用于其他SQL语句中,必须在系统变量名称前添加两个@符号。
    • 运算符:
      • 算术运算符:
        + - * / %
      • 位运算符:
        &` | ^(位异或)` `~ >>(位右移)<<(位左移)`;
      • 比较运算符:
        = > < >= <= <>(不等于) != <=>(相等或等于空)
      • 逻辑运算符:NOT !! AND && OR || XOR(逻辑异或)
    • 表达式:
      • 表达式是常量、变量、列名、复杂计算、运算符和函数的组合。一个表达式通常可以得到一个值。与常量、变量一样,表达式的值也具有某种数据类型。
    • 内置函数:
    • MySQL中包含了100多个函数,大致可以分为这样几类:
      • 数学函数:abs()、sort();
      • 聚合函数:count();
      • 字符串函数:ascii()、char();
      • 日期和时间函数:now()、year();
      • 加密函数:encode()、encrypt();
      • 控制流程函数:if()、ifnull();
      • 格式化函数:format();
      • 类型转换函数:cast();
      • 系统信息函数:user()、version();

MySQL函数

聚合函数

count()

count()函数,对于除*以外的任何参数,返回所选择集合中非null值的行的数目;对于参数*,则返回所选择集合中所有行的数目,包含null值的行。没有where子句的count(*)是经过内部优化的,能够快速地返回表中所有的记录总数。

1
2
3
# count()函数
use 交易数据;
select count(*) from 000001大单交易数据;

上面的语句会返回这个表格的行数(记录数)。

sum()

sum()函数可以用来统计某一字段的列和。

1
2
# sum()函数
select sum(volume) from `000001大单交易数据`;

avg()

平均值。

1
2
# avg()函数
select avg(volume) from `000001大单交易数据`;

max()

最大值。

1
2
# max()
select max(volume) from `000001大单交易数据`;

数学函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 绝对值函数:abs()
select abs(5), abs(-5)
-- 5,5
# 下整函数:floor()
select floor(1.5), floor(-1.5);
-- 1, 2
# 上整函数:ceil()
select ceil(1.5), ceil(-1.5);
-- 2,-1
# 0~1之间的随机数:rand()
select rand();
-- 0.7719657540060261
# 保留指定位数的小数:truncate(x, y)
select truncate(3.1415926, 2);
-- 3.14
# 平方根函数:sqrt()
select sqrt(5);
-- 2.23606797749979
select truncate(sqrt(5), 2);
-- 2.23

字符串函数

1
2
3
4
5
6
7
8
9
# 大写函数:upper()/ucase()
select upper('hello'), ucase('hello');
-- HELLO,HELLO
# 子字符串函数(取前n个):left(s, n)
select left('hello', 2);
-- 'he'
# 子字符串函数(从第n个位置取len个):substring(s, n, len)
select substring('hello', 2, 2)
-- 'el'

日期函数

1
2
3
4
5
6
7
8
9
10
11
12
# 获取当前日期:curdate()/current_date()
select curdate(), current_date;
-- 2018-08-18, 2018-08-18
# 获取当前时间: curtime()/current_time()
select curtime(), current_time();
-- 15:15:08, 15:15:08
# 获取当前日期和时间:now()
select now();
-- 2018-08-18 15:16:15
# 获取当前日期和时间的一些函数
select now(), current_timestamp(), localtime(), sysdate(), localtimestamp();
--2018-08-18 15:18:30 2018-08-18 15:18:30 2018-08-18 15:18:30 2018-08-18 15:18:30 2018-08-18 15:18:30

其它函数

if(expr, v1, v2)

表达式成立执行v1,反之执行v2。

1
2
3
4
5
6
7
8
# 查询表`全部个股当日数据`,如果trade字段的值大于100,这输出字段level为‘优秀’,反之为‘一般’:
use 交易数据;
select code, name, if(trade > 100, '优秀', '一般') level from 全部个股当日数据;
-- code name level
-- 603999 读者传媒 一般
-- 603998 方盛制药 一般
-- 603997 继峰股份 一般
-- ······

ifnull(v1, v2)

表示如果表达式v1不为空则显示v1的值,否则显示v2的值。

1
2
select ifnull(1/0, '空');
-- '空'

version()函数

version函数是一种系统信息函数,用于获取数据库的版本号:

1
2
select version();
-- 8.0.11

# MySQL

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了607.9k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×