文章目录
- 1、按关键字排序
- 2、对结果进行分组
- 3、限制结果条目
- 4、AS的用法
- 5、经常使用通配符的用法
- 6、子查询
- 7、查看表的状态
- 8、建立视图(虚拟表)
- 9、结果集
- 10、exists的用法
- 11、NULL值
- 12、正则表达式
- 十3、运算符
- 十4、比较运算符
- 十5、逻辑运算符
- 十6、位运算符
- 十7、运算符的优先级
- 十8、链接查询
- 十9、数学函数
- 二10、聚合函数
- 二11、字符串函数
-
- 21.1 length(x) 返回字符串 x 的长度
- 21.2 trim() 返回去除指定格式的值
- 21.3 concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
- 21.4 upper(x)、lower(x) 将字符串 x 的全部字母变成大写字母
- 21.5 left(x,y) 、right(x,y)返回字符串 x 的前 y 个字符
- 21.6 repeat(x,y) 将字符串 x 重复 y 次
- 21.7 space(x) 返回 x 个空格
- 21.8 replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
- 21.9 strcmp(x,y) 比较 x 和 y,返回的值能够为-1,0,1
1、按关键字排序
使用SELECT语句能够将须要的数据从MySQL数据库中查询出来,若是对查询的结果进行排序,该如何去实现呢?
可使用 ORDER BY 语句来完成排序,并最终将排序后的结果返回给用户。这个语句的排序不光能够针对某一个字段,
也能够针对多个字段。如下就是MySQL中ORDER BY语句的语法结构。
mysql
1.1 语法结构
排序的字段能够根据具体需求进行选择,没有限制。排序的关键字可使用 ASC 或者DESC。ASC 是按照升序进行排序的,
是默认的排序方式,即 ASC 能够省略。SELECT 语句中若是没有指定具体的排序方式,则默认按 ASC 方式进行排序。
DESC 是按降序方式进行排列。
正则表达式
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
固然 ORDER BY 前面也可使用 WHERE 子句对查询结果进一步过滤。
例如,执行如下操做可查询等级大于等于 45 级的用户,并按降序进行排序。
sql
create database player; use player; create table player (id int(4) not null,name varchar(10) not null,level int(3) not null,primary key (`id`)); insert into player (id,name,level) values ('30','抢宝真多呀',47); insert into player (id,name,level) values ('15','新五皇·白胡子',46); insert into player (id,name,level) values ('63','新五皇–敬神',46); insert into player (id,name,level) values ('199','D 丶狙击王',46); insert into player (id,name,level) values ('298','唐三',46); insert into player (id,name,level) values ('51','新五皇·暴雪',45); insert into player (id,name,level) values ('272','D 丶抢人头辅助',45); mysql> select id,name,level from player where level>=45 order by level desc; +-----+----------------------+-------+ | id | name | level | +-----+----------------------+-------+ | 30 | 抢宝真多呀 | 47 | | 15 | 新五皇·白胡子 | 46 | | 63 | 新五皇–敬神 | 46 | | 199 | D 丶狙击王 | 46 | | 298 | 唐三 | 46 | | 51 | 新五皇·暴雪 | 45 | | 272 | D 丶抢人头辅助 | 45 | +-----+----------------------+-------+ 7 rows in set (0.00 sec)
对于排序要求,多数状况下一个字段就能够实现。其实 ORDER BY 语句也可使用多个字段来进行排序,
当排序的第一个字段相同的记录有多条的状况下,这些多条的记录再按 照第二个字段进行排序。
例如,执行如下操做可查询等级在 45 级及以上的用户,并以 level 降序排列和 id 降序排列。
数据库
mysql> select id,name,level from player where level>=45 order by level desc,id desc; +-----+----------------------+-------+ | id | name | level | +-----+----------------------+-------+ | 30 | 抢宝真多呀 | 47 | | 298 | 唐三 | 46 | | 199 | D 丶狙击王 | 46 | | 63 | 新五皇–敬神 | 46 | | 15 | 新五皇·白胡子 | 46 | | 272 | D 丶抢人头辅助 | 45 | | 51 | 新五皇·暴雪 | 45 | +-----+----------------------+-------+ 7 rows in set (0.00 sec)
以上结果不难看出order by 后面第一个参数优先级高,level先进行倒叙排序,而后是id进行排序,而且level有同样的值的记录时,id是在level值同样的记录里进行倒叙排列。bash
order by 使用时要注意函数
- ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,
- 优先级是按前后顺序而定。下面以A和B分别表示两个字段。
- ##ORDER BY A,B desc 指A用升序,B用降序;##
- ##ORDER BY A asc,B desc 指A用升序,B用降序;##
- ##ORDER BY A desc,B desc 指A用降序,B用降序;##
2、对结果进行分组
经过 SQL 查询出来的结果,还能够对其进行分组,使用 GROUP BY 语句来实现。
GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”
划分红若干个“小区域”,而后针对这些个“小区域”进行数据处理。
GROUP BY一般都是结合聚合函数一块儿使用的,经常使用的聚合函数包括:
计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),
这些聚合函数的用法在后面函数小节会有更详细的讲解。GROUP BY 分组的时候能够按一个或多个字段对结果进行分组处理。
性能
2.1 语法结构
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator valueGROUP BY column_name;
GROUP BY除了配合聚合函数一块儿使用外,还能够引入WHERE子句。首先经过WHERE过滤掉一部分不符合需求的查询结果,
而后再对结果进行分组。若是有排序的需求, 也能够引入ORDER BY语句。例如,执行如下操做便可统计等级在 45 级及以上,
以等级为分组,每一个等级有多少人。
学习
mysql> select count(name),level from player where level>=45 group by level; +-------------+-------+ | count(name) | level | +-------------+-------+ | 2 | 45 | | 4 | 46 | | 1 | 47 | +-------------+-------+ 3 rows in set (0.00 sec)
从以上结果能够看出,每一个等级的人数已经统计出来了,可是数量是无序的。若是结果条目变得更多,
很难一眼看出哪一个等级的人数是最多的,因此须要对数量进行排序。而GROUP BY 结合 ORDER BY
便可实现分组并排序的查询。例如,查询等级在 45 级及以上, 按等级进行分组,并将每一个等级的人
数按降序排序,具体操做以下。
测试
mysql> select count(name),level from player where level>=45 group by level order by count(name) desc; +-------------+-------+ | count(name) | level | +-------------+-------+ | 4 | 46 | | 2 | 45 | | 1 | 47 | +-------------+-------+ 3 rows in set (0.00 sec)
排序后的结果一目了然,方便用户获取用户最多的等级信息。大数据
3、限制结果条目
在使用 MySQL SELECT 语句进行查询时,结果集返回的是全部匹配的记录。有时候仅须要返回第
一行或者前几行,这时候就须要用到 LIMIT 子句。
3.1 语法结构
SELECT column1, column2, ... FROM table_name LIMIT [offset,] number
LIMIT 的第一个参数是位置偏移量(可选参数),是设置 MySQL 从哪一行开始显示。
若是不设定第一个参数,将会从表中的第一条记录开始显示。须要注意的是,
第一条记录的位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。
若是 SELECT 查询出的结果记录比较多,用户查看不是很方便。这个时候能够返回固定的、有限的记录数量,
使用 MySQL 数据库的 LIMIT 子句便可实现。LIMIT 子句是一种简单的分页方法,
它的使用减小了数据结果的返回时间,提升了执行效率,也解决了因为数据量过大从而致使的性能问题。
例如,执行如下操做便可查询表的前 3 个用户的信息。
3.2 环境创造
create table kgc( -> id int(4) not null primary key, -> user_name char(10) not null, -> level int(4) not null, -> hobby int(4) not null); insert into kgc (id,user_name,level,hobby) values ('1','zhangshan','88',1); insert into kgc (id,user_name,level,hobby) values ('2','lisi','77',2); insert into kgc (id,user_name,level,hobby) values ('3','wangwu','66',1); insert into kgc (id,user_name,level,hobby) values ('4','zhaoliu','66',3); insert into kgc (id,user_name,level,hobby) values ('5','tianqi','90',2); insert into kgc (id,user_name,level,hobby) values ('6','wangba','60',2);
查询前3个用户的信息
mysql> select * from kgc limit 3; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 2 | lisi | 77 | 2 | | 3 | xiaoming | 66 | 1 | +----+-----------+-------+-------+ 3 rows in set (0.00 sec)
查询第三行后面的两行
mysql> select * from kgc limit 3,2; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 4 | zhaoliu | 66 | 3 | | 5 | tianqi | 90 | 2 | +----+-----------+-------+-------+ 2 rows in set (0.00 sec)
4、AS的用法
4.1 设置别名
在MySQL查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者屡次使用相同的表,
能够给字段列或表设置别名。使用的时候直接使用别名,简洁明了,加强可读性。设置别名使用AS语句,
列的别名语法结构:
mysql> select i.user_name as 姓名,i.level as 成绩 from kgc as i; +-----------+--------+ | 姓名 | 成绩 | +-----------+--------+ | zhangshan | 88 | | lisi | 77 | | xiaoming | 66 | | zhaoliu | 66 | | tianqi | 90 | | wangba | 60 | +-----------+--------+ 6 rows in set (0.00 sec)
4.2 做为链接语句
as可做为链接语句,可克隆别的表结构,克隆后的表和原先的表数据类型是同样的,可是约束条件不能克隆。
mysql> create table tmp as select * from kgc where level>=80; mysql> select * from tmp; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 5 | tianqi | 90 | 2 | +----+-----------+-------+-------+ 2 rows in set (0.00 sec)
5、经常使用通配符的用法
通配符主要用于替换字符串中的部分字符,经过部分字符的匹配将相关结果查询出来。
一般通配符都是跟 LIKE 一块儿使用的,并协同 WHERE 子句共同来完成查询任务。
经常使用的通配符有两个,分别是:
%:百分号表示零个、一个或多个字符
_:下划线表示单个字符
like的做用是模糊查询
5.1 %的用法
mysql> select * from kgc where user_name like 'z%'; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 4 | zhaoliu | 66 | 3 | +----+-----------+-------+-------+ 2 rows in set (0.00 sec)
5.2 _的用法
mysql> select * from kgc where user_name like 'l_s_'; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 2 | lisi | 77 | 2 | +----+-----------+-------+-------+ 1 row in set (0.00 sec)
5.3 二者结合使用
mysql> select id,user_name,level from kgc where user_name like '_es%'; +----+-----------+-------+ | id | user_name | level | +----+-----------+-------+ | 7 | leslieF | 70 | +----+-----------+-------+ 1 row in set (0.00 sec)
6、子查询
子查询也被称做内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另外一个查询语句子查询语句是先于主查询语句被执行的,其结果做为外层的条件返回给主查询进行下一步的查询过滤。子查询不只能够在 SELECT 语句中使用,在 INERT、UPDATE、DELETE中也一样适用。在嵌套的时候,子查询内部还能够再次嵌套新的子查询,也就是说能够多层嵌套。
在开始实际的举例以前,先来学习一下IN 这个操做符的用法,IN用来判断某个值是否
##在给定的结果集中,一般结合子查询来使用。IN 的语法结构以下##
<表达式> [NOT] IN <子查询> ```bash mysql> select * from kgc where id in (1,3,5,7) +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 3 | xiaoming | 66 | 1 | | 5 | tianqi | 90 | 2 | | 7 | leslieF | 70 | 2 | +----+-----------+-------+-------+ 4 rows in set (0.00 sec)
挨个遍历数据,可是没有的数据不能显示,内部语句执行的结果做为外部语句执行的条件
mysql> create table num (id int(4)); Query OK, 0 rows affected (0.01 sec) mysql> insert into num values (1),(3),(5),(7); Query OK, 4 rows affected (0.00 sec)Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from num; +------+ | id | +------+ | 1 | | 3 | | 5 | | 7 | +------+ 4 rows in set (0.00 sec)
内外层数据类型必须统一
不然会报错
嵌套举例
mysql> select * from kgc where id in (select id from num); +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 3 | xiaoming | 66 | 1 | | 5 | tianqi | 90 | 2 | | 7 | leslieF | 70 | 2 | +----+-----------+-------+-------+ 4 rows in set (0.00 sec)
7、查看表的状态
可查询表中几乎一切信息,包括存储引擎
show table status;
8、建立视图(虚拟表)
视图是真实表的一个映射,只具备读的功能,并且只能读往视图中添加的数据
mysql> create view v_score as select * from kgc where level >= 80; Query OK, 0 rows affected (0.00 sec) mysql> select * from v_score; +----+-----------+-------+-------+ | id | user_name | level | hobby | +----+-----------+-------+-------+ | 1 | zhangshan | 88 | 1 | | 5 | tianqi | 90 | 2 | +----+-----------+-------+-------+ 2 rows in set (0.01 sec)
9、结果集
这就是个结果集
想要读取结果集当中的某个属性,得给结果集起个别名,将其视为一个总体
from 后面跟结果集 就要加别名
错误示范:
mysql> select id from (select id,user_name from kgc); ERROR 1248 (42000): Every derived table must have its own alias
mysql> select a.id from (select id,user_name from kgc)a; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | +----+ 7 rows in set (0.00 sec)
10、exists的用法
exists 是测试子语句中的数值存不存在的意思,下例语句的意思是,若是表中存在zhangshan,就统计表中的记录条数
mysql> select count(*) from kgc where exists (select * from kgc where user_name='zhangshan'); +----------+ | count(*) | +----------+ | 7 | +----------+ 1 row in set (0.00 sec)
输入一个不存在的用户名,测试可否统计记录
mysql> select count(*) from kgc where exists (select * from kgc where user_name='xxxoo'); +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec)
11、NULL值
- 表示缺失的值
- 与数字0或者空白(spaces)是不一样的
- 使用IS NULL 或 IS NOT NULL 进行判断
- NULL值和空值的区别
- 空值长度为0,不占空间;NULL值的长度为NULL,占用空间
- IS NULL 没法判断空值
- 空值使用"=“或者”<>"来处理
- COUNT()计算时,NULL会忽略,空值会加入计算
11.1 给表添加属性
语句结构
alter table 表名 add column 属性名 数据类型(int)等;
11.2 在统计时null值不会进入统计
建立测试环境 mysql> alter table kgc add column addr varchar(50); Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from kgc; +----+-----------+-------+-------+------+ | id | user_name | level | hobby | addr | +----+-----------+-------+-------+------+ | 1 | zhangshan | 88 | 1 | NULL | | 2 | lisi | 77 | 2 | NULL | | 3 | xiaoming | 66 | 1 | NULL | | 4 | zhaoliu | 66 | 3 | NULL | | 5 | tianqi | 90 | 2 | NULL | | 6 | wangba | 60 | 2 | NULL | | 7 | leslieF | 70 | 2 | NULL | +----+-----------+-------+-------+------+ 7 rows in set (0.00 sec) 成功添加进了一个属性,设置能够为空便于测试 将全部level属性值大于70的 addr属性值变为nj mysql> update kgc set addr='nj' where level >= 70; Query OK, 4 rows affected (0.00 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> select * from kgc; +----+-----------+-------+-------+------+ | id | user_name | level | hobby | addr | +----+-----------+-------+-------+------+ | 1 | zhangshan | 88 | 1 | nj | | 2 | lisi | 77 | 2 | nj | | 3 | xiaoming | 66 | 1 | NULL | | 4 | zhaoliu | 66 | 3 | NULL | | 5 | tianqi | 90 | 2 | nj | | 6 | wangba | 60 | 2 | NULL | | 7 | leslieF | 70 | 2 | nj | +----+-----------+-------+-------+------+ 7 rows in set (0.00 sec) 测试nullz值是否计入统计 mysql> select count(addr) from kgc; +-------------+ | count(addr) | +-------------+ | 4 | +-------------+ 1 row in set (0.00 sec) 不计入
11.3 在统计时空值会进入统计
将一行null值的记录修改成空值,测试是否会计入统计 mysql> update kgc set addr='' where user_name='wangba'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select count(addr) from kgc; +-------------+ | count(addr) | +-------------+ | 5 | +-------------+ 1 row in set (0.00 sec) 测试 mysql> select count(addr) from kgc; +-------------+ | count(addr) | +-------------+ | 5 | +-------------+ 1 row in set (0.00 sec)
12、正则表达式
MySQL 正则表达式一般是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。
MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达式的匹配模式,REGEXP 操做符所支持的匹配模式
正则表达式过滤开头为z的记录
mysql> select * from kgc where user_name regexp '^z'; +----+-----------+-------+-------+------+ | id | user_name | level | hobby | addr | +----+-----------+-------+-------+------+ | 1 | zhangshan | 88 | 1 | nj | | 4 | zhaoliu | 66 | 3 | NULL | +----+-----------+-------+-------+------+ 2 rows in set (0.00 sec)
过滤不含有xyz字符的记录
这里是指连续匹配
+----+-----------+-------+-------+------+ | id | user_name | level | hobby | addr | +----+-----------+-------+-------+------+ | 1 | zhangshan | 88 | 1 | nj | | 2 | lisi | 77 | 2 | nj | | 3 | xiaoming | 66 | 1 | NULL | | 4 | zhaoliu | 66 | 3 | NULL | | 5 | tianqi | 90 | 2 | nj | | 6 | wangba | 60 | 2 | | | 7 | leslieF | 70 | 2 | nj | +----+-----------+-------+-------+------+ 7 rows in set (0.01 sec)
十3、运算符
MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,
分别是:算术运算符、比较运算符、逻辑运算符和位运算符。下面分别对这四种运算符进行说明。
13.1 算术运算符
运算符 描述
- 加法
- 减法
- 乘法
/ 除法
% 取余数
例如,以 SELECT 命令来实现最基础的加减乘除运算,具体操做以下所示。
mysql> select 1+2 as addition, 2-1 as subtraction, 2*3 as multiplication, 4/2 as division, 7%2 as remainder;
13.2 比较运算符
比较运算符是查询数据记录时常用的一类运算符。经过使用比较运算符能够判断出
表中有哪些记录是符合条件的,若是比较的结果为真则返回 1,若是为假则返回 0,
比较的结果若是不肯定则返回 NULL。其中字符串在进行比较的时候默认是不区分大小写的,
若是要区分大小写能够经过 binary 关键字来实现。经常使用的比较运算符
运算符 描述 运算符 描述
= 等于 IS NOT NULL 判断一个值是否不为 NULL
大于 BETWEEN AND 二者之间
< 小于 IN 在集合中
= 大于等于 LIKE 通配符匹配
<= 小于等于 GREATEST 两个或多个参数时返回最大值
!=或<> 不等于 LEAST 两个或多个参数时返回最小值
IS NULL 判断一个值是否为 NULL REGEXP 正则表达式
MySQL当中成立的返回值不为0,不成立为0
俩个字母比的是底层的ASCll码
mysql> select 'a'>'b'; +---------+ | 'a'>'b' | +---------+ | 0 | +---------+ 1 row in set (0.00 sec)
等于运算符在字符串上的用法
比的是字符顺序和字符个数
mysql> select 'abc'='abc'; +-------------+ | 'abc'='abc' | +-------------+ | 1 | +-------------+ 1 row in set (0.00 sec)
或的关系,当b比a大时,数据库就默认baa大于abc,其他的不会在比较了
mysql> select 'abc'<'baa'; +-------------+ | 'abc'<'baa' | +-------------+ | 1 | +-------------+ 1 row in set (0.01 sec)
between的用法
下面语句是意思是:4是否是在2和6 的中间?
mysql> select 4 between 2 and 6; +-------------------+ | 4 between 2 and 6 | +-------------------+ | 1 | +-------------------+ 1 row in set (0.00 sec)
between是包含头和尾的
mysql> select 2 between 2 and 6; +-------------------+ | 2 between 2 and 6 | +-------------------+ | 1 | +-------------------+ 1 row in set (0.00 sec)
十4、比较运算符
14.1 least 求最小值 Greatest求最大值
mysql> select least(10,20,30),greatest(10,20,30); +-----------------+--------------------+ | least(10,20,30) | greatest(10,20,30) | +-----------------+--------------------+ | 10 | 30 | +-----------------+--------------------+ 1 row in set (0.00 sec)
支持小数
mysql> select least(10.1,20,30),greatest(10,20,30.1); +-------------------+----------------------+ | least(10.1,20,30) | greatest(10,20,30.1) | +-------------------+----------------------+ | 10.1 | 30.1 | +-------------------+----------------------+ 1 row in set (0.00 sec)
least若是放的是字符和数值的混合数据,是不能执行成功的
greatest:自动屏蔽不一样类型的数据
mysql> select least(10.1,20,30,'a'),greatest(10,20,30.1,'a'); +-----------------------+--------------------------+ | least(10.1,20,30,'a') | greatest(10,20,30.1,'a') | +-----------------------+--------------------------+ | 0 | 30.1 | +-----------------------+--------------------------+ 1 row in set, 2 warnings (0.00 sec)
14.2 IN NOT IN
IN 判断一个值是否在对应的列表中,若是是返回 1,不然返回 0。
NOT IN 判断一个值是否不在对应的列表中,若是不是返回 1,不然返回 0。
mysql> select 97 in ('a','b','c'),'a' not in ('a','b','c'); +---------------------+--------------------------+ | 97 in ('a','b','c') | 'a' not in ('a','b','c') | +---------------------+--------------------------+ | 0 | 0 | +---------------------+--------------------------+ 1 row in set, 3 warnings (0.00 sec)
14.3 LIKE NOT LIKE
LIKE 用来匹配字符串,若是匹配成功则返回 1,反之返回 0。LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,
而’_’只能匹配一个字符。NOT LIKE 正好跟 LIKE 相反,若是没有匹配成功则返回 1,反之返回 0。
mysql> select 'bdqn' like 'bdq_','kgc' like '%c', 'etc'Not like '%th'; +--------------------+-----------------+---------------------+ | 'bdqn' like 'bdq_' | 'kgc' like '%c' | 'etc'Not like '%th' | +--------------------+-----------------+---------------------+ | 1 | 1 | 1 | +--------------------+-----------------+---------------------+ 1 row in set (0.00 sec)
十5、逻辑运算符
逻辑运算符又被称为布尔运算符,一般用来判断表达式的真假,若是为真返回 1,不然返回 0,
真和假也能够用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种,
运算符 描述
NOT 或 ! 逻辑非
AND 或 && 逻辑与
OR 或 || 逻辑或
XOR 逻辑异或
15.1 逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,
把真变为假,把假变为真。若是 NOT 后面的操做数为 0 时,所得值为 1;若是操做数为非 0 时,所得值为 0;
若是操做数为 NULL 时,所得值为 NULL。
mysql> select not 0,!2,!(4-4); +-------+----+--------+ | not 0 | !2 | !(4-4) | +-------+----+--------+ | 1 | 0 | 1 | +-------+----+--------+ 1 row in set (0.00 sec)
15.2 逻辑与
逻辑与一般用于判断两个值或多个值的有效性,若是全部值都是真返回 1,不然返回 0
逻辑与使用 AND 或者&&表示。
- 0与NULL时结果为0
- 1与NULL时结果为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)
16.3 逻辑或
逻辑或表示包含的操做数,任意一个为非零值而且不是 NULL 值时,返回 1,不然返回0。
逻辑或一般使用 OR 或者||来表示。
- 注意:最好用OR,ll有时不能准确表达或的关系,有时候会合并
mysql> select 2 or 3, 2||0; +--------+------+ | 2 or 3 | 2||0 | +--------+------+ | 1 | 20 | +--------+------+ 1 row in set (0.05 sec)
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,'a' or 'c'; +--------+------------+ | 2 or 3 | 'a' or 'c' | +--------+------------+ | 1 | 0 | +--------+------------+ 1 row in set, 2 warnings (0.00 sec)
- 逻辑或 1和NULL在一块儿时,输出结果仍是 1
mysql> select 0 or NULL,1 or NULL; +-----------+-----------+ | 0 or NULL | 1 or NULL | +-----------+-----------+ | NULL | 1 | +-----------+-----------+ 1 row in set (0.00 sec)
15.4 逻辑异或
两个非 NULL 值的操做数,若是二者都是 0 或者都是非 0,则返回 0;若是一个为 0, 另外一个为非 0,则返回结果为 1;
当任意一个值为 NULL 时,返回值为 NULL。
mysql> select 0 xor 3,0 xor 0,0 xor NULL,1 xor NULL; +---------+---------+------------+------------+ | 0 xor 3 | 0 xor 0 | 0 xor NULL | 1 xor NULL | +---------+---------+------------+------------+ | 1 | 0 | NULL | NULL | +---------+---------+------------+------------+ 1 row in set (0.00 sec)
十6、位运算符
位运算符其实是对二进制数进行计算的运算符。MySQL 内位运算会先将操做数变成二进制格式,而后进行位运算,
最后在将计算结果从二进制变回到十进制格式,方便用户查看。MySQL 支持 6 种位运算符
运算符 描述
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移 >>按位右移
例子
取反1的二进制,取5的二进制,两者进行且的计算
1的二进制:0001
1的取反:1110
5的二进制:0101
1110
0101
将上面两者用且关系计算得出
0100就是4
mysql> select 5&~1; +------+ | 5&~1 | +------+ | 4 | +------+ 1 row in set (0.00 sec)
16.1 向左位移运算
mysql> select 1<<2; 0001 0100 4 +------+ | 1<<2 | +------+ | 4 | +------+ 1 row in set (0.00 sec)
16.2 向右位移运算
向右移动位数,多余的位数直接删掉
15>>2 1111 0011 3 mysql> select 15>>2; +-------+ | 15>>2 | +-------+ | 3 | +-------+ 1 row in set (0.00 sec)
十7、运算符的优先级
优先级 运算符 优先级 运算符 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 :=
十8、链接查询
MySQL 的链接查询,一般都是未来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。
首先,要肯定一个主表做为结果集,而后将其余表的行有选择性的链接到选定的主表结果集上。使用较多的链接查询包括:
内链接、左链接和右链接。
18.1 内链接查询
将两个表的id 链接起来 显示id和user_name 属性
mysql> select kgc.id,kgc.user_name from kgc inner join num on kgc.id=num.id; +----+-----------+ | id | user_name | +----+-----------+ | 1 | zhangshan | | 3 | xiaoming | | 5 | tianqi | | 7 | leslieF | +----+-----------+ 4 rows in set (0.00 sec)
用内链接的方法将kgc表中的id 和 uer_name属性显示出来,而且显示出hob表中的hob_name属性 ,将kgc表中的hobby属性和hob表中的id链接一块儿.
mysql> create table hob (id int(3) not null primary key auto_increment,hob_name varchar(10) not null); Query OK, 0 rows affected (0.07 sec) mysql> insert into hob(hob_name) values('云计算'),('大数据'),('人工智能'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc inner join hob on kgc.hobby=hob.id; +----+-----------+--------------+ | id | user_name | hob_name | +----+-----------+--------------+ | 1 | zhangshan | 云计算 | | 2 | lisi | 大数据 | | 3 | xiaoming | 云计算 | | 4 | zhaoliu | 人工智能 | | 5 | tianqi | 大数据 | | 6 | wangba | 大数据 | | 7 | leslieF | 大数据 | +----+-----------+--------------+ 7 rows in set (0.00 sec) mysql> select * from kgc; +----+-----------+-------+-------+------+ | id | user_name | level | hobby | addr | +----+-----------+-------+-------+------+ | 1 | zhangshan | 88 | 1 | nj | | 2 | lisi | 77 | 2 | nj | | 3 | xiaoming | 66 | 1 | NULL | | 4 | zhaoliu | 66 | 3 | NULL | | 5 | tianqi | 90 | 2 | nj | | 6 | wangba | 60 | 2 | | | 7 | leslieF | 70 | 2 | nj | +----+-----------+-------+-------+------+ 7 rows in set (0.00 sec)
18.2 左链接查询
MySQL 除了内链接,还可使用外链接。区别于 MySQL 外链接是将表分为基础表和参考表,再依据基础表返回知足条件或不知足条件的记录。外链接按照链接时表的顺序来分,
有左链接和右链接之分。
左链接也能够被称为左外链接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左链接以左侧表为基础表,接收左表的全部行,
并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的全部行以及右表中符合条件的行。
- 左链接是左表的优先级大,因此会根据左表的hobby进行排序,匹配右表的值
mysql> insert into hob(hob_name) values('云开发'),('云交付'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select kgc.id,kgc.user_name,hob.hob_name from kgc left join hob on kgc.hobby=hob.id; +----+-----------+--------------+ | id | user_name | hob_name | +----+-----------+--------------+ | 1 | zhangshan | 云计算 | | 3 | xiaoming | 云计算 | | 2 | lisi | 大数据 | | 5 | tianqi | 大数据 | | 6 | wangba | 大数据 | | 7 | leslieF | 大数据 | | 4 | zhaoliu | 人工智能 | +----+-----------+--------------+ 7 rows in set (0.00 sec)
18.3 右链接查询
右链接也被称为右外链接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右链接跟左链接正好相反,它是以右表为基础表,用于接收右表中的全部行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。
- 以右表为主,显示右表的所有信息,左表信息有则匹配
给右表添加一段属性 addr
mysql> alter table hob add column addr varchar(50); mysql> select kgc.id,kgc.user_name,hob.hob_name,hob.addr from kgc right join hob on kgc.hobby=hob.id; +------+-----------+--------------+------+ | id | user_name | hob_name | addr | +------+-----------+--------------+------+ | 1 | zhangshan | 云计算 | NULL | | 2 | lisi | 大数据 | NULL | | 3 | xiaoming | 云计算 | NULL | | 4 | zhaoliu | 人工智能 | NULL | | 5 | tianqi | 大数据 | NULL | | 6 | wangba | 大数据 | NULL | | 7 | leslieF | 大数据 | NULL | | NULL | NULL | 云开发 | NULL | | NULL | NULL | 云交付 | NULL | +------+-----------+--------------+------+ 9 rows in set (0.00 sec)
十9、数学函数
MySQL提供了实现各类功能的函数
经常使用的函数分类
1.数学函数
2.聚合函数
3.字符串函数
4.日期时间函数
##经常使用的数学函数##
abs(x) 返回x的绝对值
rand() 返回0-1的随机数
mod(x,y) 返回x除以y之后的余数
power(x,y) 返回x的y次方
round(x) 返回离x最近的整数
round(x,y) 保留x的y位小数四舍五入后的值
sqrt(x) 返回x的平方根
truncate(x,y) 返回数字x截断为y位小数的值
ceil(x) 返回大于或等于x的最小整数
floor(x)返回小于或等于x的最大整数
19.1 abs(x) 返回x的绝对值
mysql> select abs(-10); +----------+ | abs(-10) | +----------+ | 10 | +----------+ 1 row in set (0.00 sec)
19.2 rand() 返回0-1的随机数
mysql> select rand(); +--------------------+ | rand() | +--------------------+ | 0.0633721929633731 | +--------------------+ 1 row in set (0.00 sec)
如何利用rand控制取值范围?
如下取0-100的随机数
mysql> select rand()*100; +-------------------+ | rand()*100 | +-------------------+ | 89.42384467406556 | +-------------------+ 1 row in set (0.00 sec)
19.3 mod(x,y) 返回x除以y之后的余数
mysql> select mod(7,2); +----------+ | mod(7,2) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
19.4 power(x,y) 返回x的y次方
mysql> select power(2,3); +------------+ | power(2,3) | +------------+ | 8 | +------------+ 1 row in set (0.00 sec)
19.5 round(x) 返回离x最近的整数
mysql> select round(1.4); +------------+ | round(1.4) | +------------+ | 1 | +------------+ 1 row in set (0.00 sec)
round(x,y) 保留x的y位小数四舍五入后的值
保留小数点后1位而且四舍五入
mysql> select round(1.49,1); +---------------+ | round(1.49,1) | +---------------+ | 1.5 | +---------------+ 1 row in set (0.00 sec)
19.6 sqrt(x) 返回x的平方根
mysql> select sqrt (8); +--------------------+ | sqrt (8) | +--------------------+ | 2.8284271247461903 | +--------------------+ 1 row in set (0.00 sec)
19.7 truncate(x,y) 返回数字x截断为y位小数的值
mysql> select truncate(1.449,2); +-------------------+ | truncate(1.449,2) | +-------------------+ | 1.44 | +-------------------+ 1 row in set (0.00 sec)
19.8 ceil(x)、floor(x)返回大于或等于x的最小整数
mysql> select ceil(1.1),floor(1.1); +-----------+------------+ | ceil(1.1) | floor(1.1) | +-----------+------------+ | 2 | 1 | +-----------+------------+ 1 row in set (0.00 sec)
取余限制范围 0 ,1 ,2
限制思路:0-100之内的数除以3,余数都是0 1 2 因此输出结果也都是0-2这个范围,ceil是大于x的最小整数
mysql> select mod(ceil(rand()*100),3); +-------------------------+ | mod(ceil(rand()*100),3) | +-------------------------+ | 2 | +-------------------------+ 1 row in set (0.00 sec) mysql> select mod(ceil(rand()*100),3); +-------------------------+ | mod(ceil(rand()*100),3) | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec) mysql> select mod(ceil(rand()*100),3); +-------------------------+ | mod(ceil(rand()*100),3) | +-------------------------+ | 0 | +-------------------------+ 1 row in set (0.00 sec)
二10、聚合函数
MySQL 数据库函数中专门有一组函数是特地为库内记录求和或者对表中的数据进行集中归纳而设计的,这些函数被称做聚合函数。
经常使用的聚合函数
avg()返回指定列的平均值
count()返回指定列中非NULL值的个数
min()返回指定列的最小值
max()返回指定列的最大值
sum()返回指定列的全部值之和
20.1 avg()返回指定列的平均值
求kgc表中level属性的平均值
mysql> select avg(level) from kgc; +------------+ | avg(level) | +------------+ | 73.8571 | +------------+ 1 row in set (0.00 sec)
20.2 count()返回指定列中非NULL值的个数
这里的3,是做为一个值统计的
mysql> select count(3); +----------+ | count(3) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
统计表中 name属性 值的个数
mysql> select count(user_name) from kgc; +------------------+ | count(user_name) | +------------------+ | 7 | +------------------+ 1 row in set (0.00 sec)
20.3 min()返回指定列的最小值
mysql> select min(level) from kgc; +------------+ | min(level) | +------------+ | 60 | +------------+ 1 row in set (0.00 sec)
20.4 max()返回指定列的最大值
mysql> select max(level) from kgc; +------------+ | max(level) | +------------+ | 90 | +------------+ 1 row in set (0.00 sec)
20.5 sum()返回指定列的全部值之和
mysql> select sum(level) from kgc; +------------+ | sum(level) | +------------+ | 517 | +------------+ 1 row in set (0.00 sec)
二11、字符串函数
经常使用函数不只包括数学函数和聚合函数,还包含字符串函数,MySQL 为字符串的相关操做设计了丰富的字符串函数。
经常使用的字符串函数
length(x) 返回字符串 x 的长度
trim() 返回去除指定格式的值
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
upper(x) 将字符串 x 的全部字母变成大写字母
lower(x) 将字符串 x 的全部字母变成小写字母
left(x,y) 返回字符串 x 的前 y 个字符
right(x,y) 返回字符串 x 的后 y 个字符
repeat(x,y) 将字符串 x 重复 y 次
space(x) 返回 x 个空格
replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
strcmp(x,y) 比较 x 和 y,返回的值能够为-1,0,1
substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
reverse(x) 将字符串 x 反转
21.1 length(x) 返回字符串 x 的长度
mysql> select length('abdc'); +----------------+ | length('abdc') | +----------------+ | 4 | +----------------+ 1 row in set (0.00 sec)
空格也会占位置
mysql> select length(' bdc'); +----------------+ | length(' bdc') | +----------------+ | 4 | +----------------+ 1 row in set (0.00 sec)
空值不占空间
mysql> select length(''); +------------+ | length('') | +------------+ | 0 | +------------+ 1 row in set (0.00 sec)
NULL占空间,数据显示就叫NULL
mysql> select length(NULL); +--------------+ | length(NULL) | +--------------+ | NULL | +--------------+ 1 row in set (0.00 sec)
21.2 trim() 返回去除指定格式的值
trim 可以去除头尾空格
mysql> select length(trim(' abc')); +----------------------+ | length(trim(' abc')) | +----------------------+ | 3 | +----------------------+ 1 row in set (0.06 sec)
中间的格式是去除不掉的
mysql> select length(trim(' a bc')); +-----------------------+ | length(trim(' a bc')) | +-----------------------+ | 4 | +-----------------------+ 1 row in set (0.00 sec)
21.3 concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
mysql> select length(concat('abc','def')); +-----------------------------+ | length(concat('abc','def')) | +-----------------------------+ | 6 | +-----------------------------+ 1 row in set (0.00 sec)
21.4 upper(x)、lower(x) 将字符串 x 的全部字母变成大写字母
mysql> select upper('abc'),lower('ABC'); +--------------+--------------+ | upper('abc') | lower('ABC') | +--------------+--------------+ | ABC | abc | +--------------+--------------+ 1 row in set (0.00 sec)
21.5 left(x,y) 、right(x,y)返回字符串 x 的前 y 个字符
mysql> select left('abcdefg',3),right('abcdefg',2); +-------------------+--------------------+ | left('abcdefg',3) | right('abcdefg',2) | +-------------------+--------------------+ | abc | fg | +-------------------+--------------------+ 1 row in set (0.00 sec)
21.6 repeat(x,y) 将字符串 x 重复 y 次
mysql> select repeat('abc',3); +-----------------+ | repeat('abc',3) | +-----------------+ | abcabcabc | +-----------------+ 1 row in set (0.00 sec)
21.7 space(x) 返回 x 个空格
因为单单输入这条命令难以看到效果,因此有如下两种方法测试
(1)使用length便于观看
mysql> select length(concat('abc',space(3),'abc')); +--------------------------------------+ | length(concat('abc',space(3),'abc')) | +--------------------------------------+ | 9 | +--------------------------------------+ 1 row in set (0.00 sec)
(2)用concat也能进行验证
mysql> select concat('abc',space(3),'abc'); +------------------------------+ | concat('abc',space(3),'abc') | +------------------------------+ | abc abc | +------------------------------+ 1 row in set (0.00 sec)
21.8 replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
mysql> select replace('abcdefg','bc','12'); +------------------------------+ | replace('abcdefg','bc','12') | +------------------------------+ | a12defg | +------------------------------+ 1 row in set (0.00 sec)
删除字符
mysql> select replace('abcdefg','bc',''); +----------------------------+ | replace('abcdefg','bc','') | +----------------------------+ | adefg | +----------------------------+ 1 row in set (0.00 sec)
21.9 strcmp(x,y) 比较 x 和 y,返回的值能够为-1,0,1
mysql> select strcmp(4,5); +-------------+ | strcmp(4,5) | +-------------+ | -1 | +-------------+ 1 row in set (0.00 sec)
mysql> select strcmp(5,5); +-------------+ | strcmp(5,5) | +-------------+ | 0 | +-------------+ 1 row in set (0.00 sec)
mysql> select strcmp(6,5); +-------------+ | strcmp(6,5) | +-------------+ | 1 | +-------------+ 1 row in set (0.00 sec)
21.9.1 substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
mysql> select substring('abcdefg',3,3); +--------------------------+ | substring('abcdefg',3,3) | +--------------------------+ | cde | +--------------------------+ 1 row in set (0.01 sec)
21.9.2 reverse(x)将字符串 x 反转
mysql> select reverse('abc'); +----------------+ | reverse('abc') | +----------------+ | cba | +----------------+ 1 row in set (0.00 sec)