博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL基础-创建新的输出字段
阅读量:5220 次
发布时间:2019-06-14

本文共 5617 字,大约阅读时间需要 18 分钟。

一、创建新的输出字段

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;

转载于:https://www.cnblogs.com/weiyiming007/p/11428796.html

你可能感兴趣的文章
常用到的多种锁(随时可能修改)
查看>>
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>