mySQL(三)
约束
在MySQL中,各种完整性约束是数据库关系模式定义的一部分,可以通过CREATE TABLE或ALTER TABLE语句来定义。一旦定义了完整性约束,MySQL服务器会随时检测处于更新状态的数据库内容是否符合相关的完整性约束,从而保证数据的一致性与正确性。这样可以防止操作对数据库的意外破坏,也能提高完整性检测的效率,还能减轻数据库编程人员的工作负担。
主键约束
主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键应该遵守下面的规则:
● 每个表只能定义一个主键。
● 主键值必须唯一标识表中的每一行,且不能为NULL,即表中不可能存在两行数据有相同的主键值。这是唯一性原则。
● 一个列名只能在复合主键列表中出现一次。
● 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯一性原则,那么这个复合主键是不正确的。这是最小化原则。
在CREATE TABLE语句中,主键是通过PRIMARY KEY关键字来指定的。
在定义列的同时指定主键,语法规则如下:
1 | <字段名> <数据类型> PRIMARY KEY [默认值] |
在定义完所有列之后,指定主键的语法格式为:
1 | [CONSTRAINT <约束名>] PRIMARY KEY [字段名] |
主键由多个字段联合组成,语法规则如下:
1 | PRIMARY KEY [字段1,字段2,...,字段n] |
在修改数据表时添加主键约束的语法规则为:
1 | ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>); |
外键约束
外键用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。
定义一个外键时,需要遵守下列规则。
● 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
● 必须为父表定义主键。
● 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
● 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
● 外键中列的数目必须和父表的主键中列的数目相同。
● 外键中列的数据类型必须和父表主键中对应列的数据类型相同。
在数据表中创建外键的语法规则如下:
1 | [CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,...] |
语法说明如下:
“外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;“字段名”表示子表需要添加外健约束的字段列;“主表名”即被子表外键所依赖的表的名称;“主键列”表示主表中定义的主键列或者列组合。
在修改数据表时添加外键约束的语法规则为:
1 | ALTER TABLE <数据表名> ADD CONSTRAINT <索引名> |
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,MySQL中删除外键的语法格式如下:
1 | ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>; |
唯一约束
唯一约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
在定义完列之后直接指定唯一约束,语法规则如下:
1 | <字段名> <数据类型> UNIQUE |
在修改表时添加唯一约束的语法格式为:
1 | ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>); |
在MySQL中删除唯一约束的语法格式如下:
1 | ALTER TABLE <表名> DROP INDEX <唯一约束名>; |
检查约束
CHECK约束可以通过CREATE TABLE或ALTER TABLE语句实现,根据用户实际的完整性要求来定义。它可以分别对列或表实施CHECK约束。
语法格式如下:
1 | CHECK <表达式> |
语法说明如下:
<表达式>:SQL表达式,用于指定需要检查的限定条件。
若将CHECK约束子句置于表中某个列的定义之后,则这种约束也称为基于列的CHECK约束。
在更新表数据的时候,系统会检查更新后的数据行是否满足CHECK约束中的限定条件。MySQL可以使用简单的表达式来实现CHECK约束,也允许使用复杂的表达式作为限定条件,例如在限定条件中加入子查询。
在创建表时设置检查约束的语法规则如下:
1 | CREATE TABLE <表名> CHECK (<检查约束>) |
在修改表时设置检查约束的语法规则如下:
1 | ALTER TABLE <表名> ADD CONSTRAINT <检查约束名> CHECK (<检查约束>) |
在修改表时删除检查约束的语法规则如下:
1 | ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>; |
默认值约束
默认值约束(Default Constraint)指定某列的默认值。
在创建表时设置默认值约束的语法规则如下:
1 | <字段名> <数据类型> DEFAULT <默认值>; |
在修改表时添加默认值约束的语法规则如下:
1 | ALTER TABLE <数据表名> |
在修改表时删除默认值约束的语法规则如下:
1 | ALTER TABLE <数据表名> |
非空约束
非空约束可以通过CREATE TABLE或ALTER TABLE语句实现。在表中某个列的定义后加上关键字NOT NULL作为限定词,来约束该列的取值不能为空。
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
在创建表时设置非空约束的语法规则如下:
1 | CREATE TABLE <数据表名> <字段名> <数据类型> NOT NULL; |
在修改表时设置非空约束的语法规则如下:
1 | ALTER TABLE <数据表名> |
在修改表时删除非空约束的语法规则如下:
1 | ALTER TABLE <数据表名> |
在MySQL中可以使用SHOW CREATE TABLE语句查看表中的约束。
函数
数值型函数
ABS函数
绝对值函数ABS(x)返回x的绝对值。正数的绝对值是其本身,负数的绝对值为其相反数,0的绝对值是0。
MOD函数
求余函数MOD(x, y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,它返回除法运算后的余数。
SQRT函数
平方根函数SQRT(x)返回非负数x的二次方根。负数没有平方根,返回结果为NULL。
SIGN函数
平方根函数SQRT(x)返回非负数x的二次方根。负数没有平方根,返回结果为NULL。
CEIL与CEILING函数
取整函数CEIL(x)和CEILING(x)的意义相同,返回不小于x的最小整数值,返回值转化为一个BIGINT。
三角函数
正弦函数SIN(x)返回x的正弦值,其中x为弧度值。
反正弦函数ASIN(x)返回x的反正弦值,若x不在-1到1的范围之内,则返回NULL。
余弦函数COS(x)返回x的余弦值,x为弧度值。
正切函数TAN(x)返回x的正切值,x为给定的弧度值。
反正切ATAN(x)返回x的反正切值,正切为x的值。
余切函数COT(x)返回x的余切值,x是给定的弧度值。
字符串函数
LENGTH函数
LENGTH(str)函数的返回值为字符串的字节长度,使用uft8(UNICODE的一种变长字符编码,又称万国码)编码字符集时,一个汉字是3个字节,一个数字或字母是一个字节。
UPPER与LOWER函数
字母大写转换函数UPPER(str)可以将字符串str中的字母字符全部转换成大写。
字母小写转换函数LOWER(str)可以将字符串str中的字母字符全部转换成小写。
LEFT与RIGHT函数
LEFT(s, n)函数返回字符串s最左边的n个字符。
RIGHT(s, n)函数返回字符串s最右边的n个字符。
CONCAT函数
CONCAT(sl, s2, …)函数返回结果为连接参数产生的字符串,或许有一个或多个参数,若有任何一个参数为NULL,则返回值为NULL。若所有参数均为非二进制字符串,则结果为非二进制字符串。若自变量中含有任一二进制字符串,则结果为一个二进制字符串。
TRIM函数
删除空格函数TRIM(s)删除字符串s两侧的空格。
INSERT函数
替换字符串函数INSERT(s1, x, len, s2)返回字符串s1,子字符串起始于x位置,并且用len个字符长的字符串代替s2。若x超过字符串长度,则返回值为原始字符串。假如len的长度大于其他字符串的长度,则从位置x开始替换。若任何一个参数为NULL,则返回值为NULL。
SUBSTRING函数
获取子串函数SUBSTRING(s, n, len) 带有len参数的格式,从字符串s返回一个长度同len字符相同的子字符串,起始于位置n。也可能对n使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的第n个字符,即倒数第n个字符,而不是字符串的开头位置。
REVERSE函数
字符串逆序的函数REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串的顺序相反。
REPLACE函数
替换函数REPLACE(s, s1, s2)使用字符串s2替换字符串s中所有的字符串s1。
日期与时间函数
NOW和SYSDATE函数
NOW()和SYSDATE()函数的作用相同,返回当前日期和时间值,格式为“YYYY-MM-DD HH:MM:SS”或“YYYYMMDDHHMMSS”,具体格式根据函数用在字符串或数字语境中而定。
CURDATE函数和CURRENT_DATE函数
CURDATE()和CURRENT_DATE()函数的作用相同,将当前日期按照“YYYY-MM-DD”或“YYYYMMDD”格式的值返回,具体格式根据函数用在字符串或数字语境中而定。
CURTIME函数和CURRENT_TIME函数
CURTIME()和CURRENT_TIME()函数的作用相同,将当前时间以“HH:MM:SS”或“HHMMSS”格式返回,具体格式根据函数用在字符串或数字语境中而定。
DAYOFWEEK函数和WEEKDAY函数
DAYOFWEEK(d)函数返回d对应的一周中的索引(位置)。1表示周日,2表示周一,……, 7表示周六)。
WEEKDAY(d)返回d对应的工作日索引。0表示周一,1表示周二,……,6表示周日。
DAYOFMONTH函数和DAYOFYEAR函数
DAYOFMONTH(d) 函数返回d是一个月中的第几天,范围为1~31。
DAYOFYEAR(d) 函数返回d是一年中的第几天,范围为1~366。
MONTH函数和MONTHNAME函数
MONTH(date) 函数返回指定date对应的月份,范围为1~12。
MONTHNAME(date) 函数返回日期date对应月份的英文全名。
DATEDIFF函数
DATEDIFF(date1, date2)返回起始时间date1和结束时间date2之间的天数。date1和date2为日期或date-and-time表达式。计算时只用到这些值的日期部分。
ADDDATE函数
ADDDDATE(date, INTERVAL expr type)函数执行日期的加运算。
DATE_FORMAT函数
DATE_FORMAT(date, format)函数根据format指定的格式显示date值。
聚合函数
MAX函数
MAX()函数返回指定列中的最大值。
MAX()函数不仅适用于查找数值类型,也可应用于字符类型。
MIN函数
MIN()函数返回查询列中的最小值。
COUNT函数
COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数,使用方法有以下两种:
● COUNT(*)计算表中总的行数,无论某列有数值或者为空值。
● COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
SUM函数
SUM()是一个求总和的函数,返回指定列值的总和。
AVG函数
AVG()函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
查询
表单查询是指从一张表的数据中查询所需的数据,主要有查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等。
MySQL从数据表中查询数据的基本语句为SELECT语句,基本格式如下:
1 | SELECT {* | <字段列名>} |
其中,各条子句的含义如下:
● {* | <字段列名>}包含星号通配符的字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间要用逗号隔开,最后一个字段后不要加逗号。
● FROM <表1>, <表2>…,表1和表2表示查询数据的来源,可以是单个或多个。
● WHERE子句是可选项,如果选择该项,将限定查询行必须满足的查询条件。
● GROUP BY<字段>,该子句告诉MySQL如何显示查询出来的数据,并按照指定的字段分组。
● [ORDER BY<字段>],该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)和降序(DESC)。
● [LIMIT[
使用“*”查询表中的全部内容
在SELECT语句中使用星号*”通配符查询所有字段。SELECT查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号*”通配符指定查找所有列的名称,语法格式如下:
1 | SELECT * FROM 表名; |
查询表中指定的字段
查询表中的某一个字段的语法格式为:
1 | SELECT <列名> FROM <表名>; |
使用SELECT声明可以获取多个字段下的数据,只需要在关键字SELECT后面指定要查找的字段名称,不同字段名称之间用逗号“, ”分隔开,最后一个字段后面不需要加逗号,语法格式如下:
1 | SELECT <字段名1>,<字段名2>,...,<字段名n> FROM <表名>; |
使用DISTINCT关键字去除结果中的重复行
在SELECT语句中,可以使用DISTINCT关键字指示MySQL消除重复的记录值,语法格式为:
1 | SELECT DISTINCT <字段名> FROM <表名>; |
在查询时给表和字段设置别名
当表名很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名代替表原来的名称。为表取别名的基本语法格式为:
1 | <表名> [AS] <别名> |
● 表名:数据中存储的数据表的名称。
● 别名:查询时指定的表的新名称。
● AS:关键字为可选参数。
在使用SELECT语句显示查询结果时,MySQL会显示每个SELECT后面指定输出的列,在有些情况下,显示的列名称会很长或者名称不够直观,MySQL可以指定列的别名,替换字段或表达式。为列取别名的基本语法格式为:
1 | <列名> [AS] <列别名> |
● <列名>:为表中字段定义的名称。
● <列别名>:字段新的名称。
● AS:关键字为可选参数。
使用LIMIT关键字指定查询结果的行数
SELECT返回所有匹配的行,有可能是表中所有的行,如仅需要返回第一行或者前几行,使用LIMT关键字,基本的语法格式如下:
1 | <LIMIT> [<位置偏移量>,] <行数> |
第一个参数“位置偏移量”指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。
使用ORDER BY对查询结果进行排序
SELECT语句中,ORDER BY子句主要用来将结果集中的数据按照一定的顺序进行排序。其语法格式为:
1 | ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC] |
语法说明如下。
● <列名>:指定用于排序的列。可以指定多个列,列名之间用逗号分隔。
● <表达式>:指定用于排序的表达式。
● <位置>:指定用于排序的列在SELECT语句结果集中的位置,通常是一个正整数。
● ASC | DESC:关键字ASC表示按升序分组,关键字DESC表示按降序分组,其中ASC为默认值。这两个关键字必须位于对应的列名、表达式、列的位置之后。
使用ORDER BY子句应该注意以下几个方面:
(1)ORDER BY子句中可以包含子查询。
(2)当排序的值中存在空值时,ORDER BY子句会将该空值作为最小值来对待。
(3)当在ORDER BY子句中指定多个列进行排序时,MySQL会按照列的顺序从左到右依次进行排序。
(4)查询的数据并没有以一种特定的顺序显示,如果没有对它们进行排序,则将根据插入到数据表中的顺序显示。使用ORDER BY子句对指定的列数据进行排序。
带WHERE关键字的条件查询
在SELECT语句中,可以使用WHERE子句来指定查询条件,从FROM子句的中间结果中选取适当的数据行,达到数据过滤的效果。语法格式如下:
1 | WHERE <查询条件> {<判定算法1>,<判定算法2>,...} |
语法说明如下。
<判定运算>:其结果取值为TRUE、FALSE和UNKNOWN。<判定运算>的语法分类如下:
● <表达式1> {= | < | <= | > | >= | <=> | < > | ! =}<表达式2>
● <表达式1> [NOT] LIKE <表达式2>● <表达式1> [NOT] [REGEXP | RLIKE] <表达式2>
● <表达式1> [NOT] BETWEEN <表达式2> AND <表达式3>
● <表达式1> IS [NOT] NULL
常用的运算符
1.比较运算符
比较运算符的语法格式为:
1 | <表达式1> {= | < | <= | > | >= | <=> | < > | ! =}<表达式2> |
下面分别介绍不同的比较运算符的使用方法。
(1)等于运算符“=”
等号“=”用来判断数字、字符串和表达式是否相等。如果相等,返回值为1,否则返回值为0。
数据进行比较时,有如下规则:
● 若有一个或两个参数为NULL,则比较运算的结果为NULL。
● 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
● 若两个参数均为正数,则按照整数进行比较。
● 若一个字符串和数字进行相等判断,则MySQL可以自动将字符串转换成数字。
(2)安全等于运算符“<=>”
用于比较两个表达式的值。当两个表达式的值中有一个为空值或者都为空值时,将返回UNKNOWN。对于运算符“<=>”,当两个表达式彼此相等或都等于空值时,比较结果为TRUE;若其中一个是空值或者都是非空值但不相等时,则为FALSE,不会出现UNKNOWN的情况。
(3)不等于运算符“<>”或者“! =”“<>”或者“! =”
用于数字、字符串、表达式不相等的判断。如果不相等,返回值为1;否则返回值为0。这两个运算符不能用于判断空值(NULL)。
(4)小于或等于运算符“<=”
“<=”用来判断左边的操作数是否小于或等于右边的操作数。如果小于或等于,返回值为1;否则返回值为0。“<=”不能用于判断空值。
(5)小于运算符“<”
“<”用来判断左边的操作数是否小于右边的操作数。如果小于,返回值为1;否则返回值为0。“<”不能用于判断空值。
(6)大于或等于运算符“>=”
“>=”用来判断左边的操作数是否大于或等于右边的操作数。如果大于或等于,返回值为1;否则返回值为0。“>=”不能用于判断空值。
(7)大于运算符“>”
“>”用来判断左边的操作数是否大于右边的操作数。如果大于,返回值为1;否则返回值为0。“>”不能用于判断空值。
(8)IS NULL(或者ISNULL)运算符
IS NULL和ISNULL用于检验一个值是否为NULL,如果为NULL,返回值为1;否则返回值为0。
(9)IS NOT NULL运算符
IS NOT NULL用于检验一个值是否为非NULL,如果为非NULL,返回值为1;否则返回值为0。
(10)BETWWEN AND运算符
语法格式为:
1 | <表达式> BETWEEN <最小值> AND <最大值> |
若<表达式>大于或等于<最小值>,且小于或等于<最大值>,则BETWEEN的返回值为1;否则返回值为0。
(11)LEAST运算符
语法格式为:
1 | LEAST(<值1>,<值2>,...,<值n>) |
其中,值n表示参数列表中有n个值。存在两个或多个参数的情况下,返回最小值。若任意一个自变量为NULL,则LEAST()的返回值为NULL。
(12)GREATEST运算符
语法格式为:
1 | GREATEST(<值1>,<值2>,...,<值n>) |
其中,值n表示参数列表中有n个值。存在两个或多个参数的情况下,返回最大值。若任意一个自变量为NULL,则GREATEST ()的返回值为NULL。
(13)IN运算符
IN运算符用来判断操作数是否为IN列表中的一个值。如果是,返回值为1;否则返回值为0。
(14)NOT IN运算符
NOT IN运算符用来判断表达式是否为IN列表中的一个值。如果不是,返回值为1;否则返回值为0。
2.算术运算符
算术运算符是SQL中最基本的运算符,MySQL中的算术运算符如表所示。
3.逻辑运算符
在SQL语言中,所有逻辑运算符求值所得的结果均为TRUE、FALSE或NULL。在MySQL中分别体现为1(TRUE)、0(FALSE)和NULL。MySQL中的逻辑运算符如表所示。
下面分别介绍不同的逻辑运算符的使用方法。
(1)NOT或者!
逻辑非运算符NOT或者!,表示当操作数为0时,返回值为1;当操作数为非零值时,返回值为0;当操作数为NULL时,返回值为NULL。
(2)AND或者 &&
逻辑与运算符AND或者&&,表示当所有操作数均为非零值并且不为NULL时,返回值为1;当一个或多个操作数为0时,返回值为0;其余情况返回值为NULL。
(3)OR或者 ||
逻辑或运算符OR或者||,表示当两个操作数均为非NULL值且任意一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL且另一个操作数为非零值时,结果为1,否则结果为NULL;当两个操作数均为NULL时,所得结果为NULL。
(4)XOR运算符
逻辑异或运算符XOR。当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,若两个操作数都不是0或者都是0值,则返回结果为0;若一个为0,另一个不为非0,则返回结果为1。
4.位运算符
位运算符用来对二进制字节中的位进行移位或者测试处理,MySQL中提供的位运算符如表所示。
下面分别介绍不同的位运算符的使用方法。
(1)位或运算符“|”
位或运算的实质是将参与运算的两个数据按对应的二进制数逐位进行逻辑或运算。若对应的二进制位有一个或两个为1,则该位的运算结果为1,否则为0。
(2)位与运算符“&”
位与运算的实质是将参与运算的两个数据按对应的二进制数逐位进行逻辑与运算。若对应的二进制位都为1,则该位的运算结果为1,否则为0。
(3)位异或运算符“^”
位异或运算的实质是将参与运算的两个数据按对应的二进制数逐位进行逻辑异或运算。对应的二进制位不同时,对应位的结果才为1。如果两个对应位都为0或者都为1,则对应位的结果为0。
(4)位左移运算符“<<”
位左移运算符“<<”使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。
语法格式为“表达式<<n”,这里n指定值要移位的位数。
(5)位右移运算符“>>”
位右移运算符“>>”使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边高位的数值将被移出并丢弃,左边低位空出的位置用0补齐。
语法格式为“表达式>>n”,这里n指定值要移位的位数。(6)位取反运算符“~”
位取反运算符的实质是将参与运算的数据按对应的二进制数逐位反转,即1取反后变0, 0取反后变为1。
运算符的优先级决定了不同的运算符在表达式中计算的先后顺序,表列出了MySQL中的各类运算符及其优先级。
可以看出,不同运算符的优先级是不同的。一般情况下,级别高的运算符优先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。另外,在无法确定优先级的情况下,可以使用圆括号“( )”来改变优先级,并且这样会使计算过程更加清晰。
多条件的查询语句
使用SELECT查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。MySQL在WHERE子句中使用AND操作符限定只有满足所有查询条件的记录才会被返回。可以使用AND连接两个甚至多个查询条件,多个条件表达式之间用AND分开。
使用LIKE的模糊查询
字符串匹配的语法格式如下:
1 | <表达式1> [NOT] LIKE <表达式2> |
字符串匹配是一种模式匹配,使用运算符LIKE设置过滤条件,过滤条件使用通配符进行匹配运算,而不是判断是否相等进行比较。相互间进行匹配运算的对象可以是CHAR、VARCHAR、TEXT、DATETIME等数据类型。运算返回的结果是TRUE或FALSE。
利用通配符可以在不完全确定比较值的情形下创建一个比较特定数据的搜索模式,并置于关键字LIKE之后。可以在搜索模式的任意位置使用通配符,并且可以使用多个通配符。MySQL支持的通配符有以下两种:
1.百分号(%)
百分号是MySQL中常用的一种通配符,在过滤条件中,百分号可以表示任何字符串,并且该字符串可以出现任意次。
使用百分号通配符要注意以下几点:
(1)MySQL默认是不区分大小写的,若要区分大小写,则需要更换字符集的校对规则。
(2)百分号不匹配空值。
(3)百分号可以代表搜索模式中给定位置的0个、1个或多个字符。
(4)尾空格可能会干扰通配符的匹配,一般可以在搜索模式的最后附加一个百分号。
2.下画线(_)
下画线通配符和百分号通配符的用途一样,下画线只匹配单个字符,而不是多个字符,也不是0个字符。
日期字段作为条件的查询语句
以日期字段作为条件,可以使用比较运算符设置查询条件,也可以使用BETWEEN AND运算符查询某个范围内的值。
BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,若字段值满足指定的范围查询条件,则这些记录被返回。
高级查询
内连接查询
内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行,在FROM子句中使用关键字INNER JOIN连接两张表,并使用ON子句来设置连接条件。如果没有任何条件,INNER JOIN和CROSS JOIN在语法上是等同的,两者可以互换。
语法格式如下:
1 | SELECT <列名1,列名2,...> |
语法说明如下。
● <列名1,列名2 …>:需要检索的列名。
● <表名1> <表名2>:进行内连接的两张表的表名。
内连接是系统默认的表连接,所以在FROM子句后可以省略INNER关键字,只用关键字JOIN。使用内连接后,FROM子句中的ON子句可用来设置连接表的条件。
在FROM子句中可以在多个表之间连续使用INNER JOIN或JOIN,如此可以同时实现多个表的内连接。
外连接查询
内连接是在交叉连接的结果集上返回满足条件的记录;而外连接先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录。
外连接更加注重两张表之间的关系。按照连接表的顺序,可以分为左外连接和右外连接。
左外连接又称为左连接,在FROM子句中使用关键字LEFTOUTER JOIN或者LEFT JOIN,用于接收该关键字左表(基表)的所有行,并用这些行与该关键字右表(参考表)中的行进行匹配,即匹配左表中的每一行及右表中符合条件的行。在左外连接的结果集中,除了匹配的行之外,还包括左表中有但在右表中不匹配的行,对于这样的行,从右表中选择的列的值被设置为NULL,即左外连接的结果集中的NULL值表示右表中没有找到与左表相符的记录。
右外连接又称为右连接,在FROM子句中使用RIGHTOUTER JOIN或者RIGHT JOIN。与左外连接相反,右外连接以右表为基表,连接方法和左外连接相同。在右外连接的结果集中,除了匹配的行外,还包括右表中有但在左表中不匹配的行,对于这样的行,从左表中选择的值被设置为NULL。
自连接查询
自连接是将一个表和它自身进行连接,也是内连接的一种,同样使用INNER JOIN或者JOIN关键字来进行连接。
如果需要在一个表中查找具有相同列值的行,就可以考虑用自连接。注意,在使用自连接的时候,需要为表指定两个不同的别名,且对所有查询列的引用必须使用表别名的限定,否则SELECT操作会失败。
子查询
子查询中常用的操作符有ANY(SOME)、ALL、IN和EXISTS。子查询可以添加到SELECT、UPDATE和DELETE语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“<”“<=”“>”“>=”“! =”等。
子查询中常用的运算符
(1)IN子查询
结合关键字IN所使用的子查询主要用于判断一个给定值是否存在于子查询的结果集中。其语法格式为:
1 | <表达式> [NOT] IN <子查询> |
语法说明如下。
● <表达式>:用于指定表达式。当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE;若使用关键字NOT,则返回的值正好相反。
● <子查询>:用于指定子查询。这里的子查询只能返回一列数据。对于比较复杂的查询要求,可以使用SELECT语句实现子查询的多层嵌套。
(2)比较运算符子查询
比较运算符所使用的子查询主要用于对表达式的值和子查询返回的值进行比较运算。其语法格式为:
1 | <表达式> {= | < | > | >= | <= | <=> | < > |!= } |
语法说明如下。
● <子查询>:用于指定子查询。
● <表达式>:用于指定要进行比较的表达式。
● ALL、SOME和ANY:可选项。用于指定对比较运算的限制。其中,关键字ALL用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回TRUE,否则返回FALSE;关键字SOME和ANY是同义词,表示表达式只要与子查询结果集中的某个值满足比较关系,就返回TRUE,否则返回FALSE。(3)EXIST子查询
关键字EXIST所使用的子查询主要用于判断子查询的结果集是否为空。其语法格式为:
1 | EXIST <子查询> |
若子查询的结果集不为空,则返回TRUE;否则返回FALSE。
分组查询
在SELECT语句中,允许使用GROUP BY子句,将结果集中的数据行根据选择列的值进行逻辑分组,以便能汇总表内容的子集,实现对每个组而不是对整个结果集进行整合。其语法格式为:
1 | GROUP BY { <列名> | <表达式> <位置>} [ASC|DESC] |
语法说明如下。
● <列名>:指定用于分组的列。可以指定多个列,彼此间用逗号分隔。注意:GROUP BY子句中的各选择列必须也是SELECT语句的选择列清单中的一项。
● <表达式>:指定用于分组的表达式。通常与聚合函数一块使用,例如可将表达式COUNT(*) AS ’人数’作为SELECT选择列表清单的一项。
● <位置>:指定用于分组的选择列在SELECT语句结果集中的位置,通常是一个正整数。例如,GROUPBY 2表示根据SELECT语句列清单上的第2列的值进行逻辑分组。
● ASC | DESC:关键字ASC表示按升序分组,关键字DESC表示按降序分组,其中ASC为默认值,注意这两个关键字必须位于对应的列名、表达式、列的位置之后。对于GROUP BY子句的使用,需要注意以下几点。
● GROUP BY子句可以包含任意数目的列,使其可以对分组进行嵌套,为数据分组提供更加细致的控制。
● GROUP BY子句列出的每个列都必须是检索列或有效的表达式,但不能是聚合函数。若在SELECT语句中使用表达式,则必须在GROUP BY子句中指定相同的表达式。注意,不能使用别名。
● 除聚合函数之外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
● 若用于分组的列中包含有NULL值,则NULL将作为一个单独的分组返回;若该列中存在多个NULL值,则将这些NULL值所在的行分为一组。
使用HAVING关键字设置条件
在SELECT语句中,除了能使用GROUP BY子句分组数据外,还可以使用HAVING子句过滤分组,在结果集中规定了包含哪些分组和排除哪些分组。其语法格式为:
1 | HAVING <条件> |
语法说明如下。
● <条件>:指定过滤条件。HAVING子句和WHERE子句非常相似,HAVING子句支持WHERE子句中所有的操作符和语法,但是两者存在几点差异:
● WHERE子句主要用于过滤数据行,而HAVING子句主要用于过滤分组,即HAVING子句基于分组的聚合值而不是特定行的值来过滤数据,主要用来过滤分组。
● WHERE子句不可以包含聚合函数,HAVING子句中的条件可以包含聚合函数。
● HAVING子句是在数据分组后进行过滤,WHERE子句会在数据分组前进行过滤。WHERE子句排除的行不包含在分组中,可能会影响HAVING子句基于这些值过滤掉的分组。
使用正则表达式的查询
MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式,表列出了REGEXP操作符中常用的匹配列表。
查询以特定字符或字符串开头的记录
字符“^”匹配以特定字符或者字符串开头的文本。
查询以特定字符或字符串结尾的记录
字符“$”匹配以特定字符或者字符串结尾的文本。
用符号“.”代替字符串中的任意一个字符
字符“.”匹配任意一个字符。
使用“*”和“+”来匹配多个字符
星号“*”匹配前面的字符任意多次,包括0次。加号“+”匹配前面的字符至少一次。
匹配指定字符串
正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,若要匹配多个字符串,则多个字符串之间使用分隔符“|”隔开。
匹配指定字符串中的任意一个
方括号“[]”指定一个字符集合,只匹配其中任何一个字符,即为所查找的文本。
方括号“[]”还可以指定数值集合。
匹配指定字符以外的字符
“[^字符集合]”匹配不在指定集合中的任何字符。