文章目录
- 一 正则表达式
- 二、运算符
- 2.1 算数运算
- 实验
- 2.2比较运算符
- ASCII码
- 不等于(!=或<>)
- 大于、大于等于、小于、小于等于
- 两者之间(between,and)
- 四.逻辑运算符
- 4.1 逻辑非(NOT或!)
- 4.2 优先级问题
- 五.位运算符
- 5.1按位与运算(&)
- 5.2 按位或运算(|)
- 5.3按位异或运算(^)
- 5.4 按位取反(~)
- 六.连接查询
- 实验准备:
- (1)创建表并插入数据
- (2)内连接
- (3)左连接
- (3)右连接
- 总结
一 正则表达式
Mysql 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串
Mysql的正则表达式使用REGEXP 这个关键字来指定正则表达式的匹配模式
匹配 | 描述 |
^ | 匹配文本的开始字符 |
$ | 匹配文本的结束字符 |
· | 匹配任何单个字符 |
* | 匹配零个或多个在它前面的字符 |
+ | 匹配前面的字符1 次或多次 |
字符串 | 匹配包含指定的字符串 |
p1/p2 | 匹配 p1 或p2 |
[…] | 匹配字符集合中的任意一个字符 |
[^…] | 匹配不在括号中的任何字符 |
{n } | 匹配前面的字符串 |
{ n , rm } | 匹配前面的字符串至少n次,至多m次 |
- 以特定字符串开头的记录’^li’
select id,name from info where name regexp '^li';
或
select id,name from info where name regexp 'l';
- 以特定字符串结尾的记录’n$’
select id,name from info where name regexp 'n$';
- 匹配任意多个字符
select id, name from info where name regexp 'a*';
- 匹配任意单个字符"."
select id,name from info where name regexp 'l..i';
- ** 匹配前面字符一次或者多次"+"**
select id,name from info where name regexp 'li+';
- 字符串’is’
select id,name from info where name regexp 'is';
- 匹配关系p1|P2
select id,name from info where name regexp 'li|zh';
- 匹配字符集中任意一个[…]
select id,name from info where name regexp '[i,g]';
- 匹配不在括号在内的任何字符’[^lisi]
select id,name from info where name regexp'[^lisi]';
- 匹配前面连续字符串n次{n}
连续的
select id,name from info where name regexp 'i{1}';
- 匹配前面的字符串至少n次,最多m次{n,m}
select id,name from info where name regexp 'i{1,3}';
二、运算符
2.1 算数运算
mysql的运算符用于记录中的字段值进行运算,mysql的运算符共4种,分别是 算术运算符、比较运算符、逻辑运算符、逻辑运算符和位运算符
在除法运算和求余数运算中,除数不能为0,若除数是0,返回的结果则为null,如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算符没有先后顺序
实验
select 1+2,2-1,2*3,5/3,6%3,4/2;
create table js select 1+2,3-1,2*3,5/3,6%3,4/2;
desc js;
在除法运算和求余数运算中,除数不能为 0,若除数是 0,返回的结果则为 NULL。需 要注意的是,如果有多个运算
符,按照先乘除后加减的优先级进行运算,相同优先级的运算 符没有先后顺序
2.2比较运算符
字符串的比较默认不区分大小写,可使用binary来区分
常用比较运算符(比较对象:数字,字符
)
比较运算符是查询数据记录时经常使用的一类运算符。通过使用比较运算符可以判断出 表中有哪些记录是符合条件的,
如果比较的结果(以布尔值的方式进行返回判断)为真则返回 1,如果为假则返回 0,
比较的结果如果不确定则返回 NULL。其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以
通过 binary关键字来实现
- 等于(=)
是用来判断数字、字符串和表达式是否相等的,如果相等则返回 1,如果不相等则返回 0。如果比较的两者有一个值
是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,如果 ASCII 码相等,则表示两个
字符相同;如果 ASCII 码不相等,则表示两个字符不相同
用来判断数字、字符串和表达式是否相等的,
相等则返回1,
不相等返回0
如果比较的两者有一个值是null,
则比较的结果就是null
- 其中字符的比较是根据ASCII码来判断的
- 如果ASCII码相等,则表示两个字符相同
- 如果ASCII码不相等,则表示两个字符不相同
select 2=4,2=2,2='2';
mysql> select 'e'='e','a'='b';
ASCII码
A:65
a:97
0:48
mysql> select 'a'=null;
不等于(!=或<>)
用于针对数字、字符串和表达式不相等的比较,
如果不相等则返回1,
如果相等则返回0,与等于(=)的返回值相反,同时不等于(!=,<>)无法用于判断是否为null
即:
成立为1
不成立为0
select 'abc'<>'a',1!=2,3!=3;
大于、大于等于、小于、小于等于
即:条件成立:为1
条件不成立:为0
不能用于判断null
判断一个值为/不为null值
IS null 判断一个值示是否为null,如果为null返回1,否则放回0
IS not null 判断一个值是否不为null,如果不为null,返回1,否则返回0
判断是否成立,成立为1
不成立为0
select 2 is null;
select 2 is not null;
两者之间(between,and)
判断一个值是否落在某两个值之间
判断某数字是否在另外两个数字之间
判断某英文字母是否在两个字母之间
即:条件成立返回1
条件不成立返回0
最大值greatest,最小值least
有两个或多个参数时,返回其中最大/最小值
如果一个为null,则返回null
select least(1,2,3);
select greatest('a','b','c');
select greatest('a','b','null');
在不在集合中(in,not,in)
IN 判断一个值是否在对应的列表中,如果是返回1,否则返回0
NOT IN 判断一个值是否不在对应的列表中,如果不再则返回1,否则返回0
即:条件成立为1
条件不成立为0
select 2 in (1,2,3,4);
select 2 not in (1,2,3,4);
select 'a' not in ('a','b','c');
select 'a' in ('a','b','c');
三.通配符匹配
like用来匹配字符串,如果匹配成功则返回1,不成功返回0
like支持两种通配符:
‘%’用于匹配任意数目的字符,
而‘_'只能匹配一个字符
NOT like 正好跟LIKE相反,
如果没有匹配成功则返回1,反之返回0
即:条件成立为1
条件不成立为0
select 'bdqn' like 'bdq_';
select 'bdqn' like 'bd%';
select 'bdqn' not like 'bd%';
四.逻辑运算符
逻辑运算符又称布尔运算符
判断表达式真假
为真返回1
不为真返回0
真和假也可以用true和false表示
逻辑运算符有四种:
NOT或者! | 逻辑非 |
AND或者&& | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
4.1 逻辑非(NOT或!)
逻辑非将跟在他后面的值取反
not后面的操作数为0,值为1
操作数非0,所得值为0
操作数为null 为null
- null为null
- 非0值为0
- 0为1
select not 2;
select ! 0;
select ! null;
4.2 优先级问题
select !1+1,not 1+1;
- 逻辑与(AND或&&)
当所有操作数都为非零值并且不为null值时,返回1
当一个或多个操作数位0时,返回值位0
操作数中有任何一个为null时,返回为null
非0为1
1个或多个0为0
有null返回null
null和0匹配0
select 2 and 3;
select 0 and 3;
select 3 and null;
select 0 and null;
- 逻辑或(OR)
① 非null值(0/非0)的时候:
非0值为1
有0值:(全为0):0
有0值:(不全为0):1
② 有null值得时候:
null 和 非0 :1
null 和 0 :null
null 和 null: null
select 1 or 3;
select 1 or 0;
select 1 or null;
select 0 or null;
select null or null;
③ 逻辑异或(XOR)
- 有1个null 为null
- 非null操作数
- 0和非0为1
0 和 0 为0
非0 和非0为0
select 2 xor 3;
select 0 xor 0;
select 0 xor 1;
select null xor 1;
select null xor null;
五.位运算符
在二进制数上进行计算
会先将操作数变成二进制数,进行位运算
再将运算结果从二进制变回十进制
& | 按位与 |
l | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
5.1按位与运算(&)
对应得二进制位都是1得,
他们的运算结果为1,否则为0
select 10 & 15;
5.2 按位或运算(|)
对应的二进制有一个或两个为1的,
运算结果为1,否则为0
select 10 | 15;
5.3按位异或运算(^)
对应的二进制位不相同,
运算结果位1
否则为0
select 10 ^ 15;
5.4 按位取反(~)
对应的二进制逐位取反,
1取反变0
0取反变1
5换算成2进制 0101
1:0001 取反为:1110
进行按位与运算
select 5 &~1;
六.连接查询
Mysql的连接查询,将来自两个或多个表行结合起来,
基于这些表之间的共同字段,进行数据的拼接。
要确定一个主表作为结果集,
然后将其他表的行有选择性的连接到选定的主表结果集上
实验准备:
(1)创建表并插入数据
CREATE TABLE test1 (a_id int(11) DEFAULT NULL,a_name varchar(32) DEFAULT NULL,a_level int(11) DEFAULT NULL);
insert into test1(a_id, a_name, a_level) values(1, 'aaaa', 10);
insert into test1(a_id, a_name, a_level) values(2, 'bbbb', 20);
insert into test1(a_id, a_name, a_level) values(3, 'cccc', 30);
insert into test1(a_id, a_name, a_level) values(4, 'dddd', 40);
CREATE TABLE test2 (b_id int(11) DEFAULT NULL,b_name varchar(32) DEFAULT NULL,b_level int(11) DEFAULT NULL);
insert into test2(b_id, b_name, b_level) values(2, 'bbbb', 20);
insert into test2(b_id, b_name, b_level) values(3, 'cccc', 30);
insert into test2(b_id, b_name, b_level) values(5, 'eeee', 50);
insert into test2(b_id, b_name, b_level) values(6, 'ffff', 60);
(2)内连接
两张或多张表中同时符合某种条件的数据记录的组合
通常在FROM子句中使用
关键字 INNER JOIN来连接多张表,并使用ON子句设置连接条件
内连接是系统默认的表连接,
所以在FROM子句后可以省略INNER 关键字
即:
两个表一起查询
输出两个表相同的数据
select a.a_id,a.a_name,a.a_level from test1 a inner join test2 b on a.a_id=b.b_id;
(3)左连接
左外连接,在FROM子句中使用 left join或者 left out join 关键字来表示
左连接以左侧表为基础表,接受左表的所有行
并用这些行于右侧参考表中的记录进行匹配
- 即:
- 匹配左表中的所有行及右表中符合条件的行
- 输出左表中 没有在右表中匹配的行用null代替
select * from test1;
select * from test2;
select a.a_id,a_name,a.a_level from test1 a inner join test2 b on a.a_id=b.b_id;
select * from test1 left join test2 on test1.a_name=test2.b_name;
(3)右连接
在FROM 子句中使用right join 或者 right outer join 关键字来表示
右连接于左连接相反
以右表为基础
输出右表所有行,
于左表相同的行进行匹配
即:
右表为主表
输出右表的所有数据
与左表相同的行进行匹配
与右表中没有匹配上的用null代替
select * from test1 right join test2 on test1.a_name=test2.b_name;
总结
涉及到的面试题
select、 order by和
limit`的一一个结合
① mysql数据库如何查询一张表:
(select语法)
② 查询info表中的id和name
(指定字段的查询)
③ 查询info表中socre大于80的怎么查
(select配合where条件过滤的查询)
查询info表中前3行记录怎么查
(select结合limit怎么查询)。info表表中第三行记录的后2行记录怎么看(select 结合limit输出指定行以下的多行内容)
D info表中 怎么查看最后3行的记录
(select结合order by [asc Idesc]排序之后的limit查询)
特别像百度下来的题目.- 内连接、左连和右连
内连接inner join / join
左连: left join
右连: right join - 子查询
条件,写一个子查询
select id, name from info where name in (select name from infos) ;