欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 MySQL高级查询

程序员文章站 2022-04-29 17:18:25
MySQL高级查询本章将介绍如何修改表结构和数据的增删改查,以及mysql中常用的函数和运算符的使用方法。一、DDL语句(修改表结构)1、修改表语法:# 修改表名alter table 旧表名 rename 新表名;# 添加字段alter table 表名 add 字段名 数据类型[属性];# 修改字段alter table 表名 CHANGE 原字段名 新字段名 数据类型[属性];# 删除字段alter table 表名 drop 字段名;示例:drop table i...

MySQL高级查询

本章将介绍如何修改表结构和数据的增删改查,以及mysql中常用的函数和运算符的使用方法。

一、DDL语句(修改表结构)

1、修改表

语法:

# 修改表名
alter table 旧表名 rename 新表名;

# 添加字段
alter table 表名 add 字段名 数据类型[属性];

# 修改字段
alter table 表名 CHANGE 原字段名 新字段名 数据类型[属性];

# 删除字段
alter table 表名 drop 字段名;

示例:

drop table if exists `ttt`;
# 创建表
create table `ttt`(
	`sid` int(4) not null auto_increment primary key,
    `sname` varchar(20) not null
);

# 修改表名
alter table teacher rename ttt;

# 添加字段
alter table ttt add `sex` char(2);

# 修改字段
alter table ttt CHANGE `sex` `gender` char(2);

# 删除字段
alter table ttt drop gender;

2、添加主键

语法:

alter table 表名 add CONSTRAINT 主键名
PRIMARY KEY 表名(主键字段);

如何设置grade表中gradeID字段为主键?

create table grade(
	`gradeID` int(4) not null,
	`gradeName` varchar(20) not null
);

alter table grade add CONSTRAINT pk_grade
PRIMARY KEY grage(`gradeID`);

3、添加外键

语法:

alter table 表名 ADD CONSTRAINT 外键名              FOREIGN KEY(外键字段)
REFERENCES 关联表名(关联字段);

如何将student表的gradeId字段和grade表的gradeId字段建立外键关联?

alter table student add CONSTRAINT fk_student_grade
FOREIGN KEY(`gradeID`)
REFERENCES `grade`(`gradeID`);

4、小结

阅读以下代码,哪些SQL语句可以实现修改表?

1)ALTER TABLE mybook RENAME book;
2)ALTER TABLE book ADD author  varchar(10) NOT NULL;
3)ALTER TABLE `book` ADD   `pk_book`  PRIMARY KEY `book`(`bookId`);
4)ALTER TABLE `book` DROP `author `;

除了第3个,其他SQL语句都可以实现修改表。

5、上机练习

(1)创建数据表并实现对表的修改操作
字段名称 字段说明 数据类型 长度 属性
number 序号 INT 4 自增列
name 姓名 VARCHAR 50 非空
sex 性别 CHAR 2
bornDate 出生日期 DATETIME

需求说明:

在test数据库中创建person表
将表名修改为tb_person
删除出生日期字段
添加出生日期字段,数据类型为DATE类型
修改序号字段名(number)为id,类型为BIGINT类型
(2)添加成绩表主外键

result表需要添加的内容

主键约束:学号、课程编号和日期构成组合主键
外键约束:主表student和从表result通过studentNo字段建立主外键关联

二、DML语句(增删改)

1、插入单条数据记录

语法:

INSERT INTO 表名 [(字段名列表)] VALUES (值列表);

注意:

字段名是可选的,如省略则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填

示例:

INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES('123','黄小平',1,'13956799999','1996-5-8');

2、插入多条数据记录

语法:

INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);

示例:

INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);

经验:

为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!

3、将查询结果插入新表

(1)事先创建新表且与插入数据字段相符
INSERT INTO 新表(字段1,字段2……) 
SELECT字段1,字段2……
FROM 原表;
(2)无需事先创建新表
CREATE TABLE 新表(
SELECT 字段1,字段2……
FROM 原表);

(3)练习

编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中。

CREATE TABLE `phoneList`(
    SELECT `studentName`,`phone`
    FROM `student`);

注意:

如新表已存在,将会报错!

4、更新数据记录

语法:

UPDATE 表名 
SET 字段1=值1,字段2=值2,…,字段n=值n 
[WHERE 条件];

5、删除数据记录

语法:

DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE 表名;

注意:

TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快

6、小结

MySQL中如何使用一条INSERT语句插入多条数据?
MySQL中将查询结果集插入新表的两种方式是什么?两者的区别是什么?
删除数据时使用DELETE和TRUNCATE的区别是什么?

三、DQL语句(查询)

1、通用查询

语法:

SELECT  <字段名列表>
FROM  <表名或视图>
[WHERE  <查询条件>]
[GROUP BY <分组的字段名>]
[HAVING <条件>]
[ORDER BY <排序的字段名> [ASC 或 DESC]]

示例:

SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate` 
FROM `student`
WHERE `gradeId` = 1
ORDER BY studentNo;

2、LIMIT子句

MySQL查询语句中使用LIMIT子句限制结果集。

语法:

SELECT  <字段名列表>
FROM  <表名或视图>
[WHERE  <查询条件>]
[GROUP BY <分组的字段名>]
[ORDER BY  <排序的列名> [ASC 或 DESC]]
[LIMIT [位置偏移量, ]行数];

示例:

SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate` 
FROM `student`
WHERE `gradeId` = 1
ORDER BY studentNo
LIMIT 4,4  
#从第5条开始显示4条

注意:

使用LIMIT子句时,注意第1条记录的位置是0!

3、常用函数

(1)聚合函数
函数名 作用
count() 返回某字段的行数
avg() 返回某字段的平均值
max() 返回某字段的最大值
min() 返回某字段的最小值
sum() 返回某字段的和
(2)字符串函数
函数名 作用 示例
LENGTH(str) 计算字符串长度 SELECT LENGTH(‘date’);
CONCAT(str1,str2,…) 字符串合并 select CONCAT(‘a’,‘b’,‘c’)
INSERT(str,pos,len,newstr) 字符串替换 select INSERT(‘old string’,1,3,‘letter’)
LOWER(str) 将字符串转换为小写 select LOWER(‘A’)
UPPER(str) 将字符串转换为大写 select UPPER(‘a’)
LEFT(s,n) 返回字符串 s 开始的最左边 n 个字符 SELECT LEFT(‘hello’,2);
RIGHT(s,n) 返回字符串 s 开始的最右边 n 个字符 SELECT RIGHT(‘hello word!’,5);
LPAD(s1,len,s2) 返回字符串 s1 ,其左边由字符串 s2填充到 len 字符长度,如果 s1 的长度大于 len ,则返回值被缩短至 len 长度 SELECT RPAD(‘hello’,4,’?’);
RPAD(s1,len,s2) 返回字符串 s1 ,其右边由字符串 s2 填充到 len 字符长度,如果 s1 的长度大于 len ,则返回值被缩短至 len 长度 SELECT RPAD(‘hello’,10,’?’);
LTRIM(s) 用于删除字符串 s 左侧的空格 SELECT LTRIM(’ book ');
RTRIM(s) 用于删除字符串 s 右侧的空格 SELECT RTRIM(’ book ');
TRIM(s) 用于删除字符串 s 两侧的空格 SELECT TRIM(’ book ');
TRIM(s1 FROM s) 删除指定字符串的函数 SELECT TRIM(‘xy’ FROM ‘xyxyabcxy’);
REPEAT(s,n) 用于重复字符串 s ,n 表示重复多少次 SELECT REPEAT(‘mysql’,3);
SPACE(n) 用于返回 n 个空格 SELECT SPACE(20);
REPLACE(s,s1,s2) 使用字符串 s2 替换字符串 s 中所有的字符串 s1 SELECT REPLACE(‘xxx.mysql.com’, ‘x’, ‘w’);
STRCMP(s1,s2) 用于比较字符串 s1 和 s2 的大小,若所有字符串相同则返回 0 ,若第一个字符串大于第二个字符串则返回 1 ,若第一个字符串小于第二个字符串则返回 -1 SELECT STRCMP(‘txt’, ‘txt2’), STRCMP(‘txt’, ‘txt’);
SUBSTRING(str,num,len) 获取指定位置的子字符串 select SUBSTRING(‘JavaMysqlOracle’,5,5);
MID(s,n,len) 用于获取指定位置的子字符串 SELECT MID(‘breakfast’,5);
LOCATE(str1,str) 返回字符串 str1 在字符串 str 中的开始位置 SELECT LOCATE(‘ball’, ‘football’);
POSITION(str1 IN str) 返回字符串 str1 在字符串 str 中的开始位置 SELECT POSITION(‘ball’ IN ‘football’);
INSTR(str, str1) 返回子字符串 str1 在字符串 str 中的开始位置 SELECT INSTR(‘football’, ‘ball’);
REVERSE(s) 将字符串 s 反转 SELECT REVERSE(‘abcd’);
ELT(n, s1, s2, s3, …) 返回第 n 个字符串,如果 n超出范围则返回 NULL SELECT ELT(3, ‘a’, ‘b’, ‘c’, ‘d’);
FIELD(s, s1, s2, …) 返回字符串 s 在列表 s1, s2, … 中的位置,如果不存在字符串 s 则返回 0 ,如果字符串 s 是 NULL 也返回 0 SELECT FIELD(‘hi’, ‘hihi’, ‘hey’, ‘hi’, ‘bas’);
FIND_IN_SET(s1, s2) 返回字符串 s1 在字符串列表 s2中的位置 SELECT FIND_IN_SET(‘hi’, ‘hihi,hey,hi,bas’);
(3)时间日期函数
函数名 作用 示例
CURDATE() 获取当前日期 select CURDATE();
CURTIME() 获取当前时间 select CURTIME();
CURRENT_TIMESTAMP() 、
.LOCALTIME() 、NOW() 、SYSDATE()
CURRENT_TIMESTAMP()
获取当前日期和时间 select NOW();
UNIX_TIMESTAMP() 获取 UNIX 格式的时间戳 SELECT UNIX_TIMESTAMP();
FROM_UNIXTIME() 将 UNIX 格式的时间戳转换为普通格式的时间 SELECT FROM_UNIXTIME(‘1495542689’);
UTC_DATE() UTC_DATE() 获取当前 UTC (世界标准时间) 日期值 SELECT UTC_DATE();
UTC_TIME() UTC_TIME() 获取当前 UTC (世界标准时间) 时间值 SELECT UTC_TIME();
YEAR(date) 返回日期date的年份 select YEAR(NOW());
QUARTER(date) 返回日期date为一年中第几季度 select QUARTER(NOW());
MONTH(date) 返回日期date的月份 select MONTH(NOW());
WEEK(date) 返回日期date为一年中第几周 select WEEK(NOW());
DAY(date) 返回日期date的日期 select DAY(NOW());
DAYOFYEAR(date) 返回 date 是一年中的第几天,一年有 365 天 SELECT DAYOFYEAR(‘2017-05-23’);
DAYOFMONTH(date) 计算 date 是一个月中的第几天 SELECT DAYOFMONTH(‘2017-05-23’);
HOUR(time) 返回日期date的小时 select HOUR(NOW());
MINUTE(time) 返回日期date的分钟 select MINUTE(NOW());
SECOND(time) 返回日期date的秒 select SECOND(NOW());
TIME_TO_SEC(time) 将 time 转换为秒钟,公式为 " 小时3600 + 分钟60 + 秒 " SELECT TIME_TO_SEC(‘23:23:00’);
SEC_TO_TIME(time) 将秒值转换为时间格式 SELECT SEC_TO_TIME(‘84180’);
DATEDIFF(date1,date2) 返回日期date的date1和date2间隔的天数 select DATEDIFF(NOW(),‘2020-06-07’);
ADDDATE(date,n) 计算日期date加上n天以后在日期 select ADDDATE(NOW(),3);
DATE_FORMAT(date, format) 格式化日期,即根据 format 指定的格式显示 date 值 SELECT DATE_FORMAT(‘1997-10-04 22:23:00’, ‘%W %M %Y’);
TIME_FORMAT(time, format) 格式化时间,即根据 format 指定的格式显示 time 值 SELECT TIME_FORMAT(‘16:00:00’, ‘%H %k %I’);
GET_FORMAT() 指定值类型和格式化类型,然后会显示成格式字符串 SELECT DATE_FORMAT(‘2000-10-05 22:23:00’, GET_FORMAT(DATE,‘USA’));

参考内容:

%d该月日期,数字形式(00..31) 
%e该月日期,数字形式(0..31) 
%f微秒(000000...999999) 
%H以2位数表示24小时(00..23) 
%h,%I 以2位数表示12小时(01..12) 
%i分钟,数字形式(00-59) 
%j一年中的天数(001-366) 
%k以24小时(0-23) 
%l以12小时(0..12) 
%M月份名称(january..December) 
%m月份数字形式(00..12) 
%p上午(AM)或下午(PM) 
%r时间,12小时制(小时hh:分钟mm:秒钟ss后面加AM或PM)
%S,%s以2位数形式表示秒(00..59) 
%T时间,24小时制(小时hh:分钟mm:秒数ss) 
%U周(00..53),其中周日为每周的第一天 
%u周(00..53),其中周一为每周的第一天 
%V周(01..53),其中周日为每周的第一天,和%X一起使用 
%v周(01..53),其中周一为每周的第一天,和%x一起使用 
%W工作日名称(周日..周六)
%w一周中的每日(0=周日..6=周六) 
%X该周的年份,其中周日为每周的第一天;数字形式4位数,和%V同时使用 
%x该周的年份,其中周一为每周的第一天;数字形式4位数,和%v同时使用 
%Y4位数形式表示年份 
%y2位数形式表示年份 
%% “%”文字字符
(4)数学函数
函数名 作用 示例
ABS(x) 绝对值函数 SELECT ABS(-2);
PI() 返回圆周率的函数 SELECT PI();
SQRT(x) 平方根函数,返回非负数二次方根 SELECT SQRT(9);
CEIL(x) 向上取整 SELECT CEIL(2.1);
FLOOR(x) 向下取整 SELECT FLOOR(2.5);
RAND(x) 返回一个随机浮点值,范围在 0 ~ 1 之间 SELECT RAND();
ROUND(x) 对x进行四舍五入 SELECT ROUND(-1.34);
ROUND(x,y) 对x进行四舍五入,并且保留小数点后y位 SELECT ROUND(1.37,1);
TRUNCATE(x,y) 对x进行截取,结果保留小数点后y位 SELECT TRUNCATE(1.31,1);
POW(x,y) 返回 x 的 y 次方的结果 SELECT POW(2,4);
(5)系统信息函数
函数名 作用 示例
VERSION() 获取 MySQL 版本号 SELECT VERSION();
CHARSET(str) 查看字符串 str 的字符集 SELECT CHARSET(‘abc’);
COLLATION(str) 查看字符串 str 的字符排列方式 SELECT COLLATION(‘abc’);
LAST_INSERT_ID() 获取最后一个自动生成的ID 值 SELECT LAST_INSERT_ID();
USER() 、
CURRENT_USER() 、
SYSTEM_USER()
返回当前登录的用户及主机名 SELECT USER();
SELECT CURRENT_USER();
SELECT SYSTEM_USER();
CONNECTION_ID() 查看当前用户的连接数的ID SELECT CONNECTION_ID();
DATABASE()、SCHEMA() 查看当前使用的数据库 SELECT DATABASE();
SELECT SCHEMA();
SHOW PROCESSLIST 查看当前用户的连接信息 SHOW PROCESSLIST;

CONNECTION_ID()函数的参数

1. Id :用户登录 MySQL 时,系统分配的连接 id
2. User :当前连接的用户
3. Host :显示这个语句是从哪个 IP 的哪个端口上发出的,可以用来追踪出现问题语句的用户
4. db :显示这个进程目前连接的是哪个数据库
5. Command :显示当前连接执行的命令,一般取值为休眠(Sleep)、查询(Query)、连接(Connect)
6. Time :显示这个状态持续的时间,单位是秒
7. State :显示使用当前连接的 SQL 语句的状态
8. Info :显示这个 SQL 语句
(6)条件判断函数
函数 作用 示例
IF() IF(expr, v1, v2) 如果表达式 expr 为 TRUE ,则返回值为 v1 ,否则返回 v2 SELECT IF(1>2, 2, 3);
IFNULL() IFNULL(v1, v2) 如果 v1 不为 NULL ,则返回值为 v1 ;如果 v1 为 NULL ,则返回值为 v2 SELECT IFNULL(1,2), IFNULL(NULL,10);
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END 如果 expr 等于某个 vn,则返回对应位置 THEN 后面的结果,如果与所有值都不相等,则返回 ELSE 后面的 rn SELECT CASE 2 WHEN 1 THEN ‘one’ WHEN 2 THEN ‘two’ ELSE ‘more’ END;
(7)加密/解密函数
函数 作用 示例
PASSWORD(str) 从明文密码 str 计算并返回加密后的密码字符串,当参数为 NULL 时,返回 NULL SELECT PASSWORD(‘newpwd’);
MD5(str) 为字符串 str 算出一个 MD5 128 比特校验值 SELECT MD5(‘newpwd’);
ENCODE(str, pswd_str) 使用 pswd_str 作为密码,加密 str SELECT ENCODE(‘secret’, ‘newpwd’);
DECODE(crypt_str, pswd_str) 使用 pswd_str 作为密码,解密加密字符串 crypt_str SELECT DECODE(ENCODE(‘secret’,‘cry’), ‘cry’);
(8)其它函数
函数 作用 示例
FORMAT(x, n) 将数字 x 格式化,并以四舍五入的方式保留小数点后 n 位,结果以字符串的形式返回 SELECT FORMAT(1.23456, 4);
CONV() 不同进制数之间的转换 SELECT CONV(‘a’,16,2), # 将16进制的a转换为2进制
SELECT CONV(15,10,2), # 将10进制的15转换为2进制
SELECT CONV(15,10,8), # 将10进制的15转换为8进制
SELECT CONV(15,10,16); # 将10进制的15转换为16进制
INET_ATON(expr) 将网络地址转换为一个代表该地址数值的整数 SELECT INET_ATON(‘192.168.1.1’);
GET_LOCK(str, timeout) 使用字符串 str 来得到一个锁,持续时间 timeout 秒
1. 若成功得到锁,则返回 1
2. 若操作超时,则返回 0
3. 若发生错误,则返回 NULL
SELECT GET_LOCK(‘lock1’, 10);
RELEASE_LOCAK(str) 用于解开被 GET_LOCK() 获取的,用字符串 str 所命名的锁
1. 若锁被解开,则返回 1
2. 若该线程尚未创建锁,则返回 0
3. 若命名的锁不存在,则返回 NULL
4. 若该锁从未被 GET_LOCK() 的调用获取,或锁已经被提前解开,则该锁不存在
SELECT RELEASE_LOCK(‘lock1’);
IS_FREE_LOCK(str) 检查名为 str 的锁是否可以使用
1. 若锁可以使用,则返回 1
2. 若锁正在被使用,则返回 0
3. 若出现错误,则返回 NULL
SELECT IS_FREE_LOCK(‘lock1’);
IS_USED_LOCK(str) 检查名为 str 的锁是否正在被使用,若被*,则返回使用该锁的客户端的连接标识
符,否则返回 NULL
SELECT IS_USED_LOCK(‘lock1’);
BENCHMARK(count, expr) 用于重复 count 次执行表达式 expr
1. 可以用于计算 MySQL 处理表达式的速度
2. 可以在 MySQL 客户端内部报告语句执行的时间
SELECT PASSWORD(‘newpwd’);
SELECT BENCHMARK( 500000, PASSWORD(‘newpwd’) );
CONVERT(… USING …) 用于改变字符串的默认字符集
默认是utf8字符集
SELECT CHARSET(‘abc’);
SELECT CHARSET(CONVERT(‘abc’ USING latin1));
CONVERT(x, type) 将一个数据类型的值转换为另一个数据类型的值 SELECT CONVERT(100, CHAR(2));

4、运算符

(1)算术运算符
运算符 作用 示例
+ 加法 select 1+2;
- 减法 select 1-2;
* 乘法 select 2*5;
/或DIV 除法 select 9/3; 或 select 9 DIV 3;
%或MOD 取余 select 9%2; 或 select 9 MOD 2;
(2)比较运算符

SELECT 语句中的条件语句经常要使用比较运算符。

通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。

符号 描述 备注
= 等于
<>, != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间
IN 在集合中
NOT IN 不在集合中
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配
REGEXP 或 RLIKE 正则式匹配
IS NULL 为空
IS NOT NULL 不为空
1)等于
mysql> select 2=3;
+-----+
| 2=3 |
+-----+
|   0 |
+-----+


mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+
2)不等于
mysql> select 2<>3;
+------+
| 2<>3 |
+------+
|    1 |
+------+
3)安全等于

= 的区别在于当两个操作码均为 NULL 时,其所得值为 1 而不为 NULL,而当一个操作码为 NULL 时,其所得值为 0而不为 NULL。

mysql> select 2<=>3;
+-------+
| 2<=>3 |
+-------+
|     0 |
+-------+


mysql> select null=null;
+-----------+
| null=null |
+-----------+
|      NULL |
+-----------+

        
mysql> select null<=>null;
+-------------+
| null<=>null |
+-------------+
|           1 |
+-------------+
4)小于
mysql> select 2<3;
+-----+
| 2<3 |
+-----+
|   1 |
+-----+
5)小于等于
mysql> select 2<=3;
+------+
| 2<=3 |
+------+
|    1 |
+------+
6)大于
mysql> select 2>3;
+-----+
| 2>3 |
+-----+
|   0 |
+-----+
7)大于等于
mysql> select 2>=3;
+------+
| 2>=3 |
+------+
|    0 |
+------+
8)BETWEEN
mysql> select 5 between 1 and 10;
+--------------------+
| 5 between 1 and 10 |
+--------------------+
|                  1 |
+--------------------+
9)IN
mysql> select 5 in (1,2,3,4,5);
+------------------+
| 5 in (1,2,3,4,5) |
+------------------+
|                1 |
+------------------+
10)NOT IN
mysql> select 5 not in (1,2,3,4,5);
+----------------------+
| 5 not in (1,2,3,4,5) |
+----------------------+
|                    0 |
+----------------------+
11)IS NULL
mysql> select null is NULL;
+--------------+
| null is NULL |
+--------------+
|            1 |
+--------------+

mysql> select 'a' is NULL;
+-------------+
| 'a' is NULL |
+-------------+
|           0 |
+-------------+
12)IS NOT NULL
mysql> select null IS NOT NULL;
+------------------+
| null IS NOT NULL |
+------------------+
|                0 |
+------------------+

        
mysql> select 'a' IS NOT NULL;
+-----------------+
| 'a' IS NOT NULL |
+-----------------+
|               1 |
+-----------------+
13、LIKE
mysql> select '12345' like '12%';
+--------------------+
| '12345' like '12%' |
+--------------------+
|                  1 |
+--------------------+

mysql> select '12345' like '12_';
+--------------------+
| '12345' like '12_' |
+--------------------+
|                  0 |
+--------------------+
14、REGEXP
mysql> select 'beijing' REGEXP 'jing';
+-------------------------+
| 'beijing' REGEXP 'jing' |
+-------------------------+
|                       1 |
+-------------------------+

mysql> select 'beijing' REGEXP 'xi';
+-----------------------+
| 'beijing' REGEXP 'xi' |
+-----------------------+
|                     0 |
+-----------------------+
(3)逻辑运算符

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

运算符号 作用
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或
1)与
mysql> select 2 and 0;
+---------+
| 2 and 0 |
+---------+
|       0 |
+---------+

        
mysql> select 2 and 1;   
+---------+     
| 2 and 1 |      
+---------+      
|       1 |      
+---------+
2)或
mysql> select 2 or 0;
+--------+
| 2 or 0 |
+--------+
|      1 |
+--------+

mysql> select 2 or 1;
+--------+
| 2 or 1 |
+--------+
|      1 |
+--------+

mysql> select 0 or 0;
+--------+
| 0 or 0 |
+--------+
|      0 |
+--------+

mysql> select 1 || 0;
+--------+
| 1 || 0 |
+--------+
|      1 |
+--------+
3)非
mysql> select not 1;
+-------+
| not 1 |
+-------+
|     0 |
+-------+

mysql> select !0;
+----+
| !0 |
+----+
|  1 |
+----+
4)异或

当任意一个操作数为NULL时,返回值为NULL,对于非NULL的操作数,如果两个的逻辑真假值相异,则返回结果为1,否则为0。

mysql> select 1 xor 1;
+---------+
| 1 xor 1 |
+---------+
|       0 |
+---------+

mysql> select 0 xor 0;
+---------+
| 0 xor 0 |
+---------+
|       0 |
+---------+

mysql> select 1 xor 0;
+---------+
| 1 xor 0 |
+---------+
|       1 |
+---------+

mysql> select null or 1;
+-----------+
| null or 1 |
+-----------+
|         1 |
+-----------+

mysql> select 1 ^ 0;
+-------+
| 1 ^ 0 |
+-------+
|     1 |
+-------+
(4)位运算符

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

运算符号 作用
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>> 右移
1)按位与

对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0。

mysql> select 3&5;
+-----+
| 3&5 |
+-----+
|   1 |
+-----+
2)按位或

对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0。

mysql> SELECT 10 | 15 , 9 | 4 | 2 ;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 | # 10的二进制为1010,15的二进制为1111,按位或运算之后结果为
1111,即15
+---------+-----------+ # 9的二进制为1001,4为0100,2的二进制为0010,按位或运算之后
1111
| 15 | 15 |
+---------+-----------+
3)按位异或

对应的二进制位不相同时,结果为 1,否则为 0。

mysql> select 3^5;
+-----+
| 3^5 |
+-----+
|   6 |
+-----+
4)按位取反

将对应的二进制数逐位反转,即 1 取反后变 0 ,0 取反后变 1。

mysql> select ~18446744073709551612;
+-----------------------+
| ~18446744073709551612 |
+-----------------------+
|                     3 |
+-----------------------+
5)按位右移

使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出
并丢弃,左边高位空出的职位用 0 补齐。

mysql> select 3>>1;
+------+
| 3>>1 |
+------+
|    1 |
+------+
6)按位左移

使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出
并丢弃,右边低位空出的位置用 0 补齐。

mysql> select 3<<1;
+------+
| 3<<1 |
+------+
|    6 |
+------+
(5)运算符优先级

最低优先级为: :=
荐
                                                        MySQL高级查询
最高优先级为: !BINARYCOLLATE

本文地址:https://blog.csdn.net/weixin_45636702/article/details/107288294