SQL基础-创建新的输出字段
一、创建新的输出字段
1、建表、插数据
###
CREATE TABLE `t_stock_trans_dtl` (
`trans_id` varchar(100) NOT NULL COMMENT '交易流水号',
`stock_name` varchar(20) NOT NULL DEFAULT '' COMMENT '股票名称',
`stock_code` varchar(10) NOT NULL DEFAULT '' COMMENT '股票代码',
`opt_tm` datetime NOT NULL DEFAULT '1900-01-01 00:00:00' COMMENT '操作时间',
`opt_typ` varchar(10) NOT NULL DEFAULT '' COMMENT '操作类型',
`price` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
`volume` int(11) NOT NULL DEFAULT '0' COMMENT '数量',
`fee` decimal(18,5) NOT NULL DEFAULT '0.00000' COMMENT '手续费',
PRIMARY KEY (`trans_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='股票交易明细'; ###
INSERT INTO `t_stock_trans_dtl` VALUES
('20010406000023','洪都航空','sh600316','2001-04-06 10:42:34','买入',22.40,600,3.36000),
('20050826000303','洪都航空','sh600316','2005-08-26 13:40:31','卖出',6.98,-300,5.00000),
('20130301000933','比亚迪','sz002594','2013-03-01 09:33:36','买入',25.25,600,3.78750),
('20140307000393','比亚迪','sz002594','2014-03-07 13:39:30','买入',56.91,600,8.53650),
('20150508000075','洪都航空','sh600316','2015-05-08 10:47:54','卖出',36.66,-300,2.74950),
('20150724000395','比亚迪','sz002594','2015-07-24 13:19:55','买入',55.55,1200,16.66500),
('20150902000941','大禹节水','sz300021','2015-09-02 09:44:18','买入',11.41,6100,17.40025),
('20160318000314','大禹节水','sz300021','2016-03-18 13:01:44','卖出',12.62,-3000,9.46500),
('20160930000303','比亚迪','sz002594','2016-09-30 13:40:31','卖出',56.98,-2400,34.18800),
('20170310000425','比亚迪','sz002594','2017-03-10 14:22:54','买入',51.59,2000,25.79500),
('20170630000132','大禹节水','sz300021','2017-06-30 11:53:20','买入',7.87,1300,2.55775),
('20171110000142','大禹节水','sz300021','2017-11-10 11:44:24','买入',7.25,5000,9.06250),
('20171229000410','比亚迪','sz002594','2017-12-29 14:51:04','买入',61.88,3600,55.69200);
2、数值计算
比如:
数据库中数量的单位为股,如何转换为手(1手=100股)后输出?
SELECT trans_id,stock_name,price,volume,volume/100 FROM t_stock_trans_dtl; 如何根据股票交易表中的单价、数量,计算出交易金额?
SELECT trans_id,stock_name,price,volume,price*volume FROM t_stock_trans_dtl; SQL算术操作符:
+ 加
- 减
* 乘
/ 除 算术操作符的优先级:
和数学运算中一样 SELECT a-b*c/d+1 等价于 SELECT a-((b*C)/d)+1
建议用( )包起来 算术操作符的结果:
字段a(INT)= 1
字段b(INT)= 4
SELECT a/b #返回的是0.2500,某些数据库还会返回0 如何返回0.25?
SELECT a*1.00/b 算术操作符仅支持数值型字段; 如何实现字符型字段的算术操作?
将字符型转为数值型,再运算
3、字段拼接
比如:
如何按“洪都航空(sh600316)”展示股票名称和股票代码? Access、SQL Server中:
SELECT stock_name + '(' + stock_code + ')' FROM t_stock_trans_dtl; DB2、Oracle、Teradata中:
SELECT stock_name || '(' || stock_code || ')' FROM t_stock_trans_dtl; mysql中:
SELECT CONCAT(stock_name,'(',stock_code,')') FROM t_stock_trans_dtl; 拼接操作符仅支持字符型字段; 如何实现数值型字段的拼接?
将数值型转为字符型,再拼接
4、使用别名
SELECT CONCAT(stock_name,'(',stock_code,')') FROM t_stock_trans_dtl;
刚才查询出的拼接字段,表头名称不易读懂,这里可以做一个别名;
使用AS关键字为表达式取一个别名:
SELECT CONCAT(stock_name,'(',stock_code,')') AS stock FROM t_stock_trans_dtl;
SELECT CONCAT(stock_name,'(',stock_code,')') AS '股票名称和代码' FROM t_stock_trans_dtl;
建议:不论中文别名中是否有空格,都用引号引起来
二、创建新的输出字段(case when)
1、case when
比如:
如何根据买入数量,区分大单、中单、小单? [3000,+∞) 大单
(300,3000) 中单
(0,300 ] 小单 SELECT volume,
CASE WHEN volume >= 3000 THEN '大单'
WHEN volume > 300 AND volume < 3000 THEN '中单'
WHEN volume <= 300 THEN '小单'
END as '单的类型'
FROM t_stock_trans_dtl
WHERE opt_typ = '买入'; ##else关键字
SELECT volume,
CASE WHEN volume >= 3000 THEN '大单'
WHEN volume > 300 AND volume < 3000 THEN '中单'
ELSE '小单'
END
FROM t_stock_trans_dtl
WHERE opt_typ = '买入';
2、CASE WHEN语法1
###CASE WHEN语法1:
CASE WHEN 条件表达式1 THEN 结果表达式1
WHEN 条件表达式2 THEN 结果表达式2 …WHEN 条件表达式N THEN 结果表达式N
[ELSE ELSE结果表达式]
END
没有ELSE部分时,如果所有条件表达式都不满足,则返回NULL。
每一个CASE WHEN都应该有ELSE分支!!!
比如:
对于买入的交易,交易数量为正数,而卖出的交易,交易数量为负数。这就导致交易金额(交易价格*交易数量)的返回值有正有负。
如何根据交易类型做转换,交易金额全部返回正数?
买入 交易价格*交易数量
卖出 0-交易价格*交易数量
SELECT opt_typ,price,volume,
CASE WHEN opt_typ = '买入' THEN price*volume
WHEN opt_typ = '卖出' THEN 0-price*volume
ELSE 0
END
FROM t_stock_trans_dtl;
##另一种写法
SELECT opt_typ,price,volume,
CASE opt_typ
WHEN '买入' THEN price*volume
WHEN '卖出' THEN 0-price*volume
ELSE 0
END
FROM t_stock_trans_dtl;
3、CASE WHEN语法2
###CASE WHEN语法2:
CASE 条件表达式
WHEN 匹配表达式1 THEN 结果表达式1
WHEN 匹配表达式2 THEN 结果表达式2
...
WHEN匹配表达式N THEN 结果表达式N
[ELSE ELSE结果表达式]
END
适用于条件表达式的结果,是一个可穷举的列表。
但不适用于条件表达式的结果是一个范围的情况。
4、嵌套CASE WHEN
CASE WHEN 外层条件表达式1 THEN (CASE WHEN 内层条件表达式1 THEN 内层结果表达式1
...
WHEN 内层条件表达式M THEN 内层结果表达式M
ELSE 内层ELSE结果表达式
END)
...
WHEN 外层条件表达式N THEN 外层结果表达式N
ELSE 外层ELSE结果表达式
END 两种语法格式,都可以多层嵌套,但不推荐多层嵌套。
建议最多嵌套两层并使用括号格式化SQL语句。
三、使用函数创建新的输出字段
1、函数
函数:根据输入,按照既定的逻辑返回预期的结果。 常见函数分类:
数值函数 类型转换函数、绝对值函数、指数函数...
文本函数 拼接函数、截取函数、转换函数...
日期和时间函数 格式化函数、截取函数、系统日期...
2、数值函数

比如:
如何从股票交易明细表中返回正数的交易数量?
SELECT volume,abs(volume) FROM t_stock_trans_dtl; 如何从股票交易明细表中返回交易费用(只保留2位小数位)?
SELECT fee,round(fee,2) FROM t_stock_trans_dtl;
3、文本函数


比如:
如何根据股票交易明细表中的股票代码,返回股票所在的证券交易所?
SELECT stock_code,left(stock_code,2) FROM t_stock_trans_dtl;
SELECT stock_code,substring(stock_code,1,2) FROM t_stock_trans_dtl;
4、日期和时间函数


比如:
如何返回股票交易明细表中交易日期(只返回年月日,去掉时分秒)?
SELECT opt_tm,date_format(opt_tm,'%Y-%m-%d’) FROM t_stock_trans_dtl;
4、函数嵌套
比如:
如何根据股票交易明细表中的股票代码,返回股票所在的证券交易所(要求返回大写字母)?
SELECT stock_code,upper(left(stock_code,2)) FROM t_stock_trans_dtl;
SQL基础-创建新的输出字段的更多相关文章
- sql语句创建新登录名和设置权限
use DBName go --新增用户 exec sp_addlogin '用户名','密码','默认数据库名' --添加登录 exec sp_grantdbaccess N'test' --使其成 ...
- [SQL基础]入门
目录 什么是SQL? SQL能做什么? RDBMS SQL常见数据类型 SQL语法 什么是SQL? 结构化查询语言(Structured Query Language)简称SQL. 结构化查询语言是一 ...
- sql基础篇
再跟SQL谈一谈--基础篇 1.简介 2.DDL & DML 3.SELECT ①DISTINCT ②WHERE ③AND & OR ④ORDER BY 4.INSERT 5.UP ...
- SQL基础概念-指令
1,MySQL:(structured query language)用于访问和处理数据库的标准语言 2,什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能 ...
- sql server创建表相关
1,设置主键的sql的三种方式 a.字段名 int primary key b.字段名 int constraint 主键名 primary key clustered(字段名) c.创建表是,后置一 ...
- SQL基础一
一.什么是SQL? SQL是结构化查询语言 SQL使我们有能力访问数据库 SQL是一种ANSI的标准计算机语言 二.SQL能做什么? SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可 ...
- SQL基础(1)
1.SQL简介 (1)什么是SQL? SQL指结构化查询语言 SQL使我们有能力访问数据库 SQL是一种 ANSI 的标准计算机语言 (2)SQL 能做什么? SQL面向数据库执行查询 SQL可从数据 ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- php大力力 [023节]CREATE TABLE创建新表sql写字段备注(2015-08-27)
2015-08-27 php大力力023.CREATE TABLE创建新表sql写字段备注 http://www.cnblogs.com/dalitongxue/p/4762182.html 参考: ...
随机推荐
- C#关键字:访问修饰符
一.访问修饰符 访问修饰符有public.private.protected.internal和protected internal.它们是修饰在类型(类.接口.委托.结构和枚举)和类型成员(字段.属 ...
- C# vb .net实现轮廓特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- python 基础(集合)
#set里的元素是唯一的,即没有重复的,可以用set()函数,去数据的重复冗余 L = [1,1,1,2,4,5,6,7] S = set(L) print(S) #打印结果{1, 2, 4, 5, ...
- Java自学-类和对象 方法重载
什么是Java 方法重载 方法的重载指的是方法名一样,但是参数类型不一样 步骤 1 : attack方法的重载 有一种英雄,叫做物理攻击英雄 ADHero 为ADHero 提供三种方法 public ...
- 采用__call__ 实现装饰器模式
装饰器模式在实现中也是很常见的:比如手机贴膜,手机壳 都是为了给手机增加一些额外功能 增加耐操 装饰器模式的本质就是对对象二次包装,赋额外功能 __call__ __call__是python魔术方法 ...
- SQL Server行转列、不确定列的行转列
本文使用的方法: 1.用Case When 2.PIVOT函数 首先,模拟一张表: -- 创建模拟数据 CREATE TABLE #TempSubjectResult ( StudentName NV ...
- Linux 常见 RAID 及软 RAID 创建
RAID可以大幅度的提高磁盘性能,以及可靠性,这么好的技术怎么能不掌握呢!此篇介绍一些常见RAID,及其在Linux上的软RAID创建方法. mdadm 创建软RAID mdadm -C -v /de ...
- django项目中使用手机号登录
本文使用聚合数据的短信接口,需要先获取到申请接口的appkey和模板id 项目目录下创建ubtils文件夹,定义返回随机验证码和调取短信接口的函数 function.py文件 import rando ...
- Alpha冲刺(10/10)——追光的人
1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...
- Python基础初始之二
1.格式化的输出 当你遇到这样的需要:字符串中想让某些位置变成动态可传入的,首先考虑用格式化输出 1.格式化输出:% 2. 格式化输出:format 3. 格式化输出:f 2.运算符 3.编码 待续