1 小时 SQL 极速入门(一)
前几天,我在论坛溜达。看到一个人发帖说
做了6年的企业级开发,总是被互联网行业的人认为没技术含量,不就是CRUD么
先解释下 CRUD 是什么。CRUD 就是我们常说的增删改查(Create,Retrieve,Update,Delete)
其实,对这个问题,我也思考过。我们所有的业务流程,最终都会抽象出数据模型,保存到数据库中。把业务之间的联系抽象成数据库中表与表,字段与字段之间的联系。实际上,企业的各种系统,在技术层面上确实是在 CRUD。
不过话说回来了,互联网的系统不是 CRUD 吗?只不过 CRUD 的姿势不同罢了,互联网可能是面对高并发的 CRUD, 我们是面对的是复杂业务流程的 CRUD。这些业务逻辑还需要一定的行业积淀才能捋清楚。所以在企业级开发上业务和技术基本是五五开,业务比重甚至要大于技术。
所以,今天我们就花很短的时间,来学学简单的 SQL.了解下 CRUD 的姿势。
假如我们有下面一个订单表 ORDER_HEADER,不要在意表里的数据,为了方便说明,瞎填的。
查询
查询是我们平日使用最多的,下面着重说一下:
查询使用 SELECT 关键字,基本结构如下
SELECT <列名> FROM <表名> WHERE <条件>
假如我们想查找所有已经完工的订单信息,那么 SQL 怎么写呢?
SELECT * FROM order_header WHERE order_status = '完工'
执行后会看到我们需要的结果
SELECT * 代表查询所有列,一般我们会关注我们需要的字段,比如我们要找到订单类型为 1 的并且完工的订单号,我们可以这么写
SELECT order_no FROM order_header WHERE order_status = '完工' AND order_type = 1
我们可以看到只有下面两个符合条件的订单号被选中。在写 SQL 中我们要尽量避免 SELECT * ,我们需要哪个字段就取哪个字段,可以节省 SQL 查询的时间。
如果要查询订单类型为 1 的或者处于下达状态的订单,SQL 怎么写呢?
SELECT order_no FROM order_header WHERE order_type = 1 OR order_status = '下达'
如果要查找开工,下达和完工状态的订单,我们可以用 IN 关键字
SELECT
order_no,
order_type,
order_status
FROM
order_header
WHERE
order_status IN ( '开工', '完工', '下达' )
除了 IN 我们可以使用 LIKE 进行模糊查询,比如我们要查询订单状态中包含 “工” 的所有订单
SELECT order_no FROM order_header WHERE order_status LIKE '%工%'
这里的 "%" 表示通配符,"%工"表示以工结尾的所有匹配,"工%"表示以工开头的所有匹配。
此外,我们可以用 NOT IN , NOT LIKE 来取相反的逻辑。
通过 GROUP BY 可以进行分组,比如我们按照订单状态来分组,就可以很方便的查看当前有几种状态的订单
SELECT order_status FROM order_header GROUP BY order_status
结果如下图
如果我们想看到每个分组中有多少订单,那个我们可以使用 COUNT() 函数
SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status
结果如下图,可以看到每个分组中订单的数量。除了COUNT(),还有 MAX(),MIN(),SUM()等函数
如果我们只想看到数量大于 2 的分组,该怎么写?
SELECT order_status, COUNT(1) FROM order_header GROUP BY order_status HAVING COUNT(1) > 2
可以看到,只有数量大于2的分组被查到了。
如果仅仅想去重,比如想知道总共有几种订单类型,那么我们只需要对此列用 DISTINCT 即可。
SELECT DISTINCT order_type FROM order_header
结果中的订单类型列已经被去重了。
CASE WHEN ,有时我们会需要简单的判断逻辑,就可以用 CASE WHEN 了。比如我们想让 订单类型为1 的表示生产订单,订单类型为2 的表示更改订单,订单类型为3 的表示废弃订单。那么我们可以这么写
SELECT
order_no,
order_type,
order_status,
CASE
WHEN order_type = 1 THEN '生产订单'
WHEN order_type = 2 THEN '更改订单'
WHEN order_type = 3 THEN '废弃订单'
ELSE '未知类型'
END AS type_desc
FROM
order_header
结果如下图
子查询,有时候我们需要从一个结果集中再次查找,就会用到子查询。比如下面这样写
SELECT
order_no,
type_desc
FROM
(
SELECT
order_no,
order_type,
order_status,
CASE
WHEN order_type = 1 THEN '生产订单'
WHEN order_type = 2 THEN '更改订单'
WHEN order_type = 3 THEN '废弃订单'
ELSE '未知类型'
END AS type_desc
FROM
order_header
) t
下节课我们说一下 连接查询和常用到的分析函数,在企业中,单表查询情况是很少的,要关联查询。
插入数据
插入数据我们使用 INSERT 语句
INSERT INTO order_header ( order_no, order_type, order_status, order_date, createdon )
VALUES
( '2018102109', 2, '下达', sysdate( ), sysdate( ) )
看到,最下面就是我们新插入的一行
更新数据
更新数据使用 UPDATE 语句,我们更新一下刚才插入的数据的订单号
UPDATE order_header SET order_no = '112109' WHERE order_no = '2018102109'
我们把 订单号为'2018102109'的一行数据更新为了'112109',在update时一定要写好 WHERE 条件,如果没有 WHERE 条件,会更新表中所有数据。
删除数据
我们删除刚才加入的一条数据
DELETE FROM order_header WHERE order_no = '112109'
运行后,订单号为'112109'的订单就被删除了,DELETE 时同样要写好 WHERE 条件,如果没有 WHERE 条件,会删除表中所有数据。
下节重点说说 多表连接,常用分析函数。不要走开哦。
1 小时 SQL 极速入门(一)的更多相关文章
- 1 小时 SQL 极速入门(三)——分析函数
1 小时 SQL 极速入门 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询. 大家可以点击链接查看 1 小时 SQL 极速入门(一) 1 小时 SQL 极速入门(二) 今天我们讲一些在做报 ...
- 1 小时 SQL 极速入门(二)
上篇我们说了 SQL 的基本语法,掌握了这些基本语法后,我们可以对单表进行查询及计算分析.但是一个大的系统,往往会有数十上百张表,而业务关系又错综复杂.我们要查的数据往往在好几张表中,而要从多张表中来 ...
- 每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作
上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...
- 《Python黑客编程之极速入门》正式开课
玄魂 玄魂工作室 今天 之前开启了一个<Python黑客编程>的系列,后来中断了,内容当时设置的比较宽,不太适合入门.现在将其拆分成两个系列<Python黑客编程之极速入门>和 ...
- SQL查询入门(下篇)
SQL查询入门(下篇) 文章转自:http://www.cnblogs.com/CareySon/archive/2011/05/18/2049727.html 引言 在前两篇文章中,对于单表查询 ...
- Python 极速入门指南
前言 转载于本人博客. 面向有编程经验者的极速入门指南. 大部分内容简化于 W3School,翻译不一定准确,因此标注了英文. 包括代码一共两万字符左右,预计阅读时间一小时. 目前我的博客长文显示效果 ...
- 1.SQL语句入门
--SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有"",所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算 ...
- SQL 存储过程入门(事务)(四)
SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我 ...
- sql xml 入门
/*sql xml 入门: --by jinjazz --http://blog.csdn.net/jinjazz 1.xml: 能认识元素.属性和值 ...
随机推荐
- Redis 学习目录
Redis in .NET Core 入门 Redis实战 - 1.String和计数器 Redis实战 - 2.list.set和Sorted Set Redis实战 - 4.Key Redis实战 ...
- 基于Hexo搭建个人博客网站
## 准备工作 首先下载[nodejs](https://nodejs.org/en/download/),一路next安装即可.验证是否安装成功: ```bash node -v # 输出 v1 ...
- nginx 常用命令
-?,-h : this help -v : show version and exit -V : show version and c ...
- 洛谷评测机BUG(应该是)
此问题由洛谷p1746引出(之前出过类似问题没在意) 传送门 以下是两个差不多的程序,(只有main函数中的输入不同,第一个程序迷之WA,第二个程序AC) #include <bits/stdc ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第五集之补充-使用桥接模式实现虚拟机作为服务器,让同网段的其他主机远程连接】
参考:https://blog.csdn.net/qicheng777/article/details/73438045 https://www.cnblogs.com/hld123/p/650550 ...
- Picnic Planning POJ - 1639(最小k度生成树)
The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible abil ...
- leetcode刷题第三天<无重复字符的最长子串>
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...
- Spark WordCount的两种方式
Spark WordCount的两种方式. 语言:Java 工具:Idea 项目:Java Maven pom.xml如下: <properties> <spark.version& ...
- Caused by: org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
解决办法:查看与该项目中的所有#{},应该是 #{}的中间没有写值
- 在IDEA中spring程序可以正常运行,但IDE报错Could not autowire.
这个问题只会在使用xml文件配置bean时遇到,使用自动配置和java配置没有这种错误. 遇到这个问题首先要确定配置文件已经正确的放在了resources文件夹内,resources文件夹就是clas ...