本章将介绍如何修改表结构和数据的增删改查,以及mysql中常用的函数和运算符的使用方法。
语法:
# 修改表名
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;
语法:
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`);
语法:
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`);
阅读以下代码,哪些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语句都可以实现修改表。
字段名称 | 字段说明 | 数据类型 | 长度 | 属性 |
---|---|---|---|---|
number | 序号 | INT | 4 | 自增列 |
name | 姓名 | VARCHAR | 50 | 非空 |
sex | 性别 | CHAR | 2 | |
bornDate | 出生日期 | DATETIME |
需求说明:
在test数据库中创建person表
将表名修改为tb_person
删除出生日期字段
添加出生日期字段,数据类型为DATE类型
修改序号字段名(number)为id,类型为BIGINT类型
result表需要添加的内容
主键约束:学号、课程编号和日期构成组合主键
外键约束:主表student和从表result通过studentNo字段建立主外键关联
语法:
INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
注意:
字段名是可选的,如省略则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填
示例:
INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES('123','黄小平',1,'13956799999','1996-5-8');
语法:
INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);
示例:
INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
经验:
为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
INSERT INTO 新表(字段1,字段2……)
SELECT字段1,字段2……
FROM 原表;
CREATE TABLE 新表(
SELECT 字段1,字段2……
FROM 原表);
(3)练习
编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中。
CREATE TABLE `phoneList`(
SELECT `studentName`,`phone`
FROM `student`);
注意:
如新表已存在,将会报错!
语法:
UPDATE 表名
SET 字段1=值1,字段2=值2,…,字段n=值n
[WHERE 条件];
语法:
DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE 表名;
注意:
TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快
MySQL中如何使用一条INSERT语句插入多条数据?
MySQL中将查询结果集插入新表的两种方式是什么?两者的区别是什么?
删除数据时使用DELETE和TRUNCATE的区别是什么?
语法:
SELECT <字段名列表>
FROM <表名或视图>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>]
[HAVING <条件>]
[ORDER BY <排序的字段名> [ASC 或 DESC]]
示例:
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY studentNo;
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!
函数名 | 作用 |
---|---|
count() | 返回某字段的行数 |
avg() | 返回某字段的平均值 |
max() | 返回某字段的最大值 |
min() | 返回某字段的最小值 |
sum() | 返回某字段的和 |
函数名 | 作用 | 示例 |
---|---|---|
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’); |
函数名 | 作用 | 示例 |
---|---|---|
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位数形式表示年份
%% “%”文字字符
函数名 | 作用 | 示例 |
---|---|---|
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); |
函数名 | 作用 | 示例 |
---|---|---|
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 语句
函数 | 作用 | 示例 |
---|---|---|
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; |
函数 | 作用 | 示例 |
---|---|---|
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’); |
函数 | 作用 | 示例 |
---|---|---|
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)); |
运算符 | 作用 | 示例 |
---|---|---|
+ | 加法 | 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; |
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 | 不为空 |
mysql> select 2=3;
+-----+
| 2=3 |
+-----+
| 0 |
+-----+
mysql> select NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
| NULL |
+-------------+
mysql> select 2<>3;
+------+
| 2<>3 |
+------+
| 1 |
+------+
与 = 的区别在于当两个操作码均为 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 |
+-------------+
mysql> select 2<3;
+-----+
| 2<3 |
+-----+
| 1 |
+-----+
mysql> select 2<=3;
+------+
| 2<=3 |
+------+
| 1 |
+------+
mysql> select 2>3;
+-----+
| 2>3 |
+-----+
| 0 |
+-----+
mysql> select 2>=3;
+------+
| 2>=3 |
+------+
| 0 |
+------+
mysql> select 5 between 1 and 10;
+--------------------+
| 5 between 1 and 10 |
+--------------------+
| 1 |
+--------------------+
mysql> select 5 in (1,2,3,4,5);
+------------------+
| 5 in (1,2,3,4,5) |
+------------------+
| 1 |
+------------------+
mysql> select 5 not in (1,2,3,4,5);
+----------------------+
| 5 not in (1,2,3,4,5) |
+----------------------+
| 0 |
+----------------------+
mysql> select null is NULL;
+--------------+
| null is NULL |
+--------------+
| 1 |
+--------------+
mysql> select 'a' is NULL;
+-------------+
| 'a' is NULL |
+-------------+
| 0 |
+-------------+
mysql> select null IS NOT NULL;
+------------------+
| null IS NOT NULL |
+------------------+
| 0 |
+------------------+
mysql> select 'a' IS NOT NULL;
+-----------------+
| 'a' IS NOT NULL |
+-----------------+
| 1 |
+-----------------+
mysql> select '12345' like '12%';
+--------------------+
| '12345' like '12%' |
+--------------------+
| 1 |
+--------------------+
mysql> select '12345' like '12_';
+--------------------+
| '12345' like '12_' |
+--------------------+
| 0 |
+--------------------+
mysql> select 'beijing' REGEXP 'jing';
+-------------------------+
| 'beijing' REGEXP 'jing' |
+-------------------------+
| 1 |
+-------------------------+
mysql> select 'beijing' REGEXP 'xi';
+-----------------------+
| 'beijing' REGEXP 'xi' |
+-----------------------+
| 0 |
+-----------------------+
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。
运算符号 | 作用 |
---|---|
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
mysql> select 2 and 0;
+---------+
| 2 and 0 |
+---------+
| 0 |
+---------+
mysql> select 2 and 1;
+---------+
| 2 and 1 |
+---------+
| 1 |
+---------+
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 |
+--------+
mysql> select not 1;
+-------+
| not 1 |
+-------+
| 0 |
+-------+
mysql> select !0;
+----+
| !0 |
+----+
| 1 |
+----+
当任意一个操作数为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 |
+-------+
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
运算符号 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
>> | 右移 |
对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0。
mysql> select 3&5;
+-----+
| 3&5 |
+-----+
| 1 |
+-----+
对应的二进制位有一个或两个为 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 |
+---------+-----------+
对应的二进制位不相同时,结果为 1,否则为 0。
mysql> select 3^5;
+-----+
| 3^5 |
+-----+
| 6 |
+-----+
将对应的二进制数逐位反转,即 1 取反后变 0 ,0 取反后变 1。
mysql> select ~18446744073709551612;
+-----------------------+
| ~18446744073709551612 |
+-----------------------+
| 3 |
+-----------------------+
使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出
并丢弃,左边高位空出的职位用 0 补齐。
mysql> select 3>>1;
+------+
| 3>>1 |
+------+
| 1 |
+------+
使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出
并丢弃,右边低位空出的位置用 0 补齐。
mysql> select 3<<1;
+------+
| 3<<1 |
+------+
| 6 |
+------+