SQL语言的进阶整理【3】

1、语言结构

文字值
1.1 字符串、数值型、日期、16进制、布尔值、位域、NULL值

字符串:

字符串指用单引号(‘'’)或双引号(‘"’)引用起来的字符序列。

转义字符 

SQL语言的进阶整理【3】

数值型: 

整数用一系列阿拉伯数字表示,浮点数使用.作为十进制间隔符,以上两种类型的数值均可以在前面加一个-来表示负值。

日期类型:

  • 作为字母'YYYY-MM-DD'或 'YY-MM-DD'格式的字符串。
  • 作为字母'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的字符串。
  • 作为字符串中没有分隔符 'YYYYMMDD''YYMMDD' 格式的字符串,前提是该字符串作为日期有意义。
  • 作为字符串中没有分隔符 'YYYYMMDDHHMMSS'或 'YYMMDDHHMMSS'格式的字符串,前提是该字符串作为日期有意义。
  • 作为数字YYYYMMDD或 YYMMDD格式的数字,只要该数字作为日期有意义。
  • 作为数字YYYYMMDDHHMMSS或 YYMMDDHHMMSS格式的数字,只要该数字作为日期有意义。

日期类型

16进制:

  • 十六进制值的默认类型是字符串。如果想要确保该值能作为数字处理,可以使用CAST(...AS UNSIGNED)
  • HEX()函数将一个字符串或数字转换为十六进制格式的字符串
SELECT 0x41,CAST(0x41 AS UNSIGNED);
'A',65
-------------------------------------------
SELECT HEX('cat');
'636174'
SELECT 0x636174;
'cat'

布尔值:常量TRUE等于1,常量FALSE等于0。

位域:可以使用b'value'符号表达位域型。

NULL值:NULL值表示“没有数据”。

# 位域
CREATE TABLE t (b BIT(8));
INSERT INTO t SET b = b'11111111';
INSERT INTO t SET b = b'1010';

1.2 标识符

数据库、表、索引、列和别名是识别符。

  • 数据库,表,列不允许包括/ 、\、。等字符;
  • 数据库、表和列名不应以空格结尾。在识别符中可以使用引号识别符,但是应尽可能避免这样使用。

SQL语言的进阶整理【3】

标识符限定符:

MySQL允许使用由单个识别符或多个识别符组成的名字。多部分名各组件之间应以句点(‘.’)间隔开。多部分名的开头部分作为限定词,后面的识别符才具有对该名字的解释意义。

多部分名的组件需要被引用,应分别将它们引起来而不要将整个名字引起来。

SQL语言的进阶整理【3】

识别符大小写:

操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。

表和数据库名称如何存储在磁盘上并在MySQL中使用受lower_case_table_names系统变量的影响,在Unix上,默认值为 lower_case_table_names=0.在Windows上,默认值为1.在macOS上,默认值为2。

SQL语言的进阶整理【3】

避免由于数据库或表名的大小写造成的数据转移问题:

  • 在任何系统中设置lower_case_tables_name=1。使用该选项的缺点是当使用SHOW TABLES或SHOW DATABASES时,看不出原来的名字是用大写还是小写。
  • 使用lower_case_tables_name=0在Unix和 lower_case_tables_name=2Windows上。这样可以保留数据库和表名的字母大小写。这样做的缺点是您必须确保您的语句始终在Windows上使用正确的字母大小引用您的数据库和表名。

用户自定义变量:

可以先在用户自己定义的变量中存储一个值然后在后面引用它;这样可以将该值从一个语句传递到另一个语句。用户自定义变量具有会话专一性,也就是说,一个客户端定义的变量不能被其它客户端看到或使用,当客户端退出时,该客户端连接的所有变量将自动释放。

用户变量的形式为@var_name,其中变量名var_name可以由当前字符集中的字母数字字符、.、_和$组成。

对于SET语句,可以使用=或:=作为分配符,分配给每个变量的expr可以为整数、实数、字符串或者NULL值。除了使用SET语句也可以为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为比较操作符

在SELECT语句中,表达式是在被发送到客户端后才进行计算。这说明在HAVING、GROUP BY或者ORDER BY子句中,在SELECT列表中不能使用将值赋值到变量的表达式。

#在SELECT语句中,表达式是在被发送到客户端后才进行计算。这说明在HAVING、GROUP BY或者ORDER BY子句中,在SELECT列表中不能使用将值赋值到变量的表达式。
在select执行后幅值

 SELECT (@aa:=id) AS a,(@aa+3) AS b FROM tbl_name HAVING b=5;
-----------------------------------------------------------------



1.3操作符

MySQL按照以下规则进行数值比较:

  • 若函数中有一个或两个参数都是NULL,则比较运算的结果为NULL,除非是等号比较运算符<=>。
  • 若同一个比较运算中的两个参数都是字符串类型,则作为字符串进行比较。
  • 若两个参数均为整数,则按照整数进行比较。
  • 十六进制值在不作为数字进行比较时,则按照二进制字符串处理。
  • 假如参数中的一个为TIMESTAMP或DATETIME数据类型,而其它参数均为常数,则在进行比较前应该将常数转为timestamp类型。这样做的目的是为了使ODBC的进行更加顺利。注意:这不用于IN()中的参数!为了更加可靠,在进行对比时通常使用完整的datetime/date/time字符串。

在其它情况下,参数作为浮点数(实数)进行比较。
在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 Latin1,同时也适用于英语)。为了达到比较的目的,可使用CAST()函数将某个值转为另外一种类型。使用CONVERT()可以将字符串值转为不同的字符集。

 

操作符的优先级:

SQL语言的进阶整理【3】

 

ODBC 开发性数据库互联,是SQL对外的API接口。

  • 默认情况下,||是逻辑运算符OR。当启用PIPES_AS_CONCAT模式时,||就是一个字符串连接符,优先级处于^与一元运算符之间。
  • 默认情况下,!的优先级高于NOT。但当启用HIGH_NOT_PRECEDENCE模式时,!NOT拥有相同的优先级。
  • <=> 空值安全的等号:这个操作符与=操作符执行相同的比较操作,不过在两个操作码均为NULL时,其返回至为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。相当与AND的逻辑操作符。
  • <> 或 != 不等于

  • IS boolean_valueIS NOT boolean_value:根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN

  • expr BETWEEN min AND max 假如expr大于或等于min且expr小于或等于max, 则BETWEEN的返回值为1,否则是0。若所有参数都是同一类型,则上述关系相当于表达式 :min <= expr AND expr <= maxexpr NOT BETWEEN min AND max这相当于NOT(expr BETWEEN min AND max)

  • COALESCE(value,...) 返回参数列表当中的第一个非NULL值,在没有非NULL值的情况下返回值为NULL。

  • GREATEST(value1,value2,...)当有2个或2个以上参数时,返回值为最大(最大值的)参数

  • expr IN (value,...)expr为IN列表中的任意一个值,则其返回值为1, 否则返回值为0expr NOT IN (value,...)这与NOT (expr IN (value,...))相同。ISNULL(expr)如果expr为NULL,那么ISNULL()的返回值为1,否则返回值为0。

  • INTERVAL(N,N1,N2,N3,...)假如N < N1,则返回值为0;假如N < N2 等,则返回值为1;假如N为NULL,则返回值为-1。

SQL语言的进阶整理【3】

2 函数

2.1控制函数

  • CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END,返回的是value=compare-value的结果。
  • IF(expr1,expr2,expr3),如果expr1是TRUE(expr1 <> 0 and expr1 <> NULL),则IF()的返回值为expr2; 否则返回值则为expr3。IF()的返回值是否为数字值或字符串值,具体情况视其所在语境而定。
  • IFNULL(expr1,expr2),假如expr1不为NULL,则IFNULL()的返回值为 expr1;否则其返回值为expr2。

  • NULLIF(expr1,expr2),如果expr1 = expr2成立,那么返回值为NULL,否则返回值为expr1。

2.2字符串函数

SQL语言的进阶整理【3】

SQL语言的进阶整理【3】

SQL语言的进阶整理【3】

 2.3数字函数

SQL语言的进阶整理【3】SQL语言的进阶整理【3】

2.4 日期函数

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

2.5 Cast 函数和操作符

SQL语言的进阶整理【3】

https://dev.mysql.com/doc/refman/5.5/en/cast-functions.html 【细节用法】

其实这些并没有什么太大的意义,在看的时候只要能知道这是什么就可以了,然后在实际应用中在不断的学习。

很多函数是用不到的或者是你自己没法记住的,自己敲一下知道这是个什么,有个印象就好。需要的时候在查官方文档。

3 全文搜索

https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html