MYSQL高级SQL语言

MYSQL高级SQL语言

一、MYSQL常用查询介绍

1.1按关键字排序

■使用ORDER BY语句来实现排序

■排序可针对一个或多个字段

■ASC∶升序,默认排序方式

■ DESC∶降序

■ORDER BY的语法结构

SELECT column1, column2,. FROM table_name ORDER BY column1, column2, ASC|DESC;

1.1.1按单字段排序

示例

查看分数大于70分的人,并将大于七十分的安降序显示

mysql> select*from info;
+----+--------------+-------+----------+
| id | name         | score | address  |
+----+--------------+-------+----------+
|  1 | 王五         | 88.00 | 苏州     |
|  2 | 王二麻子     | 60.00 | 未知     |
|  3 | 张三丰       | 75.50 | 南京     |
|  4 | lisi         | 90.00 | ningxia  |
|  5 | li           | 90.00 | beijing  |
|  6 | zhang        | 90.00 | beihai   |
|  7 | wang         | 90.00 | shanghai |
|  8 | niuer        | 90.00 | jurong   |
|  9 | chuwu        | 90.00 | jurong   |
+----+--------------+-------+----------+
9 rows in set (0.00 sec)

mysql> select name,score from info where score>=70 order by score desc;
+-----------+-------+
| name      | score |
+-----------+-------+
| lisi      | 90.00 |
| li        | 90.00 |
| zhang     | 90.00 |
| wang      | 90.00 |
| niuer     | 90.00 |
| chuwu     | 90.00 |
| 王五      | 88.00 |
| 张三丰    | 75.50 |
+-----------+-------+
8 rows in set (0.00 sec)
1.1.2按多字段排序
  • 主参考字段在前,辅参考字段在后面
  • 在score相同时,id 按降序排序
mysql> select id,name,score from info where score>=70 order by score desc,,id desc;
+----+-----------+-------+
| id | name      | score |
+----+-----------+-------+
|  9 | chuwu     | 90.00 |
|  8 | niuer     | 90.00 |
|  7 | wang      | 90.00 |
|  6 | zhang     | 90.00 |
|  5 | li        | 90.00 |
|  4 | lisi      | 90.00 |
|  1 | 王五      | 88.00 |
|  3 | 张三丰    | 75.50 |
+----+-----------+-------+
8 rows in set (0.00 sec)

1.2对结果进行分组

■使用GROUP BY语句来实现分组通常结合聚合函数一起使用

■可以按一个或多个字段对结果进行分组

■ GROUP BY的语法结构

SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;

1.2.1聚合函数种类

count(*)计数 *=字段名称

sum(*) 求和

avg (*) 平均值

max(*)最大值

min (*)最小值

shell函数

function 函数名(){

命令序列

1.2.2示例统计分数大于70分的人数并分组
mysql> select count(name),score from info where score>=70 group by score; 
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           1 | 75.50 |
|           1 | 88.00 |
|           6 | 90.00 |
+-------------+-------+
3 rows in set (0.00 sec)

平均值分组

mysql> select avg(score) from info ;
+------------+
| avg(score) |
+------------+
|  84.833333 |
+------------+
1 row in set (0.00 sec)

最大分数

mysql> select max(score) from info ;
+------------+
| max(score) |
+------------+
|      90.00 |
+------------+
1 row in set (0.00 s

最小分数

mysql> select min(score) from info ;
±-----------+
| min(score) |
±-----------+
| 60.00 |
±-----------+
1 row in set (0.00 sec)

求和

mysql> select sum(score) from info ;
+------------+
| sum(score) |
+------------+
|     763.50 |
+------------+
1 row in set (0.00 sec)
1.3group by 结合order by

mysql> select count(name),score from info where score >=70 group by score  order by count(name) desc;
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           6 | 90.00 |
|           1 | 88.00 |
|           1 | 75.50 |
+-------------+-------+
3 rows in set (0.00 sec)

1.4限制结果条目

  • limit限制结果条数
  • 不从第一条开始取值,从第1个开始数值为0

示 例查看前三行

mysql> select * from info limit 3;
+----+--------------+-------+---------+
| id | name         | score | address |
+----+--------------+-------+---------+
|  1 | 王五         | 88.00 | 苏州    |
|  2 | 王二麻子     | 60.00 | 未知    |
|  3 | 张三丰       | 75.50 | 南京    |
+----+--------------+-------+---------+
3 rows in set (0.00 sec)

从第三个索引,往下至第三个

mysql> select*from info limit 2,3;
+----+-----------+-------+---------+
| id | name      | score | address |
+----+-----------+-------+---------+
|  3 | 张三丰    | 75.50 | 南京    |
|  4 | lisi      | 90.00 | ningxia |
|  5 | li        | 90.00 | beijing |
+----+-----------+-------+---------+

前三名

mysql> select*from info order by score desc limit 3;
+----+-------+-------+---------+
| id | name  | score | address |
+----+-------+-------+---------+
|  9 | chuwu | 90.00 | jurong  |
|  5 | li    | 90.00 | beijing |
|  6 | zhang | 90.00 | beihai  |
+----+-------+-------+---------+
3 rows in set (0.00 sec)

1.5设置别名

使用AS语句设置别名

关键字AS可省略

设置别名时,保证不能与库中其他表或字段名称冲突

别名的语法结构

字段别名

SELECT column_name AS alias_name FROM table_name;

表别名

SELECT column name(s) FROM table_name AS alias_name;
1.5.1示例

字段的别名

mysql> select count(*) from info ;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*)  as 数量 from info ;
+--------+
| 数量   |
+--------+
|      9 |
+--------+
1 row in set (0.01 sec)

在已存在的表上添加一个字段

mysql> alter table info add column hobby int(3) not null;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select*from info;
+----+--------------+-------+----------+-------+
| id | name         | score | address  | hobby |
+----+--------------+-------+----------+-------+
|  1 | 王五         | 88.00 | 苏州     |     0 |
|  2 | 王二麻子     | 60.00 | 未知     |     0 |
|  3 | 张三丰       | 75.50 | 南京     |     0 |
|  4 | lisi         | 90.00 | ningxia  |     0 |
|  5 | li           | 90.00 | beijing  |     0 |
|  6 | zhang        | 90.00 | beihai   |     0 |
|  7 | wang         | 90.00 | shanghai |     0 |
|  8 | niuer        | 90.00 | jurong   |     0 |
|  9 | chuwu        | 90.00 | jurong   |     0 |
+----+--------------+-------+----------+-------+
9 rows in set (0.00 sec)

更改表数据

mysql> update info set hobby=1 where score>=80;
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7  Changed: 7  Warnings: 0

mysql> select*from info;
+----+--------------+-------+----------+-------+
| id | name         | score | address  | hobby |
+----+--------------+-------+----------+-------+
|  1 | 王五         | 88.00 | 苏州     |     1 |
|  2 | 王二麻子     | 60.00 | 未知     |     0 |
|  3 | 张三丰       | 75.50 | 南京     |     0 |
|  4 | lisi         | 90.00 | ningxia  |     1 |
|  5 | li           | 90.00 | beijing  |     1 |
|  6 | zhang        | 90.00 | beihai   |     1 |
|  7 | wang         | 90.00 | shanghai |     1 |
|  8 | niuer        | 90.00 | jurong   |     1 |
|  9 | chuwu        | 90.00 | jurong   |     1 |
+----+--------------+-------+----------+-------+
9 rows in set (0.00 sec)

创建Hob表

mysql> create table Hob (id int(3) not null primary key auto_increment,hob_name varchar(12) not null);
Query OK, 0 rows affected (0.00 sec)

Hob表添加数据

mysql> insert into Hob (hob_name) values ('看书'),('钓鱼'),('打游戏');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select* from Hob;
+----+-----------+
| id | hob_name  |
+----+-----------+
|  1 | 看书      |
|  2 | 钓鱼      |
|  3 | 打游戏    |
+----+-----------+
mysql> select info.name,Hob.hob_name from info inner join Hob on info.hobby=Hob.id;
+--------------+----------+
| name         | hob_name |
+--------------+----------+
| 王五         | 看书     |
| 王二麻子     | 钓鱼     |
| 张三丰       | 钓鱼     |
| lisi         | 看书     |
| li           | 看书     |
| zhang        | 看书     |
| wang         | 看书     |
| niuer        | 看书     |
| chuwu        | 看书     |
+--------------+----------+
9 rows in set (0.00 sec)

设置表别名

mysql> select i.name,h.hob_name from info as i inner join Hob as h on i.hobby=h.id;
+--------------+----------+
| name         | hob_name |
+--------------+----------+
| 王五         | 看书     |
| 王二麻子     | 钓鱼     |
| 张三丰       | 钓鱼     |
| lisi         | 看书     |
| li           | 看书     |
| zhang        | 看书     |
| wang         | 看书     |
| niuer        | 看书     |
| chuwu        | 看书     |
+--------------+----------+
9 rows in set (0.00 sec)

将别名as 省略,一样可以设置别名

mysql> select i.name,h.hob_name from info  i inner join Hob  h on i.hobby=h.id;
+--------------+----------+
| name         | hob_name |
+--------------+----------+
| 王五         | 看书     |
| 王二麻子     | 钓鱼     |
| 张三丰       | 钓鱼     |
| lisi         | 看书     |
| li           | 看书     |
| zhang        | 看书     |
| wang         | 看书     |
| niuer        | 看书     |
| chuwu        | 看书     |
+--------------+----------+
9 rows in set (0.00 sec)
1.5.2as 作为连接语句

create table tmp as select * from info;

1.6通配符的使用

用于替换字符串中的部分字符

通常配合like一起使用,并协同where完成查询

常用通配符

​ %表示零个、一个、或多个

​ “_“表示单个字符, 多少个”_"代表多少个任意字符

1.6.1通配符%的用法
mysql> select id,name,score from info where name like '%u';
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  9 | chuwu | 90.00 |
+----+-------+-------+
1 row in set (0.01 sec)
1.6.2通配符_的用法
mysql> select id,name,score from info where name like '_huwu';
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  9 | chuwu | 90.00 |
+----+-------+-------+
1 row in set (0.00 sec)
mysql> select id,name,score from info where name like '_h_wu';
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  9 | chuwu | 90.00 |
+----+-------+-------+
1 row in set (0.00 sec)
mysql> select id,name,score from info where name like 'c%';
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  9 | chuwu | 90.00 |
+----+-------+-------+
1 row in set (0.00 sec)
1.6.3通配符%和_结合使用
mysql> select id,name,score from info where name like '_hu%';
+----+-------+-------+
| id | name  | score |
+----+-------+-------+
|  9 | chuwu | 90.00 |
+----+-------+-------+
1 row in set (0.00 sec)

1.7子查询

■也称作内查询或者嵌套查询

■先于主查询被执行,其结果将作为外层主查询的条件

■在增删改查中都可以使用子查询

■支持多层嵌套

■IN语句是用来判断某个值是否在给定的结果集中

1.7.1.1子查询的用法

子查询的用法

mysql> select name,level from player where id in (select id from player where level>=45);mysql> insert into tmp select"from player where id in(select id from player);Query OK,3218 rows affected(0.12 sec)Records:3218 Duplicates:0Warnings:0

mysql> update tmp set level=level-7 where id in(selecta.id from(selectid from tmp where level>=47)a);Query OK, 1 row affected(0.01 sec)Rows matched:1 Changed:1 Warnings:0

mysql> delete from tmp where id in(select a.id from(select id from tmp where level=47)a);Query OK,1 row affected(0.01 sec)

mysql> select id,name,level from tmp where id=(select id from tmp where name='shirley);

mysql> select count(") as number from tmp where EXISTS (select id from tmp where name='shirley);

括号里面的语句先执行,然后where id in (结果),最后select;相当于select查询遍历where in 后面的条件

mysql> select name,score from info where id in(select id from tmp where score>50);
+------------+-------+
| name       | score |
+------------+-------+
| wangwu     | 88.00 |
| wangermazi | 60.00 |
+------------+-------+
2 rows in set (0.00 sec)

select与运算结合用法

mysql> select*from info;
+----+------------+-------+----------+-------+
| id | name       | score | address  | hobby |
+----+------------+-------+----------+-------+
|  1 | wangwu     | 88.00 | 苏州     |     1 |
|  2 | wangermazi | 60.00 | 未知     |     2 |
|  3 | 张三丰     | 75.50 | 南京     |     2 |
|  4 | lisi       | 90.00 | ningxia  |     1 |
|  5 | li         | 90.00 | beijing  |     1 |
|  6 | zhang      | 90.00 | beihai   |     1 |
|  7 | wang       | 90.00 | shanghai |     1 |
|  8 | niuer      | 90.00 | jurong   |     1 |
|  9 | chuwu      | 90.00 | jurong   |     1 |
+----+------------+-------+----------+-------+
9 rows in set (0.00 sec)

mysql> update info set score=score+5 where^C
mysql> update info set score=score+5 where score<70;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select*from info;
+----+------------+-------+----------+-------+
| id | name       | score | address  | hobby |
+----+------------+-------+----------+-------+
|  1 | wangwu     | 88.00 | 苏州     |     1 |
|  2 | wangermazi | 65.00 | 未知     |     2 |
|  3 | 张三丰     | 75.50 | 南京     |     2 |
|  4 | lisi       | 90.00 | ningxia  |     1 |
|  5 | li         | 90.00 | beijing  |     1 |
|  6 | zhang      | 90.00 | beihai   |     1 |
|  7 | wang       | 90.00 | shanghai |     1 |
|  8 | niuer      | 90.00 | jurong   |     1 |
|  9 | chuwu      | 90.00 | jurong   |     1 |
+----+------------+-------+----------+-------+
9 rows in set (0.00 sec)

mysql> update info set score=score+5 where score<70;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

select 乘法运算

mysql> update info set score=score*5 where score<70;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select*from info;
+----+------------+--------+----------+-------+
| id | name       | score  | address  | hobby |
+----+------------+--------+----------+-------+
|  1 | wangwu     |  88.00 | 苏州     |     1 |
|  2 | wangermazi | 325.00 | 未知     |     2 |
|  3 | 张三丰     |  75.50 | 南京     |     2 |
|  4 | lisi       |  90.00 | ningxia  |     1 |
|  5 | li         |  90.00 | beijing  |     1 |
|  6 | zhang      |  90.00 | beihai   |     1 |
|  7 | wang       |  90.00 | shanghai |     1 |
|  8 | niuer      |  90.00 | jurong   |     1 |
|  9 | chuwu      |  90.00 | jurong   |     1 |
+----+------------+--------+----------+-------+
9 rows in set (0.00 sec)

select除法运算

mysql> update info set score=score/5 where score>100;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select*from info;
+----+------------+-------+----------+-------+
| id | name       | score | address  | hobby |
+----+------------+-------+----------+-------+
|  1 | wangwu     | 88.00 | 苏州     |     1 |
|  2 | wangermazi | 65.00 | 未知     |     2 |
|  3 | 张三丰     | 75.50 | 南京     |     2 |
|  4 | lisi       | 90.00 | ningxia  |     1 |
|  5 | li         | 90.00 | beijing  |     1 |
|  6 | zhang      | 90.00 | beihai   |     1 |
|  7 | wang       | 90.00 | shanghai |     1 |
|  8 | niuer      | 90.00 | jurong   |     1 |
|  9 | chuwu      | 90.00 | jurong   |     1 |
+----+------------+-------+----------+-------+
9 rows in set (0.00 sec)

EXIST 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE。

mysql> select count(*) as num from info where exists(select id from info where name='li');
+-----+
| num |
+-----+
|   9 |
+-----+
1 row in set (

0.00 sec)

1.8=<> 都是取反

mysql> select name,score from info where hobby!=1;
+------------+-------+
| name       | score |
+------------+-------+
| wangermazi | 65.00 |
| 张三丰     | 75.50 |
+------------+-------+
2 rows in set (0.00 sec)

mysql> select name,score from info where hobby<>1;
+------------+-------+
| name       | score |
+------------+-------+
| wangermazi | 65.00 |
| 张三丰     | 75.50 |
+------------+-------+
2 rows in set (0.00 sec)

1.9like克隆表结构

mysql> create table copy like info;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| Hob              |
| copy             |
| info             |
| num              |
| shiwu            |
| tmp              |
+------------------+

二、NULL值

■表示缺失的值

■与数字0或者空白(spaces)是不同的

■使用IS NULL或IS NOT NULL进行判断

■NULL值和空值的区别

●空值长度为0,不占空间;NULL值的长度为NULL,占用空间

●ISNULL无法判断空值

● 空值使用"=“或者”>"来处理

●COUNT()计算时,NULL会忽略,空值会加入计算

NULL值和空值的区别

空值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。

IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是空值的。

空值的判断使用=’’或者<>’’来处理。

在通过 count()计算有多少记录数时,如果遇到 NULL 值会自动忽略掉,遇到空值会加入到记录中进行计算。

示例

mysql> insert into num (id,name) values (2,'');
Query OK, 1 row affected (0.01 sec)

mysql> select *from num;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
|  2 |      |
+----+------+
2 rows in set (0.00 sec)


mysql> select *from num;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
|  2 |      |
|  3 | NULL |
+----+------+
3 rows in set (0.00 sec)

null 不纳入计数

+----+------+
| id | name |
+----+------+
|  1 | tom  |
|  2 |      |
|  3 | NULL |
|  4 | NULL |
+----+------+
4 rows in set (0.00 sec)

mysql> select count(name) from num;
+-------------+
| count(name) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

三、正则表达式

MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式

*匹配模式**描述**实例*
^匹配文本的开始字符‘^bd’ 匹配以 bd 开头的字符串
$匹配文本的结束字符‘qn$’ 匹配以 qn 结尾的字符串
.匹配任何单个字符‘s.t’ 匹配任何s 和t 之间有一个字符的字符串
*匹配零个或多个在它前面的字符‘fo*t’ 匹配 t 前面有任意个 o
+匹配前面的字符 1 次或多次‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串匹配包含指定的字符串‘clo’ 匹配含有 clo 的字符串
p1|p2匹配 p1 或 p2‘bg|fg’ 匹配 bg 或者 fg
[…]匹配字符集合中的任意一个字符‘[abc]’ 匹配 a 或者 b 或者 c
[^…]匹配不在括号中的任何字符‘[^ab]’ 匹配不包含 a 或者 b 的字符串
{n}匹配前面的字符串 n 次‘g{2}’ 匹配含有 2 个 g 的字符串
{n,m}匹配前面的字符串至少 n 次,至多m 次‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次

3.1以特定字符串开头的记录

在info表中查询以l开头的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp'^l';
+----+------+-------+
| id | name | score |
+----+------+-------+
|  4 | lisi | 90.00 |
|  5 | li   | 90.00 |
+----+------+-------+
2 rows in set (0.00 sec)

3.2以特定字符串结尾的记录

在info表中查询以u结尾的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp'u$';
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | wangwu | 88.00 |
|  9 | chuwu  | 90.00 |
+----+--------+-------+
2 rows in set (0.00 sec)

3.3包含指定字符串的记录

在info表中查询包含u的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp'u';
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | wangwu | 88.00 |
|  8 | niuer  | 90.00 |
|  9 | chuwu  | 90.00 |
+----+--------+-------+
3 rows in set (0.00 sec)

3.4以“.”代替字符串中的任意一个字符的记录

在info表中查询wan和wu中间有一个字符的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp'wan.wu';
+----+--------+-------+
| id | name   | score |
+----+--------+-------+
|  1 | wangwu | 88.00 |
+----+--------+-------+
1 row in set (0.00 sec)

3.5匹配包含或者关系的记录

在info表中查询包含“wan”或“wu”字符的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp'wan|wu';
+----+------------+-------+
| id | name       | score |
+----+------------+-------+
|  1 | wangwu     | 88.00 |
|  2 | wangermazi | 65.00 |
|  7 | wang       | 90.00 |
|  9 | chuwu      | 90.00 |
+----+------------+-------+
4 rows in set (0.00 sec)

3.6“*”匹配前面字符的任意次数

mysql> select id,name,score from info where name regexp'oo*';
+----+------+-------+
| id | name | score |
+----+------+-------+
| 10 | oo   | 65.00 |
| 11 | oooo | 65.00 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> select id,name,score from info where name regexp'o*';
+----+------------+-------+
| id | name       | score |
+----+------------+-------+
|  1 | wangwu     | 88.00 |
|  2 | wangermazi | 65.00 |
|  3 | 张三丰     | 75.50 |
|  4 | lisi       | 90.00 |
|  5 | li         | 90.00 |
|  6 | zhang      | 90.00 |
|  7 | wang       | 90.00 |
|  8 | niuer      | 90.00 |
|  9 | chuwu      | 90.00 |
| 10 | oo         | 65.00 |
| 11 | oooo       | 65.00 |
+----+------------+-------+
11 rows in set (0.00 sec)

mysql> select id,name,score from info where name regexp'oooo*';
+----+------+-------+
| id | name | score |
+----+------+-------+
| 11 | oooo | 65.00 |
+----+------+-------+
1 row in set (0.00 sec)

3.7"+"匹配前面字符至少一次

在info表中查询包含三个或者字更多o字符的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp 'ooo+';
+----+------+-------+
| id | name | score |
+----+------+-------+
| 11 | oooo | 65.00 |
+----+------+-------+
1 row in set (0.00 sec)

3.8匹配指定字符集中的任意一个

在info表中查询包含k、l、m字符开头的name字段并打印对应的 id、name 和 score 记录

mysql> select id,name,score from info where name regexp '^[k-m]';
+----+------+-------+
| id | name | score |
+----+------+-------+
|  4 | lisi | 90.00 |
|  5 | li   | 90.00 |
+----+------+-------+
2 rows in set (0.00 sec)

四、运算符

MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。

4.1算数运算符

*运算符**描述*
+加法
-减法
*乘法
/除法
%取余数

4.2比较算术符

比较运算符是查询数据记录时经常使用的一类运算符。通过使用比较运算符可以判断出 表中有哪些记录是符合条件的,如果比较的结果为真则返回 1,如果为假则返回 0,比较的结果如果不确定则返回 NULL。其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以通过 binary 关键字来实现。

*运算符**描述**运算符**描述*
=等于IS NOT NULL判断一个值是否不为 NULL
>大于BETWEEN AND两者之间
<小于IN在集合中
>=大于等于LIKE通配符匹配
<=小于等于GREATEST两个或多个参数时返回最大值
!=或<>不等于LEAST两个或多个参数时返回最小值
IS NULL判断一个值是否为 NULLREGEXP正则表达式
4.2.1等于运算

等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回 1,如果不相等则返回 0。如果比较的两者有一个值是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,如果 ASCII 码相等,则表示两个字符相同;如果 ASCII 码不相等,则表示两个字符不相同

示例

mysql> select 2=3,2=2,2='2','e'='e',(2+2)=(2*2),'r'=null;
+-----+-----+-------+---------+-------------+----------+
| 2=3 | 2=2 | 2='2' | 'e'='e' | (2+2)=(2*2) | 'r'=null |
+-----+-----+-------+---------+-------------+----------+
|   0 |   1 |     1 |       1 |           1 |     NULL |
+-----+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)
4.2.2不等于运算

不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。如果不相等则返回 1,如果相等则返回 0,这点正好跟等于的返回值相反。需要注意的是不等于运算符不能用于判断 NULL。例如,关于数字、字符串和表达式的不等于运算符的使用, 具体操作如下所示。

示例

mysql> SELECT 'kgc'<>'bdqn', 1<>2, 3!=3, 2.5!=2, NULL<>NULL ;
+---------------+------+------+--------+------------+
| 'kgc'<>'bdqn' | 1<>2 | 3!=3 | 2.5!=2 | NULL<>NULL |
+---------------+------+------+--------+------------+
|             1 |    1 |    0 |      1 |       NULL |
+---------------+------+------+--------+------------+
1 row in set (0.00 sec)
4.2.3 大于、大于等于、小于、小于等于运算符
  • 大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回 1,否则返回 0,同样不能用于判断 NULL。
  • 小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回 1,否则返回 0,同样不能用于判断 NULL。
  • 大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回 1,否则返回 0,不能用于判断 NULL。
  • 小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回 1,否则返回 0,不能用于判断 NULL。

示例

mysql>  select 5>4,'a'>'b',2>=3,(2+3)>=(1+2),4.4<3,1<2,'x'<='y',5<=5.5,'u'>=NULL;
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 5>4 | 'a'>'b' | 2>=3 | (2+3)>=(1+2) | 4.4<3 | 1<2 | 'x'<='y' | 5<=5.5 | 'u'>=NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
|   1 |       0 |    0 |            1 |     0 |   1 |        1 |      1 |      NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
1 row in set (0.01 sec)
4.2.4 IS NULL、IS NOT NULL
  • IS NULL 判断一个值是否为 NULL,如果为 NULL 返回 1,否则返回 0。
  • IS NOT NULL 判断一个值是否不为 NULL,如果不为 NULL 返回 1,否则返回 0。

示例

mysql> select 2 is null,'n' is not null,null is null;
+-----------+-----------------+--------------+
| 2 is null | 'n' is not null | null is null |
+-----------+-----------------+--------------+
|         0 |               1 |            1 |
+-----------+-----------------+--------------+
1 row in set (0.00 sec)
4.2.6 BETWEEN AND

BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间。例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间。

示例

mysql> select 4 between 2 and 6,5 between 6 and 8,'c'between 'a' and 'f'; 
+-------------------+-------------------+------------------------+
| 4 between 2 and 6 | 5 between 6 and 8 | 'c'between 'a' and 'f' |
+-------------------+-------------------+------------------------+
|                 1 |                 0 |                      1 |
+-------------------+-------------------+------------------------+
1 row in set (0.00 sec)
4.2.6 LEAST、GREATEST
  • LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则返回结果就为 NULL。
  • GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为 NULL, 则返回结果就为 NULL。

示例

mysql>  select least(1,2,3),least('a','b','c'),greatest(1,2,3),greatest('a','b','c');
+--------------+--------------------+-----------------+-----------------------+
| least(1,2,3) | least('a','b','c') | greatest(1,2,3) | greatest('a','b','c') |
+--------------+--------------------+-----------------+-----------------------+
|            1 | a                  |               3 | c                     |
+--------------+--------------------+-----------------+-----------------------+
1 row in set (0.00 sec)
4.2.7 in、not in
  • IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
  • NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。

示例

mysql> SELECT 2 in (1,2,3,4,5),'c' not in ('a','b','c');
+------------------+--------------------------+
| 2 in (1,2,3,4,5) | 'c' not in ('a','b','c') |
+------------------+--------------------------+
|                1 |                        0 |
+------------------+--------------------------+
4.2.8like、not like

LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0。LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,而’_’只能匹配一个字符。NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。

注:完全匹配

示例

mysql> select 'bdqn' like 'bdq_','kgc' like 'c','kgc' like 'k%','etc' not  like '%th';
+--------------------+----------------+-----------------+----------------------+
| 'bdqn' like 'bdq_' | 'kgc' like 'c' | 'kgc' like 'k%' | 'etc' not like '%th' |
+--------------------+----------------+-----------------+----------------------+
|                  1 |              0 |               1 |                    1 |
+--------------------+----------------+-----------------+----------------------+
1 row in set (0.00 sec)


4.3逻辑运算

逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则返回 0,真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种

NOT 或 !逻辑非
AND 或 &&逻辑与
OR 或 ||逻辑或
XOR逻辑异或

mark

4.3.1逻辑非

逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL。

mysql> select not 2,! 0,not (4-4),not null;
+-------+-----+-----------+----------+
| not 2 | ! 0 | not (4-4) | not null |
+-------+-----+-----------+----------+
|     0 |   1 |         1 |     NULL |
+-------+-----+-----------+----------+
1 row in set (0.00 sec)
4.3.2逻辑与

逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。逻辑与使用 AND 或者&&表示。例如,对非 0 值、0 值和 NULL 值分别作逻辑与运算

mysql> select 2 and 3,0&&4,0&&null,1 and null,0 and 0,1 and 1;
+---------+------+---------+------------+---------+---------+
| 2 and 3 | 0&&4 | 0&&null | 1 and null | 0 and 0 | 1 and 1 |
+---------+------+---------+------------+---------+---------+
|       1 |    0 |       0 |       NULL |       0 |       1 |
+---------+------+---------+------------+---------+---------+
1 row in set (0.00 sec)
4.3.3逻辑或

逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。逻辑或通常使用 OR 或者||来表示。

例如,对非 0 值、0 值和 NULL 值分别作逻辑或运算。

mysql> select 2 or 3,0 or 4,0 or null,1 or null,0 or 0;
+--------+--------+-----------+-----------+--------+
| 2 or 3 | 0 or 4 | 0 or null | 1 or null | 0 or 0 |
+--------+--------+-----------+-----------+--------+
|      1 |      1 |      NULL |         1 |      0 |
+--------+--------+-----------+-----------+--------+
1 row in set (0.00 sec)
4.3.4逻辑异或

两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;当任意一个值为 NULL 时,返回值为 NULL。例如,对非0 值、0 值和 NULL 值分别作逻辑异或运算

mysql> select 0 xor 0,2 xor 3,0 xor 4,0 xor null,1 xor null;
+---------+---------+---------+------------+------------+
| 0 xor 0 | 2 xor 3 | 0 xor 4 | 0 xor null | 1 xor null |
+---------+---------+---------+------------+------------+
|       0 |       0 |       1 |       NULL |       NULL |
+---------+---------+---------+------------+------------+
1 row in set (0.00 sec)
4.3.4位运算

位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查

*运算符**描述*
&按位与
|按位或
~按位取反
^按位异或
<<按位左移
>>按位右移

示例

对数字进行按位与、或和取反运算

mysql> select 10&15,10|15,10^15,5&~1;
+-------+-------+-------+------+
| 10&15 | 10|15 | 10^15 | 5&~1 |
+-------+-------+-------+------+
|    10 |    15 |     5 |    4 |
+-------+-------+-------+------+

10 转换为二进制数是 1010, 15 转换为二进制数是 1111

  • 按位与运算(&),是对应的二进制位都是 1 的,它们的运算结果为 1,否则为 0,所以 10 & 15 的结果为 10。

  • 按位或运算(|),是对应的二进制位有一个或两个为 1 的,运算结果为 1,否则为 0, 所以 10 | 15 的结果为 15。

  • 按位异或运算(^),是对应的二进制位不相同时,运算结果 1,否则为 0,所以 10 ^ 15的结果为 5。

  • 按位取反(~),是对应的二进制数逐位反转,即 1 取反后变为 0, 0 取反后变为 1。数字 1 的二进制是 0001,取反后变为 1110, 数字 5 的二进制是 0101,将 1110 和 0101进行求与操作,其结果是二进制的 0100,转换为十进制就是 4。

mark

4.3.5对数字进行左移,右移运算

示例

mysql> select 1<<2,2<<2,10>>2,15>>2;
+------+------+-------+-------+
| 1<<2 | 2<<2 | 10>>2 | 15>>2 |
+------+------+-------+-------+
|    4 |    8 |     2 |     3 |
+------+------+-------+-------+

左移或右移运算符,都是将数转换为二进制后,然后在左移或右移指定的位数,超出的位数将被移除并丢弃,空出来的位置用 0 补齐。例如,“2<<2”将数字 2 的二进制数 0010, 向左移动两位后变成 10,右侧用 00 补齐,最终变为二进制的 1000,转换为十进制是 8。“15>>2”将数字 15 转换为二进制是 1111,向右移动两位,右侧的两位 11 被丢弃,变为 11, 左侧用 00 补齐,最终变为二进制的 0011,转换为十进制就是 3。

4.4运算优先级

运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算。如果不确定所使用的运算符的优先级,可以使用()改变优先级。常用的运算符优先级情况如表 5-6 所示。“!”的优先级最高,而“:=”的优先级最低。

*优先级**运算符**优先级**运算符*
18|
2~9=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
3^10BETWEEN,CASE,WHEN,THEN,ELSE
4* , /(DIV), %(MOD)11NOT
5+,-12&&,AND
6>>,<<13||,OR,XOR
7&14:=

4.5连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。

4.5.1内连接

MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件。

语法格式
SELECT column_name(s)FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

示例

mysql> select* from info inner join Hob on info.hobby=Hob.id;
+----+--------------+-------+----------+-------+----+----------+
| id | name         | score | address  | hobby | id | hob_name |
+----+--------------+-------+----------+-------+----+----------+
|  1 | 王五         | 88.00 | 苏州     |     1 |  1 | 看书     |
|  2 | 王二麻子     | 60.00 | 未知     |     2 |  2 | 钓鱼     |
|  3 | 张三丰       | 75.50 | 南京     |     2 |  2 | 钓鱼     |
|  4 | lisi         | 90.00 | ningxia  |     1 |  1 | 看书     |
|  5 | li           | 90.00 | beijing  |     1 |  1 | 看书     |
|  6 | zhang        | 90.00 | beihai   |     1 |  1 | 看书     |
|  7 | wang| 90.00 | shanghai |     1 |  1 | 看书     |
|  8 | niuer        | 90.00 | jurong   |     1 |  1 | 看书     |
|  9 | chuwu        | 90.00 | jurong   |     1 |  1 | 看书     |
+----+--------------+-------+----------+-------+----+----------+
9 rows in set (0.00 sec)

内连接是取两张表的交集部分,如果没有交集,则不输出结果。

4.5.2左连接

左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行

示例

mysql> select*from info left join Hob on info.hobby=Hob.id;
+----+------------+-------+----------+-------+------+----------+
| id | name       | score | address  | hobby | id   | hob_name |
+----+------------+-------+----------+-------+------+----------+
|  1 | wangwu     | 88.00 | 苏州     |     1 |    1 | 看书     |
|  4 | lisi       | 90.00 | ningxia  |     1 |    1 | 看书     |
|  5 | li         | 90.00 | beijing  |     1 |    1 | 看书     |
|  6 | zhang      | 90.00 | beihai   |     1 |    1 | 看书     |
|  7 | wang       | 90.00 | shanghai |     1 |    1 | 看书     |
|  8 | niuer      | 90.00 | jurong   |     1 |    1 | 看书     |
|  9 | chuwu      | 90.00 | jurong   |     1 |    1 | 看书     |
|  2 | wangermazi | 65.00 | 未知     |     2 |    2 | 钓鱼     |
|  3 | 张三丰     | 75.50 | 南京     |     2 |    2 | 钓鱼     |
| 10 | oo         | 65.00 | lishui   |     2 |    2 | 钓鱼     |
| 11 | oooo       | 65.00 | sichuan  |     2 |    2 | 钓鱼     |
+----+------------+-------+----------+-------+------+----------+
11 rows in set (0.00 sec)
4.5.3又链接

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。

示例

mysql> select*from info right join Hob on info.hobby=Hob.id;
+------+------------+-------+----------+-------+----+-----------+
| id   | name       | score | address  | hobby | id | hob_name  |
+------+------------+-------+----------+-------+----+-----------+
|    1 | wangwu     | 88.00 | 苏州     |     1 |  1 | 看书      |
|    2 | wangermazi | 65.00 | 未知     |     2 |  2 | 钓鱼      |
|    3 | 张三丰     | 75.50 | 南京     |     2 |  2 | 钓鱼      |
|    4 | lisi       | 90.00 | ningxia  |     1 |  1 | 看书      |
|    5 | li         | 90.00 | beijing  |     1 |  1 | 看书      |
|    6 | zhang      | 90.00 | beihai   |     1 |  1 | 看书      |
|    7 | wang       | 90.00 | shanghai |     1 |  1 | 看书      |
|    8 | niuer      | 90.00 | jurong   |     1 |  1 | 看书      |
|    9 | chuwu      | 90.00 | jurong   |     1 |  1 | 看书      |
|   10 | oo         | 65.00 | lishui   |     2 |  2 | 钓鱼      |
|   11 | oooo       | 65.00 | sichuan  |     2 |  2 | 钓鱼      |
| NULL | NULL       |  NULL | NULL     |  NULL |  3 | 打游戏    |
+------+------------+-------+----------+-------+----+-----------+
12 rows in set (0.01 sec)
4.5.3又链接

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。

示例

mysql> select*from info right join Hob on info.hobby=Hob.id;
+------+------------+-------+----------+-------+----+-----------+
| id   | name       | score | address  | hobby | id | hob_name  |
+------+------------+-------+----------+-------+----+-----------+
|    1 | wangwu     | 88.00 | 苏州     |     1 |  1 | 看书      |
|    2 | wangermazi | 65.00 | 未知     |     2 |  2 | 钓鱼      |
|    3 | 张三丰     | 75.50 | 南京     |     2 |  2 | 钓鱼      |
|    4 | lisi       | 90.00 | ningxia  |     1 |  1 | 看书      |
|    5 | li         | 90.00 | beijing  |     1 |  1 | 看书      |
|    6 | zhang      | 90.00 | beihai   |     1 |  1 | 看书      |
|    7 | wang       | 90.00 | shanghai |     1 |  1 | 看书      |
|    8 | niuer      | 90.00 | jurong   |     1 |  1 | 看书      |
|    9 | chuwu      | 90.00 | jurong   |     1 |  1 | 看书      |
|   10 | oo         | 65.00 | lishui   |     2 |  2 | 钓鱼      |
|   11 | oooo       | 65.00 | sichuan  |     2 |  2 | 钓鱼      |
| NULL | NULL       |  NULL | NULL     |  NULL |  3 | 打游戏    |
+------+------------+-------+----------+-------+----+-----------+
12 rows in set (0.01 sec)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值