MySQL学习笔记(四)运算符和函数

一、知识回顾:
连接
1、SELECT语句
SELECT * FROM tabA JOIN tabB ON tabA.name = tabB.name;//表示返回都含有的name值对应的字段

2、多表更新
UPDATE tdb_goods INNER JOIN tdb_goods_cates ON goods_cate=cate_name SET goods_cate=cate_id;//将 
tdb_goods 表和 tdb_goods_cates 表通过【连接条件】 goods_cate=cate_name 连接,然后【更新值】 goods_cate=cate_id

多表更新之一步到位
1.建表、查询、写入三合一:
CREATE TABLE tdb_goods_brands (
brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
brand_name VARCHAR(40) NOT NULL
) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

2.多表更新:
UPDATE tdb_goods AS g INNER JOIN tdb_goods_brands AS b ON g.brand_name = b.brand_name SET g.brand_name = b.brand_id;

3.通过ALTER TABLE语句修改数据表结构
ALTER TABLE tdb_goods 
CHANGE goods_cate cate_id SMALLINT UNSIGNED NOT NULL,
CHANGE brand_name brand_id SMALLINT UNSIGNED NOT NULL;

3、多表删除
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY 
goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;

二、字符函数
字符函数<br>
1.CONCAT() ,字符连接<br>
SELECT CONCAT('a','-','b');  结果为:a-b<br>
2.CONCAT_WS(), 使用指定的分隔符进行字符连接<br>
SELECT CONCAT_WS('|','A','B','C');   结果为: A|B|C<br>
3.FORMAT()  数字格式化
SELECT FORMAT(12560.7,2);  结果:12,560.70
SELECT FORMAT(12560.78,1); 结果:12,560.8
4.LOWER() 转换成小写字母
5.UPPER() 转换成大写字母
6.LEFT()  获取左侧字符
SELECT LEFT('mysql',2);  结果:my
7.RIGHT() 获取右侧字符
8.LTRIM() 删除前导空格(=LEFT TRIM())
9.RTRIM() 删除后续空格
10.TRIM()删除前后两边的空格,还可以删除指定的前导和后续的字符,不能删除中间的字符
SELECT TRIM(LEADING'?','??MYSQL????');  结果:MYSQL????
SELECT TRIM(TRAILING'?','??MYSQL????');  结果:??MYSQL
SELECT TRIM(BOTH'?','??MYSQL???');  结果:MYSQL
11.REPLACE() 替换字符
SELECT REPLACE('??MYSQL???','?','-');  结果:--MYSQL---
12. SUBSTRING(string,offset,length)   截取字符串
SELECT SUBSTRING('MYSQL',2,3);  结果:SQL
13.[NOT]LIKE  模糊匹配
(%):代表任意个字符,0个或多个
(_):代表任意一个字符,只有一个
SELECT name FROM test WHERE name LIKE'%O%';  结果:输入name 中带‘O’的name
SELECT name FROM test WHERE name LIKE'%1%%' ESCAPE'1';   找到中间带% 的匹配name
三、数值运算符和函数
SELECT CEIL(3.01) ==>4 /*有n.xx 都是n+1 进一取整 向上取整
SELECT FLOOR(3.99) ==>3 /*取n.xx 都是n 舍一取整 向下取整
SELECT 3 DIV 4 ==> 0 /*整数除法
SELECT 3/4 ==>0.75 /*除法
SELECT 21 MOD 2 ==>1 /*取余数(取模)整数,小数都可以
SELECT 21 % 2 ==>1 /*取余数(取模)整数,小数都可以
SELECT POWER(3,4) ==>81 /*3的4次方 幂运算
SELECT ROUND(3.1415926,4) ==>3.142 /*四舍五入
SELECT TRUNCATE(123.89,1) ==>123.8 /*截取小数点后的位置
SELECT TRUNCATE(123.89,0) ==>123 /*截取小数点后的位置,0位为整数部分
SELECT TRUNCATE(123.89,-1) ==>120 /*截取-1,从个位起去掉后面的数值替换为0
四、比较运算符和函数:
比较运算符和函数:(给出的都是闭合的区间)
(1)想在first_name这个字段中查找哪个字段值为NULL,可以用IS [NOT] NULL,这比较运算符,
如:SELECT * FROM test WHERE first_name IS NULL;
(2)[NOT] IN 的具体用法,SELECT 16 IN(1,2,16,68),返回的是true就是1.
(3)[NOT] BETWEEN....AND....具体用法:SELECT 6 BETWEEN 0 AND 29,返回的是true也就是1。也可以是字符串。
五、日期时间函数:
NOW():显示当前日期和时间:
SELECT NOW();
CURDATE():显示当前日期:
SELECT CURDATE();
CURTIME():显示当前时间:
SELECT CURTIME();
DATE_ADD():指定日期加上一段日期:
SELECT DATE_ADD('2016-6-6',INTERVAL 1 YEAR);//后面的单位可以是week,year,month等
DATEDIFF():计算两个日期相差的时间:
SELECT DATEDIFF('2016-6-6','2015-6-6');
DATE_FORMAT():将日期以指定格式显示:
SELECT DATE_FORMAT('2016-6-6','%m/%d/%Y');
六、信息函数:
(1)CONNECTION_ID(); // 连接ID
mysql> SELECT CONNECTION_ID();
(2)SELECT DATABASE(); // 当前数据库
(3)LAST_INSERT_ID(); // 最后句插入记录的 ID 号,如果是一次insert中插入的是多条记录,得到的是多条中的第一条(而不是最后一条!)
(4)VERSION(); // 版本的信息
(5)USER(); // 当前用户
SELECT USER();
七、聚合函数:只有一个返回值
AVG() - 平均值
SELECT ROUND(AVG(goods_price),2) AS avg_price FROM tdb_goods;
COUNT() - 计数
SELECT COUNT(goods_id) as counts FROM tdb_goods;
MAX() - 最大值
SELECT MAX(goods_price) as counts FROM tdb_goods;
MIN() - 最小值
SELECT MIN(goods_price) as counts FROM tdb_goods;
SUM() - 求和
SELECT SUM(goods_price) as counts FROM tdb_goods;
八、加密函数:
MD5():生成信息摘要:
SELECT MD5('213');
PASSWORD():修改mysql密码:
SET PASSWORD=PASSWORD('1234');
九、自定义函数:
自定义函数:UDF是对MySQL扩展的途径,其用法与内置函数相同。
必要条件:返回值(必须),参数(非必须)    函数可以返回任意类型的值,同样可以接收这些类型的参数,参数与返回值没有必然的内在联系
MySQL中参数的数量不能超过1024个
创建自定义函数:
CREATE FUNCTION function_name(参数) RETURNS 返回值类型
{STRING|INTEGER|REAL|DECIMAL}
routine_body
RETURN 返回值

routine_body 函数体
1、函数体由合法的SQL语句构成;
2、函数体可以是简单的SELECT或INSERT语句;
3、函数体如果为复合结构则使用BEGIN...END语句;
4、复合结构可以包含声明,循环,控制结构;

删除函数:
DROP FUNCTION [IF EXISTS] function_name;


创建日期时间自定义函数:
CREATE FUNCTION f1() RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');

SELECT f1();

【创建函数之前要写 set names utf8mb4; 否则调用时会出错】

DATE_FORMAT()函数在格式化日期格式时,应该是百分号在代表年、月、日的字母前面,字母的大小写不同,所表示格式也有所区别:
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d'),其结果是:
2015-07-04
因此,各字母所表示的含义为:
Y:2015              
y:15
M:july
m:07
D:4th
d:04

创建带参数的自定义函数:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN(num1+num2)
删除函数:
   DROP FUNCTION fun_name;

//创建具有复合结构函数体的自定义函数
修改分隔符:DELEMITER 分隔符
Eg:DELIMITER // /* 将分隔符修改为 '//' */
当函数体内需要执行的是多条语句时,要使用BEGIN...END语句
且当编写函数体内容的时候,需要使用 DELIMITER 关键字将分隔符先修改为别的,否则编写语句的时候写到 ';' 的时候会直接执行,导致函数编写失败
删除函数:DROP FUNCTION [IF EXISTS] function_name
*/
Eg:
DELIMITER //定义分隔符
CREATE FUNCTION ADD_USER(p_id SMALLINT,username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT user(p_id,username) VALUES(p_id,username);
RETURN LAST_INSERT_ID();
END
十、自定义函数回顾
【自定义函数】简称UDF;是对MySQL扩展的一种途径
语法: CREATE FUNCTION ....
------------------------------------------
| test | CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
创建一个函数:
没有参数的函数:
CREATE FUNCTION f1()
RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点%i分%s秒');

带参数的函数:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
说明 f1、f2是函数名 num1、num2是形参
RETURNS (returns) 后面跟的是返回值的数据类型
RETURN 后面跟的是函数体
创建一个执行多条sql语句的函数 f3(),并放回主键
如果有多条sql语句,必须放在 BEGIN 与END 之间
修改 结束符号成 ## 原本是; 当然你也可以改回来
1、DELIMITER ##
创建一个函数(功能是传递一个参数,参数是表 test 的test字段值,返回插入数据的主键)
2、CREATE FUNCTION f3(test varchar(20))
RETURNS INT UNSIGNED
BEGIN
INSERT `test`(`test`)values(test);
RETURN LAST_INSERT_ID();
END
##
修改结束符变回 ; (delimiter)
3、DELIMITER ; 
删除一个函数:
DROP FUNCTION IF EXISTS `f1`;
调用一个函数:
SELECT f1();
SELECT f2(23,2);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容