MySQL数据库高级查询语句 ——————进阶查询

MySQL进阶查询

按关键字排序

使用ORDERBY语句来实现排序
排序可针对一个或多个字段
ASC:升序,默认排序方式
DESC:降序
ORDER BY的语法结构
SELECT column1,column2,…FROM table_name ORDER BY column1,column2,…ASC|DESC

实验举例

mysql> use school;
mysql> create table info ( id int(4) not null primary key, name varchar(10) not null, score decimal (5,2),haddy int(4) not null);
mysql> insert into info (name,scrore,habby) values ('zhaoliu',70,2);  //插入数据省略部分内容
mysql> select count(addr) from info;             //添加地址选项
mysql> select * from info;
+----+----------+--------+-------+------+
| id | name     | scrore | habby | addr |
+----+----------+--------+-------+------+
|  1 | zhangsan |  88.00 |     1 | NULL |
|  2 | lisi     |  90.00 |     1 |      |
|  3 | wangwu   |  95.00 |     2 | nj   |
|  4 | zhaoliu  |  70.00 |     2 | NULL |
|  5 | tianqi   |  98.00 |     2 | nj   |
|  6 | wangba   |  80.00 |     1 | NULL |
|  7 | zhujiu   |  89.00 |     1 | nj   |
|  8 | tangsi   |  86.00 |     1 | NULL |
+----+----------+--------+-------+------+
8 rows in set (0.00 sec)
mysql> alter table info change habby hoddy int(11);        //更改选项让habby变成hoddy
mysql> alter table info change scrore score int(11);
mysql> select * from info order by score;          //查询的时候按成绩进行查询默认升序
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  6 | wangba   | 80.00 |     1 | NULL |
|  8 | tangsi   | 86.00 |     1 | NULL |
|  1 | zhangsan | 88.00 |     1 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  5 | tianqi   | 98.00 |     2 | nj   |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select * from info order by score;          //查询的时候按成绩进行降序查询
mysql> select id,hoddy from info where 1=1 order by hoddy desc,id desc;    //指定多字段进行查询优先查考先写的字段
+----+-------+
| id | hoddy |
+----+-------+
|  5 |     2 |
|  4 |     2 |
|  3 |     2 |
|  8 |     1 |
|  7 |     1 |
|  6 |     1 |
|  2 |     1 |
|  1 |     1 |
+----+-------+
8 rows in set (0.00 sec)
mysql> select id,hoddy from info where 1=1 order by score;
+----+-------+
| id | hoddy |
+----+-------+
|  4 |     2 |
|  6 |     1 |
|  8 |     1 |
|  1 |     1 |
|  7 |     1 |
|  2 |     1 |
|  3 |     2 |
|  5 |     2 |
+----+-------+
8 rows in set (0.01 sec)

对结果进行分组

使用GROUP BY语句来实现分组
通常结合聚合函数一起使用
可以按一个或多个字段对结果进行分组
GROUP BY的语法结构
select count(选项),选项 from 表名 where 条件 group by 选项

实验

mysql> select count(name),hoddy from info group by hoddy;     //按兴趣进行分组 并统计每个组的个数
+-------------+-------+
| count(name) | hoddy |
+-------------+-------+
|           5 |     1 |
|           3 |     2 |
+-------------+-------+
2 rows in set (0.00 sec)
mysql> update info set hoddy=3 where name='zhangsan';        //将张三的兴趣改成3

限制结果条件

只返回select查询结果的第一行或者前几行
使用limit语句限制条目
limit语法结构
select * from 表名 limit 选项 【注意若limit后面是 3,5表示的是从第四行开始向后的五行 即从索引位置开始的向下的几行】

mysql> select * from info limit 3;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from info limit 2,5;
+----+---------+-------+-------+------+
| id | name    | score | hoddy | addr |
+----+---------+-------+-------+------+
|  3 | wangwu  | 95.00 |     2 | nj   |
|  4 | zhaoliu | 70.00 |     2 | NULL |
|  5 | tianqi  | 98.00 |     2 | nj   |
|  6 | wangba  | 80.00 |     1 | NULL |
|  7 | zhujiu  | 89.00 |     1 | nj   |
+----+---------+-------+-------+------+
5 rows in set (0.00 sec)

设置别名

使用的是as语句并且关键字as可以省略
可以针对表和字段设置别名
语法结构
select 选项 as 别名 from 表名;

mysql> select name as 姓名 from info;
+----------+
| 姓名     |
+----------+
| zhangsan |
| lisi     |
| wangwu   |
| zhaoliu  |
| tianqi   |
| wangba   |
| zhujiu   |
| tangsi   |
+----------+
8 rows in set (0.00 sec)
mysql> select a.name 姓名,a.score as 成绩 from info as a;
+----------+--------+
| 姓名     | 成绩   |
+----------+--------+
| zhangsan |  88.00 |
| lisi     |  90.00 |
| wangwu   |  95.00 |
| zhaoliu  |  70.00 |
| tianqi   |  98.00 |
| wangba   |  80.00 |
| zhujiu   |  89.00 |
| tangsi   |  86.00 |
+----------+--------+
8 rows in set (0.00 sec)

as也可以做连接语句
用法
create table 要连接的表名 as select * from 表名

mysql> create table lapp as select * from info where score >= 90;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from lapp;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
+----+--------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> desc lapp;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(4)       | NO   |     | 0       |       |
| name  | varchar(10)  | NO   |     | NULL    |       |
| score | decimal(5,2) | YES  |     | NULL    |       |
| hoddy | int(11)      | YES  |     | NULL    |       |
| addr  | varchar(50)  | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

注意的是新表的数据类型一样 但是约束条件没有了 如主键和和扩展属性没有了

通配符

用于替换字符串中的部分字符
关键字like经常和as 一起使用 并协同where完成查询(常用于模糊查询)
通配符
%表示0个1个或多个
_(下划线)表示单个字符
语法结构
select * from 表名 where 选项 like 条件

mysql> select * from info where name like 'z%';
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from info where name like 'l_s_';
+----+------+-------+-------+------+
| id | name | score | hoddy | addr |
+----+------+-------+-------+------+
|  2 | lisi | 90.00 |     1 |      |
+----+------+-------+-------+------+
1 row in set (0.01 sec)

子查询语句

也称内查询或嵌套查询 多层查询一般从内往外读
子查询先于主查询被执行其结果做外层查询的条件
IN语句是用来 判断某个值是否在给定的结果集中

mysql> create table tmp (id int(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp values (1),(3),(5),(7);
mysql> select * from info where id in(select id from tmp);
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  7 | zhujiu   | 89.00 |     1 | nj   |
+----+----------+-------+-------+------+
4 rows in set (0.01 sec)

视图:

数据库中的虚拟表这张表中不包含任何数据,只是做了数据映射
关键字 view

mysql> show table status;
mysql> create view v_score as select * from info where score >=90;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_score;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
+----+--------+-------+-------+------+
3 rows in set (0.00 sec)

常用子查询的用法

mysql> select count(*) as number from info where exists (select id from info where name='lisi');
+--------+
| number |
+--------+
|      8 |
+--------+
1 row in set (0.00 sec)

mysql> select count(*) as number from info where exists (select id from info where name='lisigg');  ##判断结果必须要符合外层才能执行
+--------+
| number |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)
mysql> mysql> update info set score=score-7 where id in(select a.id from(select id from info where hoddy >= 3) a);

NULL值

表示缺失的值
与数字0或者空白(spaces)是不同的
使用IS NULL或IS NOT NULL进行判断
NULL值和空值的区别
空值长度为0,不占空间;NULL值的长度为NULL,占用空间
IS NULL无法判断空值
空值使用“="或者“<>"来处理
OUNTO计算时,NULL会忽略,空值会加入计算

mysql> update info set addr='' where name='lisi';
mysql> SELECT * FROM info;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  6 | wangba   | 80.00 |     1 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select * from info where addr is not null;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
|  7 | zhujiu | 89.00 |     1 | nj   |
+----+--------+-------+-------+------+
4 rows in set (0.00 sec)
mysql> select * from info where addr is null;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  6 | wangba   | 80.00 |     1 | NULL |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
4 rows in set (0.00 sec)
mysql> select count(addr) from info;              ##统计地址为not null的数量
+-------------+
| count(addr) |
+-------------+
|           4 |
+-------------+
1 row in set (0.00 sec)
mysql> update info set addr='' where name='wangba';       ##将王八的地址变成空值
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select count(addr) from info;                   ##说明了没有东西会被加入到统计
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

正则表达式

根据指定的匹配模式匹配记录中符合要求的特殊字符
使用REGEXP关键字指定匹配模式
常用匹配模式
p1lp2 匹配p1或p2
^ 匹配开始字符
[…] 匹配字符集中的任意一个字符
$ 匹配结束字符
. 匹配任意单个字符
[^…] 匹配不在中括号内的任何字符 就是不包含

  • 匹配任意个前面的字符
    {n} 匹配前面的字符串n次
    + 匹配前面字符至少1次
    {n,m} 匹配前面的字符串至少n次,至多m次
mysql> select * from info where name regexp '[^xy]';
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  6 | wangba   | 80.00 |     1 |      |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select id,name,score from info where name regexp '^z';
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | zhangsan | 81.00 |
|  4 | zhaoliu  | 70.00 |
|  7 | zhujiu   | 89.00 |
+----+----------+-------+
mysql> select * from info where name regexp 'li';
+----+---------+-------+-------+------+
| id | name    | score | hoddy | addr |
+----+---------+-------+-------+------+
|  2 | lisi    | 90.00 |     1 |      |
|  4 | zhaoliu | 70.00 |     2 | NULL |
+----+---------+-------+-------+------+
2 rows in set (0.00 sec)

运算符

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

算术运算符

在这里插入图片描述

mysql> select 1+2 as jia,2-1 as jian,2*3 cheng,4/2 as chu, 7%2 as 取余;
+-----+------+-------+--------+--------+
| jia | jian | cheng | chu    | 取余   |
+-----+------+-------+--------+--------+
|   3 |    1 |     6 | 2.0000 |      1 |
+-----+------+-------+--------+--------+
1 row in set (0.01 sec)
mysql> create table mas as select 2+1,2-1,7/2,7%2;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

比较运算符

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

IS NULL 判断一个值是否为 NULL,如果为 NULL 返回 1,否则返回 0。
IS NOT NULL 判断一个值是否不为 NULL,如果不为 NULL 返回 1,否则返回 0。例如,关于数字、字符和 NULL 值的运用,

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.00 sec)

IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无 NOT 这个关键字的区别,同时返回值不同。

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)

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)

从以上结果可以看出,LEAST 比较的参数为数字时,返回的是其中最小的值;当比较的参数为字符串时,
返回字母表中顺序最靠前的字符。GREATEST 比较的参数为数字时, 返回的是其中最大的值;
当比较的参数为字符串时,返回字母表中顺序最靠后的字符。

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 |
+------------------+--------------------------+
1 row in set (0.00 sec)

从以上结果可以看出,IN 和 NOT IN 的返回值正好相反。

逻辑运算符

逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则返回 0,
真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种,
运算符 描述
NOT 或 ! 逻辑非
AND 或 && 逻辑与
OR 或 || 逻辑或
XOR 逻辑异或
(1)逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,
把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;
如果操作数为 NULL 时,所得值为 NULL。
(2)逻辑与
逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0
逻辑与使用 AND 或者&&表示。例如,对非 0 值、0 值和 NULL 值分别作逻辑与运算,

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

(3)逻辑或
逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。
逻辑或通常使用 OR 或者||来表示。例如,对非 0 值、0 值和 NULL 值分别作逻辑或运算

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

自由理解 :::: 对于与运算和或运算 计算机都是先进行前面的第一表达式 若是前面的表达式成立就不会再进行后面的运算了例如 1 & null 那么结果必定是1 因为前面的表达式1返回值正确的下面的null就不在进行 在例如null or 1 就认为null 是不成立的结果变是1 在例如0 or null 因为0是空值就执行了null 结果也就是null
另外发现0和null做与运算的时候结果是0理解就是在与运算的时候0是老大 而或运算时1是老大 (null是像常客人一样 在主人就肯定是主人大咯)
(4)逻辑异或
两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;
当任意一个值为 NULL 时,返回值为 NULL。例如,对非0 值、0 值和 NULL 值分别作逻辑异或运算

简单的链接异或 运算的时候仅仅是和或一个不同的就是 1 XOR 1 结果是0
简单的记忆表:
在这里插入图片描述

位运算符

位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看。MySQL 支持 6 种位运算符
运算符 描述
在这里插入图片描述

mysql> select 10 & 15,10 | 15,10 ^ 15,5&~1,15 << 2,15>>2,10<<2,1<<2;
+---------+---------+---------+------+---------+-------+-------+------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5&~1 | 15 << 2 | 15>>2 | 10<<2 | 1<<2 |
+---------+---------+---------+------+---------+-------+-------+------+
|      10 |      15 |       5 |    4 |      60 |     3 |    40 |    4 |
+---------+---------+---------+------+---------+-------+-------+------+
1 row in set (0.00 sec)

mysql逻辑运算的优先级

在默认情况下是从左往右依次执行 优先级数值越小越优先 如下图!优先级最高:=优先级是最低。
在这里插入图片描述

mysql连接查询

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

1、内连接
MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在FROM 子句中使用关键字 INNER JOIN 来连接多张表,
并使用 ON 子句设置连接条件。内连接的语法格式如下。
SELECT 选项(s) FROM 表1 INNER JOIN 表2 ON 表1.column_name = 表2.column_name;

mysql> select info.id,info.name from info inner join lapp on info.id=lapp.id;
+----+--------+
| id | name   |
+----+--------+
|  2 | lisi   |
|  3 | wangwu |
|  5 | tianqi |
+----+--------+
3 rows in set (0.00 sec)

2、左连接 和内连接就inner 和left这个区别
MySQL 除了内连接,还可以使用外连接。区别于 MySQL 外连接是将表分为基础表和参考表,再依据基础表返回满足条件或不满足条件的记录。外连接按照连接时表的顺序来分, 有左连接和右连接之分。
左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,
并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

mysql> create table Hob (id int(5) not null primary key auto_increment,hob_name varchar(10) not null);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into Hob (hob_name) values ('云计算'),('大数据'),('人工智能');
mysql> select info.id,info.name,Hob.hob_name from info left join Hob on info.hoddy=Hob.id;
+----+----------+--------------+
| id | name     | hob_name     |
+----+----------+--------------+
|  2 | lisi     | 云计算       |
|  6 | wangba   | 云计算       |
|  7 | zhujiu   | 云计算       |
|  8 | tangsi   | 云计算       |
|  3 | wangwu   | 大数据       |
|  4 | zhaoliu  | 大数据       |
|  5 | tianqi   | 大数据       |
|  1 | zhangsan | 人工智能     |
+----+----------+--------------+
8 rows in set (0.01 sec)

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

mysql> select info.id,info.name,Hob.hob_name from Hob right join info on info.hoddy=Hob.id;
+----+----------+--------------+
| id | name     | hob_name     |
+----+----------+--------------+
|  2 | lisi     | 云计算       |
|  6 | wangba   | 云计算       |
|  7 | zhujiu   | 云计算       |
|  8 | tangsi   | 云计算       |
|  3 | wangwu   | 大数据       |
|  4 | zhaoliu  | 大数据       |
|  5 | tianqi   | 大数据       |
|  1 | zhangsan | 人工智能     |
+----+----------+--------------+
8 rows in set (0.00 sec)

参考理解:无论左右还是内连接 都是一个是主表如info 另一个是从表如Hob这一点一定要理解;

猜你喜欢

转载自blog.csdn.net/Laiyunpeng666/article/details/109071080