MySQL进阶查询

按关键字排序

使用ORDER BY语句来实现排序
排序可针对一个或多个字段
ASC:升序,默认排序方式
DESC:降序
ORDER BY的语法结构
SELECT (接要查询字段)column1, column2, … FROM (接表)table_name ORDER BY column1,column2, …(排序字段)ASC(可省略)|DESC;

实验1:ORDER BY语句排序
[[email protected] ~]# mysql -uroot -p123456 //进入数据库
mysql> use xinsheng;//创建xinsheng库
mysql> create table chengji(xuehao int(6) not null primary key, nianling int(2) not null, xingming varchar(20) not null, chengji int(3));//创建成绩表
mysql> insert into chengji(xuehao,nianling,xingming,chengji) valalues (201001,17,‘zhangsan’,60),(201002,18,‘lisi’,70),(201003,1818,‘wangwu’,80),(201404,17,‘zhaoliu’,95),(201005,19,‘tianqi’,55)5);//插入数据
mysql> select * from chengji;//查看表
±-------±---------±---------±--------+
| xuehao | nianling | xingming | chengji |
±-------±---------±---------±--------+
| 201001 | 17 | zhangsan | 60 |
| 201002 | 18 | lisi | 70 |
| 201003 | 18 | wangwu | 80 |
| 201005 | 19 | tianqi | 55 |
| 201404 | 17 | zhaoliu | 95 |
±-------±---------±---------±--------+
mysql> select xuehao,xingming,chengji from chengji order by chengji desc;//按单字段成绩进行降序

MySQL进阶查询
mysql> select xuehao,xingming,chengji from chengji order by chengji ; //按单字段成绩进行升序,升序是默认的,ASC可以默认不写
MySQL进阶查询
mysql> select xuehao,xingming,chengji from chengji order by nianling desc,chengji desc;
//多字段升序,先按年龄降序,在年龄相同的情况下,成绩安装降序排列
MySQL进阶查询
mysql> select * from chengji order by nianling desc,chengji desc; //列出所有
MySQL进阶查询

对结果进行分组

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

实验2:对结果进行分组 GROUP BY分组
mysql> insert into chengji values(201006,18,‘zhangsan’,80),(201007,19,‘lisi’,70);//为成绩表添加新数据,来进行实验
MySQL进阶查询
mysql> select count(xingming),nianling from chengji group by nianling;//对结果进行分组
MySQL进阶查询
mysql> select count(xingming),nianling from chengji group by nianling order by count(xingming) desc;//对结果进行分组,并按照姓名重复次数进行降序 结合order by降序
MySQL进阶查询

限制条目结果

只返回SELECT查询结果的第一行或前几行
使用LIMIT语句限制条目
LIMIT语法结构
SELECT colun1, column2, …FROM table_name LIMIT [offset,]nnumber;
[offset,]:位置偏移量,从0开始
number:返回记录行的最大数目

限制结果条目2.2
LIMIT限制结果条数
不从第一条开始取值

实验:限制条目结果
查询所有数据
MySQL进阶查询
查询表中的前三行的列
MySQL进阶查询
表明从第4行起,连续看3行,第一个3表示offset偏移量,第二个3表示连续读3行
在这里插入图片描述

设置别名

使用AS语句设置别名,关键字AS可省略
设置别名时,保证不能与库中其他表或字段名称冲突
别名的语法结构
SELECT column_name AS alis_name FROM table_name; AS:列的别名
SELECT column_name(s) FROM table_name AS alias_name; 原字段或者表名在库内并不会被改变 AS表的别名

实验:修改别名
修改列的别名
mysql> select xuehao as 学号, nianling as 年龄, xingming as 姓名, chengji as 成绩 from chengji;//as可以不写
MySQL进阶查询

修改表的别名(单张表)
mysql> select xuehao 学号, nianling 年龄, xingming 姓名, chengji 成绩 from chengji cj;单张表时写
MySQL进阶查询
多张表时:
mysql> select cj.xuehao 学号, cj.nianling 年龄, cj.xingming 姓名, cj.chengji 成绩 from chengji cj;
MySQL进阶查询

mysql> select count(*) from chengji; //统计多少列
MySQL进阶查询
AS作为连接语句
mysql> create table stu as select * from chengji;//将chengji表的内容复制给stu表
mysql> select * from stu;
MySQL进阶查询
查看二者的表结构,做对比//发现主键值PRI没有复制过来,额外信息也不会复制
MySQL进阶查询

通配符

用于替换字符串中的部分字符
通常配合LIKE一起使用,并协调WHERE完成查询
常用通配符
%:表示零个一个或多个 %s:表示最后一位是s
_:表示单个字符 如 lisi:可以用l_s_表示

通配符%的用法
mysql> select * from chengji where xingming like ‘z%’; //查找chengji表,xingming列中以z开头的字符
MySQL进阶查询
mysql> select * from chengji where xingming like ‘%u’; 查找chengji表,xingming列中以u结尾的字符
MySQL进阶查询
mysql> select * from chengji where xingming like ‘%u%’; 查找chengji表,xingming列中以u在中间的字符
图片丢失

通配符_的使用
mysql> select * from chengji where xingming like ‘_i_i’;查找chengji表,xingming列中以符合_i_i的字符,如lisi 必要对应字符数,若_i则无显示,一个下划线只占一位 %:表示任意字符
MySQL进阶查询
两者结合使用
MySQL进阶查询

子查询

也称为内查询或嵌套查询
先于主查询被执行,其结果将作为外层主查询的条件
在增删改查中都可以使用子查询
支持多层嵌套
IN语句是用来判断某个值是否在给定的结果集中

子查询的用法
单层结果集
mysql> select xuehao as 学号, chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji >=60);
MySQL进阶查询
mysql> select xuehao as 学号, chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji >=60) order by chengji desc;//子查询,并且进行降序排列
MySQL进阶查询

多层结果集(增、删、改、查)
一:插入
mysql> create table score as select * from chengji;//复制chengji表,并创建为score表
mysql> delete from score;//清空score表;
mysql> insert into score select * from chengji where chengji in (select chengji from chengji where chengji >=80);
MySQL进阶查询

二:修改

mysql> alter table score add column num int(3);
mysql> desc score;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| xuehao | int(6) | NO | | NULL | |
| nianling | int(2) | NO | | NULL | |
| xingming | varchar(20) | NO | | NULL | |
| chengji | int(3) | YES | | NULL | |
| num | int(3) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
mysql> select * from score;
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | NULL |
| 201006 | 18 | zhangsan | 80 | NULL |
| 201404 | 17 | zhaoliu | 95 | NULL |
mysql> update score set num=101 where chengji in (select chengji from chengji where chengji >= 80);
mysql> select * from score;
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | 101 |
| 201006 | 18 | zhangsan | 80 | 101 |
| 201404 | 17 | zhaoliu | 95 | 101 |

三:查询
mysql> select * from (select * from chengji where chengji >=75)as a;
±-------±---------±---------±--------+
| xuehao | nianling | xingming | chengji |
±-------±---------±---------±--------+
| 201003 | 18 | wangwu | 80 |
| 201006 | 18 | zhangsan | 80 |
| 201404 | 17 | zhaoliu | 95 |
±-------±---------±---------±--------+
mysql> select * from (select * from chengji where chengji >=75)as a order by chengji desc;//附加上降序排序
±-------±---------±---------±--------+
| xuehao | nianling | xingming | chengji |
±-------±---------±---------±--------+
| 201404 | 17 | zhaoliu | 95 |
| 201003 | 18 | wangwu | 80 |
| 201006 | 18 | zhangsan | 80 |
±-------±---------±---------±--------+

四:删除
mysql> delete from chengji where chengji in(select chengji from (select * from chengji where chengji >=75)a);
Query OK, 3 rows affected (0.00 sec)

mysql> select * from chengji;
±-------±---------±---------±--------+
| xuehao | nianling | xingming | chengji |
±-------±---------±---------±--------+
| 201001 | 17 | zhangsan | 60 |
| 201002 | 18 | lisi | 70 |
| 201005 | 19 | tianqi | 55 |
| 201007 | 19 | lisi | 70 |
±-------±---------±---------±--------+

五:对某个字段进行计数
mysql> select * from score;
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | 101 |
| 201006 | 18 | zhangsan | 80 | 101 |
| 201404 | 17 | zhaoliu | 95 | 101 |
mysql> select * from score;
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | 101 |
| 201006 | 18 | zhangsan | 80 | 101 |
| 201404 | 17 | zhaoliu | 95 | 101 |
| 201008 | 18 | zhangsan | 88 | 102 |
mysql> select num from score where xingming=‘zhangsan’;
±-----+
| num |
±-----+
| 101 |
| 102 |
±-----+
mysql> select count(xingming) from score where exists(select num from score where xingming=‘zhangsan’);
±----------------+
| count(xingming) |
±----------------+
| 4|

NULL值

null:真空(什么都没有)
‘’:空气(还有空气)
●表示缺失的值
●与数字0或者空白(spaces)是不同的
●使用is null或is not null进行判断
●null值和空值(’’)的区别
空值长度为0,不占空间;null值的长度为null,占用空间
is null无法判断空值
空值使用“=”或者“<>”来处理
count()计算时,null会忽略,空值会加入计算

NULL值和空值的区别
空值长度为0,不占空间;NULL值的长度为NULL,占用空间
IS NULL无法判断空值
空值使用“=”或者“<>”来处理
COUNT()计算时,NULL会忽略,空值会加入计算

实验:验证NULL值
mysql> insert into score values(201009,19,‘liming’,78,default);
mysql> select * from score;//发现添加的default为NULL
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | 101 |
| 201006 | 18 | zhangsan | 80 | 101 |
| 201404 | 17 | zhaoliu | 95 | 101 |
| 201008 | 18 | zhangsan | 88 | 102 |
| 201009 | 19 | liming | 78 | NULL |
±-------±---------±---------±--------±-----+
mysql> insert into score values(201010,20,‘lining’,78,0);
mysql> select * from score;//发现0不是空格
±-------±---------±---------±--------±-----+
| xuehao | nianling | xingming | chengji | num |
±-------±---------±---------±--------±-----+
| 201003 | 18 | wangwu | 80 | 101 |
| 201006 | 18 | zhangsan | 80 | 101 |
| 201404 | 17 | zhaoliu | 95 | 101 |
| 201008 | 18 | zhangsan | 88 | 102 |
| 201009 | 19 | liming | 78 | NULL |
| 201010 | 20 | lining | 78 | 0 |

mysql> alter table score add column class varchar(16);
mysql> desc score;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| xuehao | int(6) | NO | | NULL |
| nianling | int(2) | NO | | NULL | |
| xingming | varchar(20) | NO | | NULL | |
| chengji | int(3) | YES | | NULL | |
| num | int(3) | YES | | NULL | |
| class | varchar(16) | YES | | NULL | |
±---------±------------±-----±----±--------±------+
mysql> insert into score values(201011,18,‘wangfang’,65,default,’’); //添加2列,class为空值
mysql> insert into score values(201012,17,‘lisi’,55,default,’’);
mysql> select * from score;
±-------±---------±---------±--------±-----±------+
| xuehao | nianling | xingming | chengji | num | class |
±-------±---------±---------±--------±-----±------+
| 201003 | 18 | wangwu | 80 | 101 | NULL |
| 201006 | 18 | zhangsan | 80 | 101 | NULL |
| 201404 | 17 | zhaoliu | 95 | 101 | NULL |
| 201008 | 18 | zhangsan | 88 | 102 | NULL |
| 201009 | 19 | liming | 78 | NULL | NULL |
| 201010 | 20 | lining | 78 | 0 | NULL |
| 201011 | 18 | wangfang | 65 | NULL | |
| 201012 | 17 | lisi | 55 | NULL | |
±-------±---------±---------±--------±-----±------+

mysql> select count(),xingming from score where num is not null; //统计num列is not null的值
±---------±---------+
| count(
) | xingming |
±---------±---------+
| 5 | wangwu |
mysql> select xingming from score where num is not null;
±---------+
| xingming |
±---------+
| wangwu |
| zhangsan |
| zhaoliu |
| zhangsan |
| lining |
mysql> select xingming from score where class is not null;//统计class列is not null的值
±---------+
| xingming |
±---------+
| wangfang |
| lisi |
±---------+
mysql> select count(),xingming from score where class is not null;
±---------±---------+
| count(
) | xingming |
±---------±---------+
| 2 | wangfang |

|201003 | 18 | wangwu | 80 | 101 | NULL |
| 201006 | 18 | zhangsan | 80 | 101 | NULL |
| 201404 | 17 | zhaoliu | 95 | 101 | NULL |
| 201008 | 18 | zhangsan | 88 | 102 | NULL |
| 201009 | 19 | liming | 78 | NULL | NULL |
| 201010 | 20 | lining | 78 | 0 | NULL |
| 201011 | 18 | wangfang | 65 | NULL | |
| 201012 | 17 | lisi | 55 | NULL | |

mysql> update score set class=’’ where chengji in (select chengji from (select chengji from score where chengji >=80)a);//class列80分以上修改为空值
mysql> select * from score;
| 201003 | 18 | wangwu | 80 | 101 | |
| 201006 | 18 | zhangsan | 80 | 101 | |
| 201404 | 17 | zhaoliu | 95 | 101 | |
| 201008 | 18 | zhangsan | 88 | 102 | |
| 201009 | 19 | liming | 78 | NULL | NULL |
| 201010 | 20 | lining | 78 | 0 | NULL |
| 201011 | 18 | wangfang | 65 | NULL | |
| 201012 | 17 | lisi | 55 | NULL | |

正则表达式

根据指定的匹配模式匹配记录中符合要求的特殊字符
使用REGEXP关键字指定匹配模式
常用匹配模式
^ 匹配开始字符
$ 匹配结束字符
. 匹配任意字符

  • 匹配任意个前面的字符
  • 匹配前面字符至少1次
    p1|p2 匹配p1或者p2
    […] 匹配字符集中的任意一个字符
    [^…]匹配不在中括号内的任何字符
    {n} 匹配前面的字符串n次
    {n,m} 匹配前面的字符串至少n次,至多m次
    验证:
    mysql> select xuehao,xingming,chengji from score where xingming regexp ‘^z’;//查询z开头的记录
    ±-------±---------±--------+
    | xuehao | xingming | chengji |
    ±-------±---------±--------+
    regexp ‘[lmn]’;//查看包含l、m、n任意的记录
    ±-------±---------±--------+| 201006 | zhangsan | 80 |
    | 201404 | zhaoliu | 95 |
    | 201008 | zhangsan | 88 |
    ±-------±---------±--------+
    mysql> select xuehao,xingming,chengji from score where xingming regexp ‘g$’;//查询以g结尾的记录
    ±-------±---------±--------+
    | xuehao | xingming | chengji |
    ±-------±---------±--------+
    | 201009 | liming | 78 |
    | 201010 | lining | 78 |
    | 201011 | wangfang | 65 |
    ±-------±---------±--------+
    mysql> select xuehao,xingming,chengji from score where xingming regexp ‘zha’;//查询包含zha的记录
    ±-------±---------±--------+
    | xuehao | xingming | chengji |
    ±-------±---------±--------+
    | 201006 | zhangsan | 80 |
    | 201404 | zhaoliu | 95 |
    | 201008 | zhangsan | 88 |
    ±-------±---------±--------+
    mysql> select xuehao,xingming,chengji from score where xingming
    | xuehao | xingming | chengji |
    ±-------±---------±--------+
    | 201003 | wangwu | 80 |
    | 201006 | zhangsan | 80 |
    | 201404 | zhaoliu | 95 |
    | 201008 | zhangsan | 88 |
    | 201009 | liming | 78 |
    | 201010 | lining | 78 |
    | 201011 | wangfang | 65 |
    | 201012 | lisi | 55 |
    mysql> select xuehao,xingming,chengji from score where xingming regexp ‘l.s.’;//查看包含l s 类型的记录
    ±-------±---------±--------+
    | xuehao | xingming | chengji |
    ±-------±---------±--------+
    | 201012 | lisi | 55 |
    ±-------±---------±--------+

MySQL进阶查询
或者w关系开头的记录
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 201003 | wangwu | 80 |
| 201006 | zhangsan | 80 |
| 201404 | zhaoliu | 95 |
| 201008 | zhangsan | 88 |
| 201011 | wangfang | 65 |
±-------±---------±--------+
mysql> select xuehao,xingming,chengji from score where xingming regexp ‘[^zh|w]’;//匹配不包含zh或者w关系的记录,但有其他的记录,故全部显示
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 201003 | wangwu | 80 |
| 201006 | zhangsan | 80 |
| 201404 | zhaoliu | 95 |
| 201008 | zhangsan | 88 |
| 201009 | liming | 78 |
| 201010 | lining | 78 |
| 201011 | wangfang | 65 |
| 201012 | lisi | 55 |
±-------±---------±--------+

mysql> select xuehao,xingming,chengji from score where xingming regexp ‘[zh|w]’;//匹配不包含zh或者w关系开头的记录,但有其他的记录,故全部显示
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 201009 | liming | 78 |
| 201010 | lining | 78 |
| 201012 | lisi | 55 |
±-------±---------±--------+

新增3列数据,为下面做实验
mysql> insert into score values(2014,19,‘dapeeg’,52,103,003);
mysql> insert into score values(201015,19,‘dapeeeg’,51,106,006);
mysql> insert into score values(201014,11,‘dapeg’,88,106,001);
mysql> select * from score;
| 201003 | 18 | wangwu | 80 | 101 | |
| 201006 | 18 | zhangsan | 80 | 101 | |
| 201404 | 17 | zhaoliu | 95 | 101 | |
| 201008 | 18 | zhangsan | 88 | 102 | |
| 201009 | 19 | liming | 78 | NULL | NULL |
| 201010 | 20 | lining | 78 | 0 | NULL |
| 201011 | 18 | wangfang | 65 | NULL | |
| 201012 | 17 | lisi | 55 | NULL | |
| 2014 | 19 | dapeeg | 52 | 103 | 3 |
| 201015 | 19 | dapeeeg | 51 | 106 | 6 |
| 201014 | 11 | dapeg | 88 | 106 | 1 |
±-------±---------±---------±--------±-----±------+

mysql> select xuehao,xingming,chengji from score where xingming regexp ‘ee*’;//匹配包含一个e以上开头的记录
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 2014 | dapeeg | 52 |
| 201015 | dapeeeg | 51 |
| 201014 | dapeg | 88 |
±-------±---------±--------+
mysql> select xuehao,xingming,chengji from score where xingming regexp ‘e{2}’;//匹配包含二个e以上开头的记录
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 2014 | dapeeg | 52 |
| 201015 | dapeeeg | 51 |
±-------±---------±--------+
mysql> select xuehao,xingming,chengji from score where xingming regexp ‘e{3,5}’;//匹配包含三个到五个e开头的记录
±-------±---------±--------+
| xuehao | xingming | chengji | “eeee*”:表示含有3个e以上
±-------±---------±--------+
| 201015 | dapeeeg | 51 |
±-------±---------±--------+

mysql> select xuehao,xingming,chengji from score where xingming regexp ‘e+’;//匹配包含一个e以上开头的记录
±-------±---------±--------+
| xuehao | xingming | chengji |
±-------±---------±--------+
| 2014 | dapeeg | 52 |
| 201015 | dapeeeg | 51 |
| 201014 | dapeg | 88 |

运算符

用于对记录中的字段值进行运算
运算符的分类
算术运算符
比较运算符
逻辑运算符
位运算符
MySQL进阶查询
MySQL进阶查询
查看表字段类型 decimal:小数点位

MySQL进阶查询

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

等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0.如果比较的两者有一个值是NULL,则比较的结果就是NULL。其中字符比较是根据ASCII码来判断的,如果ASCII码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相等。例如,等于运算符在数字、字符串和表达式上使用,具体操作如下所示。
MySQL进阶查询
从以上查询来看:
如果两者都输整数,则按照整数值进行比较。
如果一个整体一个字符串,则会自动将字符串转换为数字,再进行比较。
如果两者都是字符串,则按照字符串进行比较
如果两者中至少有一个值是NULL,则比较的结果是NULL。

不等于运算符
不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。
如果不相等则返回1,如果相等则返回0,这点正好跟等于返回值相反。需要注意的是不等于运算符不能用于判断NULL。例如,关于数字、字符串和表达式的不等于运算符的使用,具体操作如下:
MySQL进阶查询
大于、大于等于、小于、小于等于运算符
大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回1,否则返回0,同样不能用于判断NULL。
小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回1,否则返回0,同样不能用于判断NULL。
大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回1,否则返回0,不能用于判断NULL。
小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回1,否则返回0,不能用于判断NULL
例如,关于大于、大于等于、小于、小于等于运算符的使用,具体操作如下所示。
MySQL进阶查询

IS NULL、IS NOT MULL
IS NULL判断一个值是否为NULL,如果为NULL返回1,否则返回0、
IS NOT NULL判断一个值是否不为NULL,如果不为NULL返回1,否则返回0。

例如,关于数字、字符和NULL值的运用,具体操作如下所示。
MySQL进阶查询
IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无NULL这个关建字的区别,同时返回值不同。

BETWEEN AND
BETWEEN AND比较运算通常用于判断一个值是否落在某两个值之间。例如,判断某个数字是否在另外两个数字之间,也可以判断某文字字母是否在另外两个字母之间,具体操作,如下所示
MySQL进阶查询
LEAST、GREATEST
LEAST:当有两个或者多个参数时,返回其中最小值。如果其中一个值为NULL,则返回结果就为NULL。
GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为NULL,则返回结果就为NULL。
例如,若要判断一组数字或字母中哪个最小、哪个最大,可以通过使用LEAST和GREATEST来实现,具体操作如下所示:
MySQL进阶查询
从以上结果可以看出,LEAST比较的参数为数字时,返回的是其中最小的值;当比较的参数为字符串时,返回字母表中最靠前的位置。GREATEST比较的参数为数字时,返回的是其中最大的值;当比较的参数为字符串时,返回字母表中顺序最靠后的字符。

IN、NOT IN
IN判断一个值是否在对应的列表中,如果是返回1,否则返回0.
NOT IN判断一个值是否不在对应的列表中如果不是返回1,否则返回0.
例如,判断某数字是否在一组数字中,也可判断某字符是否在一组字符中,具体操作如下所示
MySQL进阶查询

LIKE、NOT LIKE
LIKE用来匹配字符串,如果屁屁成功则返回1,反之返回0。LIKE支持两种通配符:‘%’用于匹配任意数目的字符,而‘_’只能匹配一个字符。NOT LIKE正好跟LIKE相反,如果没有匹配成功则返回1,反之返回0.
例如,若要判断某字符串能否匹配成功,分单字符匹配和多字符匹配,也可以判断不匹配,具体操作如下所示。
MySQL进阶查询

3.逻辑运算符
逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回1,否则返回0,真和假也可以用TRUE和FALSE表示。MySQL中支持使用的逻辑运算符有四种,具体如下所示
MySQL进阶查询
1.逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用NOT或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果NOT后面的操作数为0时,所得值为1;如果操作数为非0时,所得值为0;如果操作数为NULL时,所得值为NULL。例如,对非0值和0值分别作逻辑非运算,具体操作如下所示。
MySQL进阶查询
2.逻辑与
逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回1,否则返回0.
逻辑与使用AND或者&&表示。例如,对非0值、0值和NULL值分别作逻辑与运算,具体操作如下所示。
MySQL进阶查询
3.逻辑或
逻辑或表示包含的操作数,任意一个为非零值并不是NULL值时,返回1,否则返回0.逻辑或通常使用OR来表示。例如,对非0值、0值和NULL值分别做逻辑或运算,具体操作如下所示。
MySQL进阶查询
发现||没有生效,是因为在安装数据库时默认开启PIPES_AS_CONCAT
PIPES_AS_CONCAT:将”|”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。

4.逻辑异或
两个非NULL值的操作数,如果两者都是0或者都是非0,则返回0;如果一个为0,另一个为非0,则返回结果为1;当任意一个值为NULL时,返回值为NULL。例如,对非0值、0值和NULL值分别作逻辑异或运算,具体操作如下所示。
MySQL进阶查询
附加:小口诀
与:有0出0,全1出1,1与null是null
或:有1出1,全0出0,0或null时得null
取反:取反null还是null
异或:相同出0,不同出1,任何数据异或null时得null

5.位运算符
位运算符实际上是对二进制数进行计算的运算符。MySQL内位运算会先将操作数变成二进制格式,然后进行为运算,最后将计算结果从二进制变回十进制格式,方便用户查看。MySQL主持6中位运算符,具体如下所示。
MySQL进阶查询
例如,对数字进行按位与、或和取反运算,具体操作如下所示。

MySQL进阶查询
10转换为二进制数是1010,15转换为二进制数是1111.
按位与运算(&),是对应的二进制位都是1的,它们的运算结果为1,否则为0,所
以10 & 15 的结果为10.
按位或运算(|),是对应的二进制位有一个或两个为1的,运算结果为1,否则为0,
所以10|15的结果为15.
按位异或运算(),是对应的二进制位不相同时,运算结果1,否则为0,所以1015
的结果为5.
按位取反(~),是对应的二进制数逐位反转,即1取反后变为0,0取反后变为1.数
字1的二进制是0001,取反后变为1110,数字5的二进制是0101,将1110和0101
进行求与操作,其结果是二进制的0100,转换为十进制就是4.
例如,对数字进行左移或者右移的运算,具体操作如下所示。

MySQL进阶查询

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

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

MySQL进阶查询
:= 赋值

连接查询

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

实验:内联,外联
mysql> create database stu; //创建stu库
mysql> create table chengji(id int(3) not null primary key auto_increment,age int(3) not null,name varchar(64) not null,score decimal(4,1));//创建chengji表
mysql> create table sushe(id int(3)not null primary key,num int(3) not null);//创建sushe表
mysql> insert into chengji(age,name,score) values(17,‘zhangsan’,60),(18,‘lisi’,70),(18,‘wangwu’,80),(17,‘zhaoliu’,95),(19,‘tianqi’,55);//id(主键自增长)为chengji表添加列
MySQL进阶查询
mysql> insert into sushe values(1,305),(2,306),(3,307),(8,308),(9,309),(10,310);//为宿舍表添加列
MySQL进阶查询
内连接:找两个表中的公共部分(只显示公共部分)
全部语句内联
MySQL进阶查询
特定部分内联
MySQL进阶查询

外联接:分为左连接和右连接。
左连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据。左表有的数据正常显示,右表没有的数据就用NULL显示。
MySQL进阶查询
右连接就是与左连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据。右表的数据正常显示,右表没有的数据就用NULL显示。
MySQL进阶查询
内连接:找两个表中的公共部分。
外连接:分为左连接和右连接。
左外连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据。左表有的数据正常显示,右表没有的数据就用NULL显示。
右外连接就是与左外连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据。右表的数据正常显示,左表没有的数据就用NULL显示。

在以上基础上建立视图(关联的列名不能相同,参看以前博客)