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序号INT4自增列
name姓名VARCHAR50非空
sex性别CHAR2
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 中所有的字符串 s1SELECT REPLACE(‘xxx.mysql.com’, ‘x’, ‘w’);
STRCMP(s1,s2)用于比较字符串 s1 和 s2 的大小,若所有字符串相同则返回 0 ,若第一个字符串大于第二个字符串则返回 1 ,若第一个字符串小于第二个字符串则返回 -1SELECT 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超出范围则返回 NULLSELECT ELT(3, ‘a’, ‘b’, ‘c’, ‘d’);
FIELD(s, s1, s2, …)返回字符串 s 在列表 s1, s2, … 中的位置,如果不存在字符串 s 则返回 0 ,如果字符串 s 是 NULL 也返回 0SELECT 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()查看当前用户的连接数的IDSELECT 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 ,否则返回 v2SELECT IF(1>2, 2, 3);
IFNULL() IFNULL(v1, v2)如果 v1 不为 NULL ,则返回值为 v1 ;如果 v1 为 NULL ,则返回值为 v2SELECT IFNULL(1,2), IFNULL(NULL,10);
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END如果 expr 等于某个 vn,则返回对应位置 THEN 后面的结果,如果与所有值都不相等,则返回 ELSE 后面的 rnSELECT CASE 2 WHEN 1 THEN ‘one’ WHEN 2 THEN ‘two’ ELSE ‘more’ END;
(7)加密/解密函数
函数作用示例
PASSWORD(str)从明文密码 str 计算并返回加密后的密码字符串,当参数为 NULL 时,返回 NULLSELECT PASSWORD(‘newpwd’);
MD5(str)为字符串 str 算出一个 MD5 128 比特校验值SELECT MD5(‘newpwd’);
ENCODE(str, pswd_str)使用 pswd_str 作为密码,加密 strSELECT ENCODE(‘secret’, ‘newpwd’);
DECODE(crypt_str, pswd_str)使用 pswd_str 作为密码,解密加密字符串 crypt_strSELECT 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)运算符优先级

最低优先级为: :=

最高优先级为: !BINARYCOLLATE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值