SQL语言的进阶整理【3】
1、语言结构
文字值
1.1 字符串、数值型、日期、16进制、布尔值、位域、NULL值
字符串:
字符串指用单引号(‘'’)或双引号(‘"’)引用起来的字符序列。
转义字符
数值型:
整数用一系列阿拉伯数字表示,浮点数使用.作为十进制间隔符,以上两种类型的数值均可以在前面加一个-来表示负值。
日期类型:
- 作为字母
'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 标识符
数据库、表、索引、列和别名是识别符。
- 数据库,表,列不允许包括/ 、\、。等字符;
- 数据库、表和列名不应以空格结尾。在识别符中可以使用引号识别符,但是应尽可能避免这样使用。
标识符限定符:
MySQL允许使用由单个识别符或多个识别符组成的名字。多部分名各组件之间应以句点(‘.’)间隔开。多部分名的开头部分作为限定词,后面的识别符才具有对该名字的解释意义。
多部分名的组件需要被引用,应分别将它们引起来而不要将整个名字引起来。
识别符大小写:
操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。
表和数据库名称如何存储在磁盘上并在MySQL中使用受lower_case_table_names
系统变量的影响,在Unix上,默认值为 lower_case_table_names=
0.在Windows上,默认值为1.在macOS上,默认值为2。
避免由于数据库或表名的大小写造成的数据转移问题:
- 在任何系统中设置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()可以将字符串值转为不同的字符集。
操作符的优先级:
ODBC 开发性数据库互联,是SQL对外的API接口。
- 默认情况下,||是逻辑运算符OR。当启用PIPES_AS_CONCAT模式时,||就是一个字符串连接符,优先级处于^与一元运算符之间。
- 默认情况下,!的优先级高于NOT。但当启用HIGH_NOT_PRECEDENCE模式时,!和NOT拥有相同的优先级。
- <=> 空值安全的等号:这个操作符与=操作符执行相同的比较操作,不过在两个操作码均为NULL时,其返回至为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。相当与AND的逻辑操作符。
-
<> 或 != 不等于
-
IS boolean_value和IS NOT boolean_value:根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。
-
expr BETWEEN min AND max 假如expr大于或等于min且expr小于或等于max, 则BETWEEN的返回值为1,否则是0。若所有参数都是同一类型,则上述关系相当于表达式 :min <= expr AND expr <= max。expr 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, 否则返回值为0。expr 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。
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字符串函数
2.3数字函数
2.4 日期函数
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
2.5 Cast 函数和操作符
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