MySQL---进阶查询

文章目录

  • MySQL进阶查询
    • 按关键字排序
      • 按单字段排序
      • 按多字段排序
    • 对结果进行分组
    • 限制结果条目
    • 设置别名
    • 通配符
    • 子查询
    • NULL值
    • 正则表达式
    • 运算符
    • 连接查询

MySQL进阶查询

按关键字排序

  • 使用ORDER BY语句来实现排序
  • 排序可针对一个或多个字段
  • ASC: 升序,默认排序方式
  • DESC:降序

ORDER BY的语法结构

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

按单字段排序

我创建了一个mask库,mess表

mysql> select * from mess;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | zs   |    90 |
|  2 | ls   |    80 |
|  3 | ww   |    70 |
|  4 | zl   |    60 |
+----+------+-------+
4 rows in set (0.00 sec)
###单字段降序
mysql> select * from mess where score>=70 order by score desc;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | zs   |    90 |
|  2 | ls   |    80 |
|  3 | ww   |    70 |
+----+------+-------+
3 rows in set (0.00 sec)
###单字段升序,默认即为升序ASC
mysql> select * from mess where score>=70 order by score;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  3 | ww   |    70 |
|  2 | ls   |    80 |
|  1 | zs   |    90 |
+----+------+-------+
3 rows in set (0.00 sec)


按多字段排序

多字段排序,大概就是先按一个字段进行排序,如果有相同的属性的值再对此进行排序;
如下先按分数进行升序,然后在分数相同的记录中再按照id进行升序排序

mysql> select * from mess order by score ,id ;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  4 | zl   |    60 |
|  3 | ww   |    70 |
|  5 | hb   |    70 |
|  2 | ls   |    80 |
|  1 | zs   |    90 |
+----+------+-------+
5 rows in set (0.00 sec)

对结果进行分组

  • 使用GROUP BY语句来实现分组
  • 通常结合聚合函数一起使用
  • 可以按一个或多个字段对结果进行分组

GROUP BY的语法结构

SELECT column name, aggregate_ function(column_ name) FROM table_ name
WHERE column_ name operator value GROUP BY column_ name;

group by大概就是将字段进行分组,可以再对组内的数据进行统计
如下,把score进行分组,分完后计算组内name的个数;将分数进行降序排序

mysql> select count(name),score from mess group by score order by score desc;
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           1 |    90 |
|           1 |    80 |
|           2 |    70 |
|           1 |    60 |
+-------------+-------+
4 rows in set (0.00 sec)
##group by 不与聚合函数用,可以将相应重复的字段给过滤了
mysql> select * from mess group by score order by score desc;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
|  3 | ww   |    70 |     2 |
|  4 | zl   |    60 |     2 |
+----+------+-------+-------+

上面的语句中有一个count()聚合函数,可以有如下类型

  • count(字段名称) 计数
  • sum(字段名称) 求和
  • avg(字段名称) 平均值
  • max(字段名称) 最大值
  • min(字段名称) 最小值
mysql> select avg(score) from mess;
+------------+
| avg(score) |
+------------+
|    74.0000 |
+------------+
1 row in set (0.00 sec)

mysql> select sum(score) from mess;
+------------+
| sum(score) |
+------------+
|        370 |
+------------+
1 row in set (0.00 sec)

mysql> select max(score) from mess;
+------------+
| max(score) |
+------------+
|         90 |
+------------+
1 row in set (0.00 sec)

限制结果条目

  • 只返回SELECT查询结果的第一行或前几行
  • 使用LIMIT语句限制条目

LIMIT语法结构

offset位置偏移量,从0开始
SELECT column1, column2, .. FROM table_ name LIMIT [offset,] number;
number返回记录行的最大数目

limit限制结果条目
显示3条

mysql> select * from mess limit 3 ;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  1 | zs   |    90 |
|  2 | ls   |    80 |
|  3 | ww   |    70 |
+----+------+-------+
3 rows in set (0.00 sec)

不从第一条开始,从索引值后输出相应数量的条目,索引值从0开始
下面表示从索引值为1的记录开始,输出3条记录,也就是第2条到第5条记录

mysql> select * from mess limit 1,3;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  2 | ls   |    80 |
|  3 | ww   |    70 |
|  4 | zl   |    60 |
+----+------+-------+
3 rows in set (0.01 sec)

设置别名

  • 使用AS语句设置别名,关键字AS可省略
  • 设置别名时,保证不能与库中其他表或字段名称冲突

别名的语法结构

alias _name 列的别名
SELECT column_ name AS alias _name FROM table_ name;
alias name表的别名
SELECT column_ name(s) FROM table_ name AS alias name;
原字段或者表名在库内并不会被改变

字段别名

mysql> select count(*) from mess;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)
##别名
mysql> select count(*) as number from mess;
+--------+
| number |
+--------+
|      5 |
+--------+
1 row in set (0.00 sec)

表的别名

mysql> select a.id,a.name from mess as a;
+----+------+
| id | name |
+----+------+
|  1 | zs   |
|  2 | ls   |
|  3 | ww   |
|  4 | zl   |
|  5 | hb   |
+----+------+
5 rows in set (0.00 sec)

拓展
改善下原来的mess表

##插入一列award
mysql> alter table mess add column award int(3);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |  NULL |
|  2 | ls   |    80 |  NULL |
|  3 | ww   |    70 |  NULL |
|  4 | zl   |    60 |  NULL |
|  5 | hb   |    70 |  NULL |
+----+------+-------+-------+
5 rows in set (0.00 sec)
##更新分数大于75的记录中award字段为1
mysql> update mess set award=1 where score>75;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
|  3 | ww   |    70 |  NULL |
|  4 | zl   |    60 |  NULL |
|  5 | hb   |    70 |  NULL |
+----+------+-------+-------+
5 rows in set (0.00 sec)
##更新分数小于75的记录中award字段为2
mysql> update mess set award=2 where score<75;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
|  3 | ww   |    70 |     2 |
|  4 | zl   |    60 |     2 |
|  5 | hb   |    70 |     2 |
+----+------+-------+-------+
5 rows in set (0.00 sec)
mysql> create table awards (id int(3) primary key not null,awardname varchar(10) not null);
mysql> insert into awards values (1,'pen'),(2,'book');
mysql> select * from awards;
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
|  2 | book      |
+----+-----------+
##两表联合查询,mess表的award字段和awards表的id字段相关联
mysql> select * from mess inner join awards on mess.award=awards.id;
+----+------+-------+-------+----+-----------+
| id | name | score | award | id | awardname |
+----+------+-------+-------+----+-----------+
|  1 | zs   |    90 |     1 |  1 | pen       |
|  2 | ls   |    80 |     1 |  1 | pen       |
|  3 | ww   |    70 |     2 |  2 | book      |
|  4 | zl   |    60 |     2 |  2 | book      |
|  5 | hb   |    70 |     2 |  2 | book      |
+----+------+-------+-------+----+-----------+
5 rows in set (0.00 sec)
##只输出部分字段
mysql> select mess.name,awards.awardname from mess inner join awards on mess.award=awards.id;
+------+-----------+
| name | awardname |
+------+-----------+
| zs   | pen       |
| ls   | pen       |
| ww   | book      |
| zl   | book      |
| hb   | book      |
+------+-----------+
5 rows in set (0.00 sec)
###给表设置别名,as是可以省略的
mysql> select a.name,b.awardname from mess as a inner join awards b on a.award=b.id;
+------+-----------+
| name | awardname |
+------+-----------+
| zs   | pen       |
| ls   | pen       |
| ww   | book      |
| zl   | book      |
| hb   | book      |
+------+-----------+
5 rows in set (0.01 sec)
##给字段设置别名,
mysql> select a.name 姓名,b.awardname 奖励 from mess a inner join awards b on a.award=b.id;
+--------+--------+
| 姓名   | 奖励   |
+--------+--------+
| zs     | pen    |
| ls     | pen    |
| ww     | book   |
| zl     | book   |
| hb     | book   |
+--------+--------+
5 rows in set (0.00 sec)

通配符

通配符

  • 用于替换字符串中的部分字符
  • 通常配合LIKE一起使用,并协同WHERE完成查询

常用通配符

  • %表示零个、一个或多个
  • _表示单个字符
mysql> select * from mess where name like '%s';
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
+----+------+-------+-------+
2 rows in set (0.00 sec)

mysql> select * from mess where name like 'z_';
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  4 | zl   |    60 |     2 |
+----+------+-------+-------+
2 rows in set (0.00 sec)

子查询

子查询

  • 也称作内查询或者嵌套查询
  • 先于主查询被执行,其结果将作为外层主查询的条件
  • 在增删改查中都可以使用子查询
  • 支持多层嵌套
  • IN语句是用来判断某个值是否在给定的结果集中
后面select语句结果是2,所以整个语句会输出mess表中award字段为2的记录
mysql>  select * from mess where award in (select id from awards where awardname='book');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  3 | ww   |    70 |     2 |
|  4 | zl   |    60 |     2 |
|  5 | hb   |    70 |     2 |
+----+------+-------+-------+
3 rows in set (0.00 sec)
###注意使用的=号
mysql> select * from mess where award=(select id from awards where awardname='pen');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
+----+------+-------+-------+
2 rows in set (0.00 sec)
##!=号
mysql> select * from mess where award!=(select id from awards where awardname='pen');
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  3 | ww   |    70 |     2 |
|  4 | zl   |    60 |     2 |
|  5 | hb   |    70 |     2 |
+----+------+-------+-------+
3 rows in set (0.00 sec)

exists,判断后面语句结果是否存在,存在则正确执行前面的语句,否则不能正确执行;exists后一般更select语句,跟DML语句insert会报错

mysql> select count(*) as number from mess where exists (select id from awards where id=1);
+--------+
| number |
+--------+
|      5 |
+--------+
1 row in set (0.00 sec)
##awards表中没有id为3的记录
mysql> select count(*) as number from mess where exists (select id from awards where id=3);
+--------+
| number |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

NULL值

  • 表示缺失的值
  • 与数字0或者空白(spaces)是不同的
  • 使用IS NULL或IS NOT NULL进行判断

NULL值和空值的区别

  • 空值长度为0,不占空间;NULL值的长度为NULL,占用空间
  • lS NULL无法判断空值
  • 空值使用“="或者“<>"来处理
  • COUNT()计算时,NULL会忽略,空值会加入计算
mysql> create table a (id int(3) primary key not null,name varchar(10));
mysql> insert into a values (1,'a');
mysql> insert into a values (2,'');
mysql> insert into a (id) values(3);
mysql> select * from a;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 |      |
|  3 | NULL |
+----+------+
3 rows in set (0.00 sec)
####COUNT()计算时,NULL会忽略,空值会加入计算
mysql> select count(name) from a;
+-------------+
| count(name) |
+-------------+
|           2 |
+-------------+
1 row in set (0.01 sec)
mysql> select * from a where name is not null;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 |      |
+----+------+
2 rows in set (0.00 sec)

正则表达式

  • 根据指定的匹配模式匹配记录中符合要求的特殊字符
  • 使用REGEXP关键字指定匹配模式

常用匹配模式

  • p1|p2匹配p1或p2
  • ^匹配开始字符
  • […]匹配字符集中的任意一个字符,如[abc]匹配abc中的任意一个字符
  • $匹配结束字符
  • .匹配任意单个字符[^…]匹配不在中括号内的任何字符
  • *匹配任意个前面的字符
  • +匹配前面字符至少1次
  • {n,m}匹配前面的字符串至少n次,至多m次
  • {n}匹配前面的字符串n次
mysql> select * from awards
    -> ;
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
|  2 | book      |
|  3 | fruit     |
|  4 | car       |
|  5 | phone     |
+----+-----------+
##查找以name中以p开头的记录
mysql> select * from awards where awardname regexp '^p';
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
|  5 | phone     |
+----+-----------+
2 rows in set (0.00 sec)
###查找包含相应字符的记录,应满足字符连续,如搜索’pe’的时候phone就不会被查出来
mysql> select * from  awards where awardname regexp 'on';
+----+-----------+
| id | awardname |
+----+-----------+
|  5 | phone     |
+----+-----------+
1 row in set (0.00 sec)

mysql> select * from  awards where awardname regexp 'pe';
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
+----+-----------+
##‘*’的用法是表示‘*’前面的字符出现任意次,单独出现时区别于不在正则中的表示所有,会报错
mysql> select * from awards where awardname regexp '*';
ERROR 1139 (42000): Got error 'repetition-operator operand invalid' from regexp
mysql> select * from awards where awardname regexp '.*';
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
|  2 | book      |
|  3 | fruit     |
|  4 | car       |
|  5 | phone     |
+----+-----------+
5 rows in set (0.00 sec)

运算符

算术运算符
MySQL支持的算术运算符

  • +加法
    • 减法
  • *乘法
  • /除法
  • %取余数
mysql> select 1+2,2-1,2*1,4/2,6%2;
+-----+-----+-----+--------+------+
| 1+2 | 2-1 | 2*1 | 4/2    | 6%2  |
+-----+-----+-----+--------+------+
|   3 |   1 |   2 | 2.0000 |    0 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

比较运算符

  • 字符串的比较默认不区分大小写,可使用binary来区分
    常用比较运算符
  • =等于
  • 大于

  • <小于
  • =大于等于

  • <=小于等于
  • !=或<>不等于
  • IN在集合中
  • LIKE 通配符匹配
  • lS NULL 判断─个值是否为NULL
  • lS NOT NULL 判断—个值是否不为NULL
  • BETWEEN AND两者之间
  • GREATEST两个或多个参数时返回最大值
  • LEAST 两个或多个参数时返回最小值
mysql> select 2=3,2='2','e'='e',(1+3)=(2+2),'a'=NULL;
+-----+-------+---------+-------------+----------+
| 2=3 | 2='2' | 'e'='e' | (1+3)=(2+2) | 'a'=NULL |
+-----+-------+---------+-------------+----------+
|   0 |     1 |       1 |           1 |     NULL |
+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)

从以上查询可以看出来:

  • 如果两者都是整数,则按照整数值进行比较。
  • 如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。
  • 如果两者都是字符串,则按照字符串进行比较。
  • 如果两者中至少有一个值是 NULL,则比较的结果是 NULL。
mysql> select 'njit'<>'njiu',1<>1,3!=3,NULL<>NULL;
+----------------+------+------+------------+
| 'njit'<>'njiu' | 1<>1 | 3!=3 | NULL<>NULL |
+----------------+------+------+------------+
|              1 |    0 |    0 |       NULL |
+----------------+------+------+------------+
1 row in set (0.00 sec)

需要注意的是不等于运算符不能用于判断 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.00 sec)

大于、大于等于、小于等于都是不用于判断NULL
关于数字、字符和 NULL 值的运用如下
IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无 NOT 这个关键字的区别,同时返回值不同。

mysql> select 2 IS NULL,'f' IS NOT NULL,NULL IS NULL;
+-----------+-----------------+--------------+
| 2 IS NULL | 'f' IS NOT NULL | NULL IS NULL |
+-----------+-----------------+--------------+
|         0 |               1 |            1 |
+-----------+-----------------+--------------+
1 row in set (0.01 sec)

BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间,如果是比较字母的话,会转换成ASCII码进行比较

mysql> select 4 BETWEEN 2 AND 4,5 BETWEEN 5 AND 6,'B' BETWEEN 'A' AND 'C';
+-------------------+-------------------+-------------------------+
| 4 BETWEEN 2 AND 4 | 5 BETWEEN 5 AND 6 | 'B' BETWEEN 'A' AND 'C' |
+-------------------+-------------------+-------------------------+
|                 1 |                 1 |                       1 |
+-------------------+-------------------+-------------------------+
1 row in set (0.00 sec)

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,null);
+--------------+--------------------+-----------------+-----------------------+-----------------+
| least(1,2,3) | least('a','b','c') | greatest(1,2,3) | greatest('a','b','c') | least(1,2,null) |
+--------------+--------------------+-----------------+-----------------------+-----------------+
|            1 | a                  |               3 | c                     |            NULL |
+--------------+--------------------+-----------------+-----------------------+-----------------+
1 row in set (0.00 sec)

IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。

mysql> select 2 in (1,2,3,4),'c' not in ('a','b','c');
+----------------+--------------------------+
| 2 in (1,2,3,4) | 'c' not in ('a','b','c') |
+----------------+--------------------------+
|              1 |                        0 |
+----------------+--------------------------+
1 row in set (0.00 sec)

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

mysql> select 'aug' like 'au_','njit' like 'n%','zn' not like 'z%';
+------------------+------------------+--------------------+
| 'aug' like 'au_' | 'njit' like 'n%' | 'zn' not like 'z%' |
+------------------+------------------+--------------------+
|                1 |                1 |                  0 |
+------------------+------------------+--------------------+
1 row in set (0.00 sec)

逻辑运算符

  • 又被称为布尔运算符用来判断表达式的真假

常用的逻辑运算符

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

逻辑非,分为0值和非零值

mysql> select not 2,!3,not 0,!(4-4);
+-------+----+-------+--------+
| not 2 | !3 | not 0 | !(4-4) |
+-------+----+-------+--------+
|     0 |  0 |     1 |      1 |
+-------+----+-------+--------+
1 row in set (0.00 sec)

逻辑与,逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。

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

逻辑或,逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。还是使用or比较好,使用||显示结果好像会有错误

mysql> select 2 or 0,2 or 3,0 or null,1 or null;
+--------+--------+-----------+-----------+
| 2 or 0 | 2 or 3 | 0 or null | 1 or null |
+--------+--------+-----------+-----------+
|      1 |      1 |      NULL |         1 |
+--------+--------+-----------+-----------+
1 row in set (0.00 sec)

逻辑异或,两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;当任意一个值为 NULL 时,返回值为 NULL

mysql> select 1 xor 1,0 xor 1,0 xor null,1 xor null;
+---------+---------+------------+------------+
| 1 xor 1 | 0 xor 1 | 0 xor null | 1 xor null |
+---------+---------+------------+------------+
|       0 |       1 |       NULL |       NULL |
+---------+---------+------------+------------+
1 row in set (0.00 sec)

位运算符

  • 位运算符实际上是对二进制数进行计算的运算符
    位运算符
  • &:按位与
  • |:按位或
  • ~:按位取反
  • ^:按位异或
  • <<:按位左移
  • :按位右移

将十进制数转换成二进制数然后进行相应的位运算,5 & 1大概就是5为,0101,1为0001,1为1110,把0101和1110进行与运算。

mysql> select 10 & 15,10 | 15,10 ^ 15,5 & ~1;
+---------+---------+---------+--------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 & ~1 |
+---------+---------+---------+--------+
|      10 |      15 |       5 |      4 |
+---------+---------+---------+--------+
1 row in set (0.01 sec)

左移右移运算符
1为0001向左移两位的话就成了0100结果为4,5为0101向左移一位的话1010结果为10,
5为0101,向右移两位的话就成了0001结果为1

mysql> select 1<<2;
+------+
| 1<<2 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

mysql> select 5<<1;
+------+
| 5<<1 |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

mysql> select 5>>2;
+------+
| 5>>2 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

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

连接查询

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

mysql> select * from mess;
+----+------+-------+-------+
| id | name | score | award |
+----+------+-------+-------+
|  1 | zs   |    90 |     1 |
|  2 | ls   |    80 |     1 |
|  3 | ww   |    70 |     2 |
|  4 | zl   |    60 |     2 |
|  5 | hb   |    70 |     2 |
|  6 | ad   |    60 |     0 |
+----+------+-------+-------+
6 rows in set (0.00 sec)

mysql> select * from awards;
+----+-----------+
| id | awardname |
+----+-----------+
|  1 | pen       |
|  2 | book      |
|  3 | fruit     |
|  4 | car       |
|  5 | phone     |
+----+-----------+

mysql> select * from mess inner join awards on mess.award=awards.id;
+----+------+-------+-------+----+-----------+
| id | name | score | award | id | awardname |
+----+------+-------+-------+----+-----------+
|  1 | zs   |    90 |     1 |  1 | pen       |
|  2 | ls   |    80 |     1 |  1 | pen       |
|  3 | ww   |    70 |     2 |  2 | book      |
|  4 | zl   |    60 |     2 |  2 | book      |
|  5 | hb   |    70 |     2 |  2 | book      |
+----+------+-------+-------+----+-----------+
5 rows in set (0.00 sec)
mysql> select mess.name,mess.score,mess.award from mess inner join awards on mess.award=awards.id;
+------+-------+-------+
| name | score | award |
+------+-------+-------+
| zs   |    90 |     1 |
| ls   |    80 |     1 |
| ww   |    70 |     2 |
| zl   |    60 |     2 |
| hb   |    70 |     2 |
+------+-------+-------+
5 rows in set (0.00 sec)

外连接
左连接,将左边的表作为主表,右边作为匹配相应字段的表,主表将显示所有

mysql> select * from mess left join awards on mess.award=awards.id;
+----+------+-------+-------+------+-----------+
| id | name | score | award | id   | awardname |
+----+------+-------+-------+------+-----------+
|  1 | zs   |    90 |     1 |    1 | pen       |
|  2 | ls   |    80 |     1 |    1 | pen       |
|  3 | ww   |    70 |     2 |    2 | book      |
|  4 | zl   |    60 |     2 |    2 | book      |
|  5 | hb   |    70 |     2 |    2 | book      |
|  6 | ad   |    60 |     0 | NULL | NULL      |
+----+------+-------+-------+------+-----------+

右连接,右边的表作为基础表,会显示所有表的内容,左边的表匹配上右边表的也会显示

mysql> select * from mess right join awards on mess.award=awards.id;
+------+------+-------+-------+----+-----------+
| id   | name | score | award | id | awardname |
+------+------+-------+-------+----+-----------+
|    1 | zs   |    90 |     1 |  1 | pen       |
|    2 | ls   |    80 |     1 |  1 | pen       |
|    3 | ww   |    70 |     2 |  2 | book      |
|    4 | zl   |    60 |     2 |  2 | book      |
|    5 | hb   |    70 |     2 |  2 | book      |
| NULL | NULL |  NULL |  NULL |  3 | fruit     |
| NULL | NULL |  NULL |  NULL |  4 | car       |
| NULL | NULL |  NULL |  NULL |  5 | phone     |
+------+------+-------+-------+----+-----------+
8 rows in set (0.00 sec)

你可能感兴趣的:(mysql,数据库,sql)