第六章 运算符和函数

回顾和概述#

子查询
出现在其他SQL语句中的SELECT子句,必须要出现在小括号内,子查询的外层可以是常见的SELECT,INSERT,UPDATE,DELETE语句,在子查询中可以包含多个关键字和条件,如:GROUP BY,ORDER BY,LIMIT以及相关的函数等
引发子查询的情况主要有三种:
1.由比较运算符引发的子查询
2.由IN和NOT IN引发的子查询
3.由EXIST或NOT EXIST引发的子查询

连接:在MySQL中的SELECT语句,包括多表更新,多表删除中,都可以使用连接
连接类型:
内连接:显示左表和右表都符合连接条件的记录
外连接:
左外连接:显示左表中的全部记录和右表中符合连接条件的记录
右外连接:显示右表中的全部记录和左表中符合连接条件的记录

CREATE...SELECT语句和INSERT...SELECT语句

这章主要学习MySQL数据库中的运算符和函数
根据功能可以分为:
1.字符函数
2.数值运算符与函数
3.比较运算符与函数
4.日期时间函数
5.信息函数
6.聚合函数
7.加密函数

字符函数

函数名称 描述
CONCAT() 字符连接
CONCAT)WS() 使用指定的分隔符进行字符连接
FORMAT() 数字格式化
LOWER() 转换成小写字母
UPPER() 转换成大写字母
LEFT() 获取左侧字符
RIGHT() 获取右侧字符

CONCAT():连接两个或多个字符串
演示:
SELECT CONCAT('imooc','MySQL');#将'imooc'和'MySQL'连接起来SELECT CONCAT('imooc','-','MySQL');#将'imooc'和'-'和'MySQL'连接起来在实际应用中如果存在一张表,有两个字段first_name和last_name,现在要把这两个字段连接起来查询,可以这样:SELECT CONCAT(first_name,last_name) AS fullname FROM test;#从test表中查询first_name和last_name字段进行连接`

CONCAT_WS():用分隔符连接两个或多个字符串。最少需要三个参数,第一个参数为分隔符,第二个,第三个以及后续的参数分别指的是需要连接的字符传
SELECT CONCAT_WS('|','A','B','C');采用'|'分隔符把ABC连接在一起
SELECT CONCAT_WS('-','imooc','MySQL','Functions');将imooc,MySQL,Function三个字符串用'|'连接起来

FORMAT():数字格式化,因为返回结果是字符型所以放到了字符函数里
示例演示:
SELECT FORMAT(12560.75,2);#格式化数字12560.75保留两位小数。得到的结果:12,560.75
SELECT FORMAT(12560.75,1);#保留1位小数。得到的结果:12,560.7
SELECT FORMAT(12560.75,0);#保留到整数位。得到的结果:12,560

LOWER():转换成小写字母
UPPER():转换成大写字母
示例演示:
LOWER('MySQL');#全部转换为小写,得到的结果为:mysql
UPPER('mysql');#全部转换为大写,得到的结果为:MYSQL

LEFT():获取左侧字符串,需要两个参数,第一个参数是要获取哪个字符串的内容,第二个参数是要取几位
示例演示:
SELECT LEFT('MySQL',2);#获取字符串"MySQL的前两位。结果为:My"
获取字符串前两位并且转换为小写:函数嵌套
SELECT LOWER(LEFT('MySQL',2));#获取字符串"MySQL"的前两位,然后转换成小写。结果为:my

RIGHT():获取右侧的字符串,需要两个参数
SELECT RIGHT('MySQL',3);#获取字符串'MySQL'的后三位。结果为:SQL

名称 描述
LENGTH() 获取字符串长度
LTRIM() 删除前导空格
RTRIN() 删除后续空格
TRIM() 删除前导和后续空格
SUBSTRING() 字符串截取
[NOT] LIKE 模式匹配
REPLACE() 字符串替换

LENGTH():获取字符串的长度
示例演示:
SELECT LENGTH('MySQL');#获取字符串'MySQL'的长度,结果为5
如果字符串中间含有空格,空格也算一位:
SELECT LENGTH('My SQL');#结果为6

LREIM():删除前导空格
RTRIM():删除后续空格
TRIM():删除前导和后续空格
示例演示:
SELECT LTRIM(' MySQL ');#字符串前边2个空格,后边有4个空格。看到前边的空格被删除了,但是看不到后边的空格有没有被删除
SELECT LENGTH(' MySQL ');#长度为11
SELECT LENGTH(LTRIM(' MySQL '));#长度为9
SELECT LENGTH(RTRIM(' MySQL '));#长度为7
SELECT LENGTH(TRIM(' MySQL '));#长度为5

TRIM()删除指定字符串:
示例演示:
删除指定前导字符串:
SELECT TRIM(LEADING '?' FROM '??MySQL???');#从字符串'??MySQL???'的前边删除?。结果为:'MySQL???'
删除指定后续字符串:
SELECT TRIM(TRAILING '?' FROM '??MySQL???');#从字符串'??MySQL???'的后边删除?。结果为:'??MySQL'
删除指定两边的字符串:
SELECT TRIM(LEADING '?' FROM '??MySQL???');#从字符串'??MySQL???'的两边删除?。结果为:'MySQL'
不能删除中间的,如:不能删除'??My??SQL???'中间的??
想要删除中间的字符,可以使用字符串替换函数REPLACE():有三个参数,第一个参数是源字符串,第二个参数是需要替换的字符串,第三个参数是替换成的字符串,为空就是替换成空(删除)
不仅仅是搜索到后就替换一次,只要源字符串中含有需要替换的字符串,都会进行替换
示例演示:
SELECT REPLACE('??My??SQL???','?','');#结果为'MySQL'

SUBSTRING():字符串截取函数,三个参数,第一个是需要截取的字符串,第二个是从哪个位置开始截取(和数组不一样,第一个位置为1),第三个是截取几个
示例演示:
SELECT SUBSTRING('MySQL',1,2);#结果为:'My'。从字符串'MySQL'中的第一个位置开始,截取两个字符
如果没有写第三个参数,默认为截取到字符串结尾
SELECT SUBSTRING('MySQL',3);#结果为:'SQL'。从字符串'MySQL'中的第3个位置开始,截取到最后
开始位置也可以是负值:表示从后边第几个字符开始:
SELECT SUBSTRING('MySQL',-1);#结果为:'L'。从字符串'MySQL'中的倒数第1个位置开始,截取到最后
第三个参数长度不能为负值,在某些编程语言中是可以的

[NOT] LIKE:模式匹配:
示例演示:
SELECT 'MySQL' LIKE 'M%';#结果为1(TRUE)在字符串'MySQL'中找到了'M%'的字符串,%代表0个或多个字符

在之前的test表中有一个first_name为tom%的名字
SELECT * FROM test WHERE frist_name LIKE '%o%';#查找test表中first_name含有o的记录

查找含有'%'的字符串
SELECT * FROM test WHERE frist_name LIKE '%%%';#错误,显示了所有结果,MySQL把中间那个%也当成了通配符
可以这样写:
SELECT * FROM test WHERE frist_name LIKE '%1%%' ESCAPE '1';#把1后边的字符当成普通字符而不是通配符

通配符中还有一个'_'代表一个任意字符

数值运算符和函数

数值运算符:+、-、*、/等
SELECT 3+4;#结果为7

函数

名称 描述
CEIL() 进一取整
FLOOR() 舍一取整
MOD() 取余数(取模)
POWER() 幂运算
ROUND() 四舍五入
TRUNCATE() 数字截取

CEIL():进一取整,只要有小数位,整数位就会加一
SELECT CEIL(3.01);#结果为4
与CEIL()相反的:小数位有多少都会舍去
SELECT FLOOR(3.99);#结果为3

DIV:整数除法,得到的结果为整数,舍去余数
SELECT 3/4;#结果为0.7500
SELECT 3 DIV 4;#结果为0

MOD:取余数(取模)可以对整数取模,也可以对浮点数取模(除数不能是浮点数),也可以写成%
SELECT 5 MOD 3;#结果为2
SELECT 5 % 3;#也可以用%
SELECT 5.3 MOD 3;#对浮点数取模,结果为2.3

POWER():幂运算
SELECT POWER(3,2);#3的2次方,结果为9

ROUND():四舍五入,两个参数,第一个是需要四舍五入的数字,第二个是保留的小数位是
SELECT ROUND(3.652,2);#对3.625四舍五入,保留两位小数,结果为3.5
SELECT ROUND(3.652,1);#保留一位小数,结果为3.7
位数如果写0,表示保留到整数位
SELECT ROUND(3.652,0);#结果为4

TRUNCATE():数字截取,两个参数,第一个需要截取的位数,第二个为保留的小数位数(可以为0)。只截取,不做四舍五入。
SELECT TRUNCATE(125.89,2);#对125.89截取,保留两位小数,结果不变,还是125.89
SELECT TRUNCATE(125.89,1);#保留一位小数,结果为125.8
SELECT TRUNCATE(125.89,1);#保留0位小数,结果为125
也可以写成-1,把相对应的整数位变成0(实际应用中不多)
SELECT TRUNCATE(125.89,-1);#保留-1位小数,结果为120

比较运算符和函数

名称 描述
[NOT] BETWEEN...AND... [不]在范围之内
[NOT] IN() [不]在列出值范围内
IS [NOT] NULL [不] 为空

例如:
SELECT 15 BETWEEN 1 AND 22;#数字15在1和22之间,结果为1
SELECT 35 BETWEEN 1 AND 22;#数字35在1和22之间,结果为0
SELECT 35 NOT BETWEEN 1 AND 22;#数字35不在1和22之间,结果为1

SELECT 10 IN(5,10,15,20);#10在(5,10,15,20)之中,结果为1
SELECT 13 IN(5,10,15,20);#10在(5,10,15,20)之中,结果为0

SELECT NULL IS NULL;#结果为1
SELECT '' IS NULL;#空的字符串为空,结果为0,空字符串不是空
SELECT 0 IS NULL;#0是空,结果为0,0不是空

在之前的数据表test中:

Paste_Image.png

最后一个first_name为空
SELECT * FROM test WHERE first_name IS NULL;#选择first_name为空的记录,结果为最后一条记录
SELECT * FROM test WHERE first_name IS NOT NULL;#选择first_name不为空的记录,结果为前三条记录

日期时间函数

名称 描述
NOW() 当前日期和时间
CURDATE() 当前日期
CURTIME() 当前时间
DATE_ADD() 日期变化
DATEDIFF() 日期差值
DATE_FORMAT() 日期格式化

SELECT NOW();#打印出当前日期时间
SELECT CURDATE();#打印当前日期
SELECT CURTIME();#打印当前时间

DATE_ADD():日期变化。不仅仅是增加日期,还能减少
SELECT DATE_ADD('2014-3-12',INTERVAL 365 DAY);#在2014-3-12上加365天,结果是2015-3-12
SELECT DATE_ADD('2014-3-12',INTERVAL -365 DAY);#在2014-3-12上减365天,结果是2013-3-12
SELECT DATE_ADD('2014-3-12',INTERVAL 1 YEAR);#在2014-3-12上加1年,结果是2015-3-12
SELECT DATE_ADD('2014-3-12',INTERVAL 3 WEEK);#在2014-3-12上加3周,结果是2015-4-2

DATEDIFF():日期差值
SELECT DATEDIFF('2013-3-12','2014-3-12');#'2013-3-12'和'2014-3-12'相差多少天,结果为365

DATE_FORMAT():日期格式化
SELECT DATE_FORMAT('2014-3-2','%m/%d/%Y');#结果为:03/02/2014。将2014-3-2格式化成斜线分割的,月份在前,日期在中间,年在后边的格式,如果格式化前只有一位数字%m%d会在前边加上0
关于有哪些格式,可以去mysql手册中查看

还有一些日期函数很少用到,其实MySQL数据类型中就很少用到日期类型

信息函数

名称 描述
CONNECTION_ID() 连接ID
DATABASE() 当前数据库
LAST_INSERT_ID() 最后插入记录的ID号
USER() 当前用户
VERSION() 版本信息

CONNECTION_ID():返回当前连接的ID,也是线程的ID
SELECT CONNECTION_ID();#结果为3,机器不同,返回结果不同
SELECT DATABASE();#返回当前数据库,结果为imooc

LAST_INSERT_ID():返回最后插入的ID,表中必须含有一个自动增长字段
修改test表,添加自动增长的id字段,并设为主键
ALTER TABLE test ADD id SMALLINT UNSIGNED KEY AUTO_INCREMENT FIRST;#在test表中添加id字段,自动增长,设为主键
在表中增加记录:
INSERT test(first_name,last_name) VALUES('11','11');#插入一条记录
SELECT LAST_INSERT_ID();#得到最后插入的ID,结果为5
同时写入多条记录:
INSERT test(first_name,last_name) VALUES('AA','BB'),('CC','DD');#插入一条记录
SELECT LAST_INSERT_ID();#得到最后插入的ID,结果为6
同时写入多条记录时,只返回插入的第一条记录的id

SELECT USER();#当前登录的用户,结果为:root@localhost
SELECT VERSION();#打印MySQL的版本号,结果为5.5.37

聚合函数

聚合函数:只有一个返回值

名称 描述
AVG() 平均值
COUNT() 计数
MAX() 最大值
MIN() 最小值
SUM() 求和

SELECT AVG(3,4,5);#错误
这个聚合函数应该用于表中
SELECT AVG(id) FROM test;#没有实际意义,得到的结果是4
在tdb_goods表中存在商品价格,计算商品价格:
SELECT AVG(goods_price) AS avg_price FROM tdb_goods;#结果为5654.8095238
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;#利用ROUND()函数进行四舍五入,结果为5654.81

SELECT COUNT(goods_id) AS counts FROM tdb_goods;#计算tdb_goods表中的goods_id数量
SELECT MAX(goods_price) AS counts FROM tdb_goods;#商品价格的最大值
SELECT MIN(goods_price) AS counts FROM tdb_goods;#商品价格的最小值
SELECT SUM(goods_price) AS counts FROM tdb_goods;#商品的价格和

加密函数

名称 描述
MD5() 信息摘要算法
PASSWORD() 密码算法

SELECT MD5('admin');#结果为一个32位十六进制数字
SELECT PASSWORD('admin');#进行密码计算

建议在开发中,使用MD5()

PASSWORD():在修改MySQL用户密码时使用
SET PASSWORD=PASSWORD('admin');#把当前用户的密码改成admin
退出重新登陆,原来的密码就不能使用了,可以使用admin登录

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 777评论 1 0
  • 数据准备 回顾 记录操作:写操作:INSERT,UPDATE,DELETE读取操作:SELECT 这章主要学习:子...
    齐天大圣李圣杰阅读 1,049评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,800评论 0 10
  • SQL SELECT 语句 一、查询SQL SELECT 语法 (1)SELECT 列名称 FROM 表名称 (2...
    有钱且幸福阅读 5,421评论 0 33