一日一句 SQL [持续更新] MySQL + Oracle
1 . group by 和 having字句:
group by是根据列值对数据进行分组, having子句用于对分组的数据进行过滤. [ having 针对的对象是分好的组]
eg:
employee表:
uuid
emp_name
emp_id
dept_id
dept表:
uuid
dept_name
dept_id
查询至少包含两个雇员的部门名称:
select d.dept_name, d.dept.id, count(e.emp_id) emp_sum --这里统计可以使用*号,但是建议使用具体的列,速度上会快一点
from employee e left join dept d
on e.dept_id = d.dept_id
group by d.name
having count(e.emp_id) >= 2; --统计每组的人数,即部门人数
2 . Order by 子句
order by 子句用于对结果集中的原始列数据或是根据列数据计算的表达式的结果进行排序 .
默认是升序, 加上 desc 关键字就是降序了.
多条件排序只需把条件用逗号分割即可.
eg:
account表:
uuid
name
account
id
查询所有用户,结果按 account 降序:
select *
from account
order by account desc;根据表达式排序:
假设 account 表中 id 列为这样的数据 111-111-111, 和银行卡编号类似.
选择需要按照 id 后三位进行排序:
select *
from account
order by right(id, 3) desc;根据内建函数 right() 提取 id 字段的最后三个字符, 并根据该值对结果集进行排序.
3 . 聚集函数
提到聚集函数, 必须提到分组, 分组就联想到了 group by 语句. [ 使用 group by 是显示分组 ]
聚集函数是对某个分组的所有行进行特定的操作.
如下聚集函数:
- Max() : 返回集合中最大值
- Min() : 返回集合中最小值
- Avg() : 返回集合中的平均值
- Count() : 返回集合中值的个数
在上面提到了显示分组, 那么一定就还有隐式分组, 也就是不使用 group by 语句, 比如下面的 sql:
eg:
员工表 employee
uuid
name
emp_id
emp_age
emp_location
查询 emp_location 是杭州市的员工的最小年龄, 最大年龄, 平均年龄 :
select min(emp_age) min_age,
max(emp_age) max_age,
avg(emp_age) avg_age
from employee
where emp_location = "杭州";上面没有使用分组语句, 但是却可以使用聚集函数, 那是因为 where 相当于了一个隐式分组, 结果集中只有一个组, 那就是emp_location="杭州" 这一组.
4 . distinct 关键字
用于除去集合中列中的重复值, 留下不重复的值, 用于统计 .
eg:
查询选课表中一共有多少学生选了课 :
选课表 SC :
uuid c_id
s_id
select count(distinct s_id)
from SC;注意 :
如果 distinct 关键字后有多个列, distinct 关键字的作用并不是保证离他最近的那一列保证不重复, 而是保证所有列的组合保证不重复 .
5 . as 关键字的使用
as 关键字用于取别名, 可以给表取别名, 也可以给列取别名, 可以被省略 . 但是有一点, 别名尽量使用双引号包裹, 如果别名中包含特殊字符就会出错 .
给列取别名有三种方式 : [ 推荐使用中间的 ]
select name as "姓名", age "年龄", sex 性别 --这里使用了三种取别名的方式, 推荐使用第二种
from users
给表取别名, 就使用第二种或者第三种都可以, 使用第三种时要保证别名中不包含特殊字符 .
SQL的优化:
- 少使用星号*, 多使用列名
- 多使用嵌套查询代替表连接查询
Oracle数据库判空函数:
在 Oracle数据中, 对于 null 有两点 :
- 包含 null 的表达式都是null
- null 永远都 != null
对于第一点, 解决 null 值, 有两个函数 nvl(colName, defaultValue) 和nvl2() ;
对于第二点, 解决办法是不使用等号, 而是使用 is 关键字 ;
Oracle 数据库的 spool 语句:
如果需要对接下来的 sql操作进行记录的话, 可以使用spool 语句, 在开始的时候输入 :
spool D:\sql记录.txt这里的意思是将记录放在 D 盘的 sql记录.txt 文件中, 在结束的时候输入:
spool off
Oracle 数据库中的 round, trunc 函数:
round函数用于数值和日期的四舍五入, trunc用于截断数值或者时间 . [ trunc相对于 round只是少了四舍五入的功能 ]
对于数值 :
-- 四舍五入, 保留若干有效数字
select round(52.45, 2) "四舍五入, 保留两位小数",round(52.45, 0) "四舍五入, 只留整数",round(52.45, -1) "四舍五入, 保留两位整数",round(52.45, -2) "四舍五入, 保留三位整数"
from dual;
连接虚拟机中 xp系统中安装的 Oracle数据库步骤 :
- 在本机环境变量中添加 sqlplus.exe的环境变量
- 打开本机命令行, 键入 sqlplus scott/tiger@192.168.83.128:1521/orcl 其中, scott是 Oracle中默认存在的一个用户, tiger是我们设置的密码, 一般将 scott 用户的密码设置为 tiger, ip地址是虚拟机中xp系统的ip地址, 端口默认是1521, orcl是Oracle中存在的数据库.
解决sqlplus乱码问题的环境变量:

Oracle 中的单行函数:
操作字符的函数 :
| 函数名 | 作用 | 例句 | 备注 |
| lower | 字符串转成小写 | eg: lower('MSYM') 输出: msym |
使用单引号,而不是双引号 |
| upper | 字符串转成大写 | eg: upper('msym') 输出: MSYM |
使用单引号 |
| initcap | 首字母大写 | eg: upper('msym hello') 输出: Mysm Hello |
使用单引号, 是将每个单词的首字母都大写 |
| substr | 取子串 | substr(str,startIndex) eg: substr('msym', 2) 输出: sym |
使用单引号, 开始的角标是 1 |
| substr(str, startIndex, count) eg: substr('msym', 1, 2) 输出: ms |
同上 | ||
| length | 取字符串的字符数 | eg: length('码上猿梦') 输出: 4 |
英文的字节数和字符数是一样的, 但是中文的字节数是字符数的两倍, 中文 : 2字节=1字符 |
| lengthb | 取字符串的字节数 | lengthb('码上猿梦') 输出: 8 |
|
| instr | 查找子串在目的串中的开始位置 | instr(resStr, targetStr) eg: instr('msym', 'ym') 输出: 3 |
输出的是角标, 从 1 开始 |
| lpad | 左填充 | eg: lpad('msym', 10, '*') 输出: ******msym |
|
| rpad | 右填充 | eg: rpad('msym', 10, '*') 输出: msym****** |
|
| trim | 去掉前后指定的字符 | eg: trim('m' from 'msym') 输出: sy |
只是前后的字符, 中间的字符无法使用 trim去掉 |
| replace | 替换字符 | eg: replace('msym', 'm', '*') 输出: *sy* |
|
操作时间的函数 :
| 函数名 | 作用 | 例子 | 备注 |
| sysdate | 返回系统当前时间 | eg: sysdate 返回的包括 : 日-月-年 |
没有括号 |
| months_between | 返回两个日期的相差月数 | eg: months_between(date1, date2) 返回date1和date2之间相差的月数 |
|
| add_months | 向指定的日期中加上若干月数 | eg: add_months(sysdate, 51) 返回当前系统时间 51个月之后的日期 |
|
| next_day | 返回指定日期的下一天的日期 | eg: next_day(sysdate) 返回的当前系统日期的下一天, 即明天 |
|
| last_day | 返回本月的最后一天的日期格式 | eg: last_day(sysdate) 返回当前系统日期所在约在月份的最后一天的日期 |
|
| round | 对日期进行四舍五入, 这里的四舍五入指的是:月份: 14舍, 15入, 年份:四舍五入 |
eg: round(sysdate, 'month') round(sysdate, 'year') |
|
| trunc | 对日期进行截断, | eg: trunc(sysdate, 'month') trunc(sysdate, 'year') |
|
| to_char | 格式化日期 | eg: to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') 返回当前时间, 如: 2013-09-01 13:45:23 |
|
一日一句 SQL [持续更新] MySQL + Oracle的更多相关文章
- 用一句sql语句更新两个表并可更新对应的字段的值
ACCESS 例子: insert into products (ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai) select Pr ...
- sql server 导出的datetime结果 CAST(0x00009E0E0095524F AS DateTime) 如何向mysql,oracle等数据库进行转换
1. 处理 sql server 导出的 datetime 类型的字段 在进行sql server向mysql等其他数据进行迁移数据时,会发现使用sql server导出的datetime类型的结果是 ...
- 每日一句 Linux, 持续精进
每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...
- 【oracle笔记1】基础知识大集锦:增删改,数据类型,用户操作,持续更新中···
什么是数据库?数据库就是用来存储和管理数据的仓库.首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思 ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- Mysql注入小tips --持续更新中
学习Web安全好几年了,接触最多的是Sql注入,一直最不熟悉的也是Sql注入.OWASP中,Sql注入危害绝对是Top1.花了一点时间研究了下Mysql类型的注入. 文章中的tips将会持续更新,先说 ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- MySQL系列:一句SQL,MySQL是怎么工作的?
对于MySQL而言,其实分为客户端与服务端. 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端. 客户端,负责发送请求到服务端并从服 ...
随机推荐
- Go搭建一个博客系统
go语言环境就不用多说了,版本肯定越高越好,这里用go1.10 先放着
- Excelファイルを扱う方法
概要 データをローカルに落としたいという要件がある場合.ユーザーはExcelを希望するケースが多いだろう.そんな時は以下の汎用モジュールを使用して簡単に作る事ができます.使用方法は.GUI_UPLOA ...
- python--模块之time,datetime时间模块
time: 表示时间的三种方式:时间戳.格式化的时间字符串.元组时间戳是计算机能够识别的时间:时间字符串是我们能够看懂的时间:元组是用来操作时间: 导入时间模块import time 1,时间戳(ti ...
- 在XAML中为ItemsControl定义分组,适合mvvm绑定
可以先参考一下这个文章: http://www.cnblogs.com/zoexia/archive/2014/11/30/4134012.html step0: 先展示一下最简陋的界面: 上图是一个 ...
- CF 1027 F. Session in BSU
F. Session in BSU https://codeforces.com/contest/1027/problem/F 题意: n场考试,每场可以安排在第ai天或者第bi天,问n场考完最少需要 ...
- Ubentu下命令行安装chrome浏览器
前言: 最近在使用Ubuntu 系统.编译Android aosp 项目.准备写博客,但是Ubuntu 的默认浏览器 firefox 在写csdn 的时候,加载不出来.如下图 一直卡在这里. 这种情况 ...
- 8、Java并发编程:同步容器
Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...
- mysql表的核心元数据
索引的 mysql> show indexes from recordsInRangeTest; +--------------------+------------+------------- ...
- 使用unittest里面的discover()方法组织测试用例
import osimport unittest directory = os.getcwd()# 测试用例的目录organize = unittest.defaultTestLoader.disco ...
- Python简要标准库(1)
sys sys这个模块让你能够访问与Python解释器联系紧密的变量和函数 其中的一些在下表 F argv 命令行参数,包括脚本名称 exit([arg]) 退出当前的程序,可选参数为给定的返回值或者 ...

