MySQL
运算符
MySQL
运算符主要包括
3
大类:比较运算符、算术运算符、逻辑运算符
算术运算符
加
+
、减
-
、乘
*
、除
/
、求余
%
特殊操作
mysql>
select
1
+
2
;
+-----+
|
1
+
2
|
+-----+
|
3
|
+-----+
1
row
in set
(
0.00
sec)
mysql>
select
1
/2;
+--------+
|
1
/2 |
+--------+
|
0.5000
|
+--------+
1
row
in set
(
0.00
sec)
mysql>
select
5
%
2
;
+------+
|
5
%
2
|
+------+
|
1
|
+------+
1
row
in set
(
0.00
sec)
mysql>
select
'5a'
+
2
;
+--------+
|
'5a'
+
2
|
+--------+
|
7
|
+--------+
1
row
in set
,
1
warning (
0.00
sec)
mysql>
select
'a5'
+
2
;
+--------+
|
'a5'
+
2
|
+--------+
|
2
|
+--------+
1
row
in set
,
1
warning (
0.00
sec)
mysql>
select
123.45
%
2.52
;
+-------------+
|
123.45
%
2.52
|
运算符
语法
说明
=
a=b
如果参与计算的两个操作数相等则为
true
,否则
false
!=
或者
<>
a!=b
或者
a<>b
如果两个操作数不相等则
true[1]
,否则
false[0]
<
a<b
如果
a
小于
b
则返回
true
,否则
false
>
a>b
如果
a
大于
b
则
true
<=
a<=b
小于等于
>=
a>=b
大于等于
比较运算符
in
或者
not in
in
用于判断某个列的取值是否为指定的值,使用
in
运算符时指定的值是离散的数据,不是连续值
select * from tb_student where age in(18,28,15)
含义是
age=18 or age=28 or age=15
select * from tb_student where age not in(18,28,15)
含义是
age!=18 and age!=28 and
age!=15
查询孙权、黄盖、张三以及李四同学的成绩值
--
查询张三以及李四同学的成绩
select score from tb_student where name='
张三
' or name='
李四
'
select score from tb_stuent where name in('
张三
','
李四
') -- in
中的数据个数没有限制
between/and
用于判断数据是否在指定的范围内,连续值
查询成绩及格并且不属于优秀的所有学生信息
+-------------+
|
2.49
|
+-------------+
1
row
in set
(
0.00
sec)
mysql>
select
-
123.45
%
2.52
;
+--------------+
| -
123.45
%
2.52
|
+--------------+
| -
2.49
|
+--------------+
1
row
in set
(
0.00
sec)
--
写法
1
:使用条件拼接
select
*
from
tb_student
where
score>=
60
and
score<=
85
;
--
写法
2
select
*
from
tb_student
where
score
between
60
and
85
;
--
如果需要的是不在指定范围内部
select
*
from
tb_student
where
score
not between
50
and
85
;
语法
说明
&&
或者
and
a and b
或者
a&&b
逻辑与,如果参与计算的两个操作数为
true
,否则
false
||
或者
or
a or b
或者
a||b
逻辑或,如果参与计算的双反,只要一方为
false
,则返回
false
not
或者
!
not a
或者
!a
逻辑非,如果操作数为
false
则结果为
true
like/not like
主要针对字符串类型数据进行模糊查询,通配符
_
和
%
查询不姓张的同学
regexp
是在
mysql
中针对字符串类型进行正则式进行判断,
not regexp
<=>
如果两数相同为
true
,即使是
null
is null/is not null
判断是否为空,为空则返回
true
逻辑运算符
练习题
样例数据表
查询全体学员的姓名及其出生年份
查询李姓学员的姓名及其出生年份
查询年龄在
18-23
岁之间的学生姓名、系别和年龄
select
*
from
tb_student
where
name
not like
'
张
%'
1
create table
if
not
exists tb_student(
id
bigint
not
null
auto_increment,
name
varchar
(
32
)
not
null
,
age
int
default
16
,
sex
boolean
default
1
,
dept
varchar
(
32
),
primary key(id)
) engine=innodb default charset utf8;
--
插入测试数据
insert into
tb_student
values
(
null
,
'
小胖
'
,
18
,
1
,
'
软工
'
),(
null
,
'
东方
'
,
16
,
0
,
'
机
壳
'
),(
null
,
'
仗义
'
,
19
,
1
,
'
大数据
'
);
select
name,
2022
-age
as
birth_year
from
tb_student;
select
name,
2022
-age
as
birth_year
from
tb_student
where
name
like
'
李
%'
;
1
查询年龄不在
18-23
岁之间的学生姓名、系别和年龄
查询软工、机壳和大数据系的所有学生姓名和性别
查询既不是软工、机壳,也不是大数据系的所有学生姓名和性别
查询张
xx
学生的姓名和年龄
查询名字中有方的学生信息
查询
age
确定的学生信息
注意
=null
或者
!=null
都是错误的,应该使用
is null
或者
is not null
查询性别不确定的学生信息
查询学生所在的系别信息
distinct
自动去除重复值,
all
显示所有数据
查询系别和学生年龄信息
select
name,dept,age
from
tb_student
where
age>=
18
and
age<=
23
--
注意两头相等
select
name,dept,age
from
tb_student
where
age
between
18
and
23
--
小值在前
select
name,dept,age
from
tb_student
where
age
in
(
18
,
23
,
22
,
20
,
21
,
19
)
select
name,dept,age
from
tb_student
where
age<
18
or
age>
23
;
select
name,sex
from
tb_student
where
dept
in
(
'
软工
'
,
'
机壳
'
,
'
大数据
'
);
select
name,sex
from
tb_student
where
dept=
'
软工
'
or
dept=
'
机壳
'
or
dept=
'
大数
据
'
;
select
name,sex
from
tb_student
where
dept
not in
(
'
软工
'
,
'
机壳
'
,
'
大数据
'
);
select
name,sex
from
tb_student
where
dept!=
'
软工
'
and
dept!=
'
机壳
'
and
dept!=
'
大数据
'
;
select
name,age
from
tb_student
where
name
like
'
张
__'
;
select
name,age
from
tb_student
where
name
like
'
张
%'
and
length(name)=
3
;
--
length
针对中文的处理为获取其中所占字节数,不是字符数
select
*
from
tb_student
where
name
like
'%
方
%'
;
select
*
from
tb_student
where
age
is not
null
;
select
*
from
tb_student
where
sex
is
null
;
select
all dept
from
tb_student;
-- all
不会去除重复值,默认
all
select distinct
dept
from
tb_student;
mysql>
select
*
from
tb_student;
+----+--------+------+------+--------+
问题:如果
auto_increment
到达上限时
MySQL
是如何处理的
auto_increment
默认从
1
开始,上限取决于列的数据类型。如果表中
id
列已经有指定的值,则
max(id)+1
如果删除数据后,数据库系统仍旧会记录已经生成过的数据,不会从新开始,而是在以前的基础上继续
加
1
| id | name | age | sex | dept |
+----+--------+------+------+--------+
|
1
|
小胖
|
18
|
1
|
软工
|
|
2
|
东方
|
16
|
0
|
机壳
|
|
3
|
仗义
|
19
|
1
|
大数据
|
|
4
|
张骞
|
16
|
1
|
软工
|
|
5
|
张小骞
|
16
|
1
|
软工
|
+----+--------+------+------+--------+
rows
in set
(
0.00
sec)
试图取消软工
16
这条数据的重复
--
语法错误
mysql>
select distinct
dept,
distinct
age
from
tb_student;
ERROR
1064
(
42000
): You have an error
in
your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near
'distinct age from tb_student'
at line
1
--
正确的写法
select distinct
dept,age
from
tb_student;
create table
t1(
id
int
primary key auto_increment,
name
varchar
(
20
)
);
insert into
t1
values
(
2147483646
,
'zhangsan'
);
insert into
t1(name)
values
(
'lisi'
);
mysql>
select
*
from
t1;
+------------+----------+
| id | name |
+------------+----------+
|
2147483646
| zhangsan |
|
2147483647
| lisi |
+------------+----------+
2
rows
in set
(
0.00
sec)
insert into
t1(name)
values
(
'wangwu'
);
ERROR
1062
(
23000
): Duplicate entry
'2147483647'
for key
'PRIMARY'
--
意思是
再次生成了最大的
int
值
2147483647
作为主键,此时主键冲突
如果需要重新开始生成连续整数,只能将表中所有数据删除
建议:因为
auto_increment
生成数据是从
1
开始,不会出现负整数,所以一般建议使用
bigint unsigned
5
类聚集函数
聚集函数用于对于一个集合中的数据进行处理,不是一行一行的数据
count
统计行数、
sum
求和、
max
最大值、
min
最小值、
avg
平均值
计数
语法
count([all/distinct]
列名称
/*)
获取总学生数
需要统计选修
1
号课程的学生人数
mysql>
delete from
t1
where
name=
'lisi'
;
-- 2147483647
Query OK,
1
row affected (
0.01
sec)
mysql>
select
*
from
t1;
+------------+----------+
| id | name |
+------------+----------+
|
2147483646
| zhangsan |
+------------+----------+
1
row
in set
(
0.00
sec)
mysql>
insert into
t1(name)
values
(
'wangwu'
);
-- 2147483647
Query OK,
1
row affected (
0.00
sec)
truncate
table
t1;
--
删除整表数据,不能使用
delete from
1
select count
(*)
from
tb_student;
select count
(
1
)
from
tb_student;
select count
(
distinct
dept)
from
tb_student;
--
获取系的个数
mysql>
select
*
from
tb_student;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
|
1
|
小胖
|
18
|
1
|
软工
|
|
2
|
东方
|
16
|
0
|
机壳
|
|
3
|
仗义
|
19
|
1
|
大数据
|
|
4
|
张骞
|
16
|
1
|
软工
|
|
5
|
张小骞
|
16
|
1
|
软工
|
|
6
|
从来
|
16
|
1
|
NULL
|
+----+--------+------+------+--------+
6
rows
in set
(
0.00
sec)
select count
(dept)
from
tb_student;
--
进行计数统计时,
null
不参与统计