MySQL高级查询

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高级查询_第1张图片
最高优先级为: !BINARYCOLLATE

你可能感兴趣的:(MySQL)