MySQL进阶查询

按关键字排序

使用ORDER BY语句来实现排序
排序可针对一个或多个字段
ASC:升序,默认排序方式
DESC:降序
ORDER BY的语法结构
SELECT (接要查询字段)column1, column2, ... FROM (接表)table_name ORDER BY column1,column2, ...(排序字段)ASC(可省略)|DESC;
ORDER BY后面跟字段名
ORDER BY语句排序
[root@server1 ~]# 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> select xuehao,xingming,chengji from chengji order by chengji ; //按单字段成绩进行升序,升序是默认的,ASC可以默认不写

在这里插入图片描述

mysql> select xuehao,xingming,chengji from chengji order by nianling desc,chengji desc;
//多字段升序,先按年龄降序,在年龄相同的情况下,成绩安装降序排列

在这里插入图片描述

mysql> select * from chengji order by nianling desc,chengji desc; //列出所有

在这里插入图片描述

对结果进行分组

使用GROUP BY语句来实现分组
通常结合聚合函数一起使用
可以按一个或多个字段对结果进行分组
GROUP BY的语法结构
对结果进行分组 GROUP BY分组
mysql> insert into chengji values(201006,18,'zhangsan',80),(201007,19,'lisi',70);//为成绩表添加新数据,来进行实验

在这里插入图片描述

mysql> select count(xingming),nianling from chengji group by nianling;//对结果进行分组

在这里插入图片描述

mysql> select count(xingming),nianling from chengji group by nianling order by count(xingming) desc;//对结果进行分组,并按照姓名重复次数进行降序 结合order by降序

在这里插入图片描述

限制条目结果

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

限制条目结果
查询所有数据
在这里插入图片描述

查询表中的前三行的列

在这里插入图片描述

表明从第4行起,连续看3行,第一个3表示offset偏移量,第二个3表示连续读3行
mysql> select * from chengji limit 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> select xuehao 学号, nianling 年龄,  xingming 姓名, chengji 成绩 from chengji  cj;单张表时写

在这里插入图片描述

多张表时:
mysql> select cj.xuehao 学号, cj.nianling 年龄,  cj.xingming 姓名, cj.chengji 成绩 from chengji  cj;

在这里插入图片描述

mysql> select count(*) from chengji; //统计多少列

在这里插入图片描述

AS作为连接语句
mysql> create table stu as select * from chengji;//将chengji表的内容复制给stu表
mysql> select * from stu;

在这里插入图片描述

查看二者的表结构,做对比//发现主键值PRI没有复制过来,额外信息也不会复制

在这里插入图片描述

通配符

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

配符%的用法
mysql> select * from chengji where xingming like 'z%'; //查找chengji表,xingming列中以z开头的字符

在这里插入图片描述

mysql> select * from chengji where xingming like '%u'; 查找chengji表,xingming列中以u结尾的字符

在这里插入图片描述

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则无显示,一个下划线只占一位 %:表示任意字符

在这里插入图片描述
两者结合使用
在这里插入图片描述

子查询

也称为内查询或嵌套查询
先于主查询被执行,其结果将作为外层主查询的条件
在增删改查中都可以使用子查询
支持多层嵌套
IN语句是用来判断某个值是否在给定的结果集中
子查询的用法
单层结果集
mysql> select xuehao as  学号, chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji >=60);

在这里插入图片描述

mysql> select xuehao as  学号, chengji as 成绩 from chengji where chengji in (select chengji from chengji where chengji >=60) order by chengji desc;//子查询,并且进行降序排列

在这里插入图片描述

多层结果集(增、删、改、查)
一:插入
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> 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|

视图

数据库中的虚拟表,这张虚拟表中不包含任何数据,只是做了数据映射;
创建视图并查看
mysql> create view v_cehngji as select * from chengji where score<=80;
mysql> select * from v_cehngji;
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  2 | wangcheng |    77 |     1 |
|  3 | lili      |    65 |     3 |
|  4 | yanyu     |    70 |     2 |
|  8 | lihao     |    77 |     3 |
+----+-----------+-------+-------+
4 rows in set (0.00 sec)
mysql> show table status;  ###查看视图表的信息

在这里插入图片描述

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 |
+--------+----------+---------+

在这里插入图片描述

或者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 |

运算符

用于对记录中的字段值进行运算

运算符的分类

  算术运算符
  比较运算符
  逻辑运算符
  位运算符

在这里插入图片描述
在这里插入图片描述

查看表字段类型  decimal:小数点位

在这里插入图片描述

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

在这里插入图片描述
附加:

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

等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0.如果比较的两者有一个值是NULL,则比较的结果就是NULL。其中字符比较是根据ASCII码来判断的,如果ASCII码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相等。例如,等于运算符在数字、字符串和表达式上使用,具体操作如下所示。
在这里插入图片描述
从以上查询来看:

如果两者都输整数,则按照整数值进行比较。
如果一个整体一个字符串,则会自动将字符串转换为数字,再进行比较。
如果两者都是字符串,则按照字符串进行比较
如果两者中至少有一个值是NULL,则比较的结果是NULL

不等于运算符

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

在这里插入图片描述
大于、大于等于、小于、小于等于运算符

大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回1,否则返回0,同样不能用于判断NULL。
小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回1,否则返回0,同样不能用于判断NULL。
大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回1,否则返回0,不能用于判断NULL。
小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回1,否则返回0,不能用于判断NULL
例如,关于大于、大于等于、小于、小于等于运算符的使用,具体操作如下所示。

在这里插入图片描述

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

例如,关于数字、字符和NULL值的运用,具体操作如下所示。
在这里插入图片描述

IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无NULL这个关建字的区别,同时返回值不同。
BETWEEN AND
BETWEEN AND比较运算通常用于判断一个值是否落在某两个值之间。例如,判断某个数字是否在另外两个数字之间,也可以判断某文字字母是否在另外两个字母之间,具体操作,如下所示

在这里插入图片描述
LEAST、GREATEST

LEAST:当有两个或者多个参数时,返回其中最小值。如果其中一个值为NULL,则返回结果就为NULL。
GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为NULL,则返回结果就为NULL

例如,若要判断一组数字或字母中哪个最小、哪个最大,可以通过使用LEAST和GREATEST来实现,具体操作如下所示:
在这里插入图片描述
从以上结果可以看出,LEAST比较的参数为数字时,返回的是其中最小的值;当比较的参数为字符串时,返回字母表中最靠前的位置。GREATEST比较的参数为数字时,返回的是其中最大的值;当比较的参数为字符串时,返回字母表中顺序最靠后的字符。

IN、NOT IN

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

例如,判断某数字是否在一组数字中,也可判断某字符是否在一组字符中,具体操作如下所示
在这里插入图片描述

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

3.逻辑运算符
逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回1,否则返回0,真和假也可以用TRUE和FALSE表示。MySQL中支持使用的逻辑运算符有四种,具体如下所示
在这里插入图片描述
1.逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用NOT或!表示。逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。如果NOT后面的操作数为0时,所得值为1;如果操作数为非0时,所得值为0;如果操作数为NULL时,所得值为NULL。例如,对非0值和0值分别作逻辑非运算,具体操作如下所示。
在这里插入图片描述
2.逻辑与
逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回1,否则返回0.
逻辑与使用AND或者&&表示。例如,对非0值、0值和NULL值分别作逻辑与运算,具体操作如下所示。
在这里插入图片描述
3.逻辑或
逻辑或表示包含的操作数,任意一个为非零值并不是NULL值时,返回1,否则返回0.逻辑或通常使用OR来表示。例如,对非0值、0值和NULL值分别做逻辑或运算,具体操作如下所示。
在这里插入图片描述

发现||没有生效,是因为在安装数据库时默认开启PIPES_AS_CONCAT
PIPES_AS_CONCAT:将”|”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。

4.逻辑异或
两个非NULL值的操作数,如果两者都是0或者都是非0,则返回0;如果一个为0,另一个为非0,则返回结果为1;当任意一个值为NULL时,返回值为NULL。例如,对非0值、0值和NULL值分别作逻辑异或运算,具体操作如下所示。
在这里插入图片描述

附加:小口诀
与:有00,全11,1与null是null
或:有11,全000或null时得null 
取反:取反null还是null
异或:相同出0,不同出1,任何数据异或null时得null

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

在这里插入图片描述

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,将11100101
进行求与操作,其结果是二进制的0100,转换为十进制就是4.

例如,对数字进行左移或者右移的运算,具体操作如下所示。

在这里插入图片描述

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

以上不管哪种运算符,在使用过程中都有优先级问题。运算符的优先级决定了不同的运算符,在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同,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> insert into sushe values(1,305),(2,306),(3,307),(8,308),(9,309),(10,310);//为宿舍表添加列

在这里插入图片描述

内连接:找两个表中的公共部分(只显示公共部分)
全部语句内联

在这里插入图片描述

特定部分内联

在这里插入图片描述

外联接:分为左连接和右连接。
左连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据。左表有的数据正常显示,右表没有的数据就用NULL显示。

在这里插入图片描述

右连接就是与左连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据。右表的数据正常显示,右表没有的数据就用NULL显示。

在这里插入图片描述

内连接:找两个表中的公共部分。
外连接:分为左连接和右连接。
左外连接就是以左表为准,去匹配右表,左表有多少条数据,结果就是多少条数据。左表有的数据正常显示,右表没有的数据就用NULL显示。
右外连接就是与左外连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据。右表的数据正常显示,左表没有的数据就用NULL显示。
在以上基础上建立视图(关联的列名不能相同,参看以前博客)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值