数据存储有哪些方式?电子表格,纸质文件,数据库。
那么究竟什么是关系型数据库?
目前对数据库的分类主要是关系型和非关系型两种,关系型的主要代表有oracle,db2,mysql,sqlserver等,非关系型数据库也称作nosql,
主要有mongodb,hbase等等。关系型数据库主要是以二维表的方式存数数据的,这是关系数据库最显著的特征,
Excel表格就是二维表,由行和列两个维度所组成,想想excel表格,你就会知道数据库里面的表是什么样子的,道理是一模一样的。
而非关系型数据库的数据组织方式就五花八门了,有星型的,网状的等等,他们都统称为非关系型数据库,也叫nosql。
关系型数据库需要一组操作符,实际上就是需要一套命令,或者说是语言,也就是我们现在要学习的sql,它是我们和数据库进行沟通的工具。
(1)包含4种类型语句:
大小写不敏感,但单引和双引内的大小写是敏感的.
关键字不能缩写select不能写成sel
列的别名含特殊字符用双引
可跨行,但不要将关键字和单引的内容跨行.
跨行是为了可读性,一般我们都把select子句和from子句分行写.
不要在自定义参数部分使用sql的关键字。
(1)整个学习SQL过程是使用SCOTT用户的表来学习的 默认scott是被锁定的 解锁的方法
原始状态下,这个用户是被锁定的,我们需要解锁这个用户
在以后的学习过程中 scott的表经常被修改 如果想将scott环境恢复默认 使用系统自带脚本即可
@是加载OS中的SQL保存文件
执行完脚本 会自动退出 重新登录 再对scott解锁即可
(2)一个完整的SQL命令叫语句(statement),每个关键字和后面跟着的选项叫子句(clause)
1.scott用户拥有哪些表?
如果屏幕显示的内容串行 是因为默认的显示的行长度是80字节 而选出的内容超出了80字节 可以修正一下
如果有多个列标题 是一页内行数默认14行 也可以修正
这个修改只是内存中的 可以将命令保存住到文件 实现永久配置
desc描述表的结构 所谓表的结构:就是表有多少列 列的名称和类型及约束(非空)
emp表(员工表)的结构介绍:
dept表(部门表)的结构介绍
SALGRADE表(薪水等级表)的结构介绍 三列都是数值型
4.在sql中使用算术表达式
先乘除后加减,同优先级自左至右
小括号提高优先级,多重括号则自内而外
5.在查询中为列命名别名
6.在别名中使用特殊字符 要用双引号
7.表别名 对emp表取了个简单别名e 这样就可以在引用表名时简化输入
同时也解决了星号和列同时出现的语法错误 别名的本质就是将非法的内容合法化
需要sysdba权限,静态参数,需要重启数据库生效
虚表 oracle自动创建的一张表 可以理解为是一张假想表 目的是为了使select语义完成
借助虚表 我们可以完成很多事
查看当前时间(OS时间)
等等...以后还有很多查询需要借助虚表完成.
WHERE是关键字 后面跟限制条件
条件由列名,字符串,算术表达式,常量和比较运算符组成;
oracle提供的比较运算符
字符串比较 字符串要加单引号 默认存储模式就是大写模式
先修改日期显示为我们习惯的格式 否则写系统默认的时间格式 DD-MON-RR
与 ==> 两端都为真 返回真 若有一端或两端为假则为假
或 ==> 若有一端或两端为真则为真 两端都为假 返回假
运算符的优先级不用记忆 想提高优先级加小括号即可
like 通配符: % 任意长度(包括零长度)通配符
部门名像 SAL开头的
任意一个字符后跟A之后任意字符串的名字
如果查询的字符串包含_或%字面字符串则需要转义
转义符号需要在子句中用escape指明
排序一定要放在sql语句的最后
排序格式化了输出 确给SQL执行增加了负担
order by中使用列号 列号必须是select子句中已经选择的列的顺序号
order by中使用多列 先按职位A-Z的顺序 再按年薪小到大的顺序
通俗的讲 任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称之为函数
例如:牛是函数,它吃的是草(输入),挤出的是奶(输出)
函数是一种程序设计结构,它可以有一个或多个输入,但只能有一个输出.
函数只有一个出口,使用函数组成的程序很容易调试,也很容易被重用
返回字符的ASCII码值
返回n的字符值 n是ASCII码数
但是求单引号的ASCII码写法很特殊 两个单引带表一个单引
每个词的词头大写 其他小写
将第一个字符串和第二个字符串连接
该合数与||功能一样,但是我们常用的是后者
返回指定子串,该子串是从第m个字符开始,其长度为n,不指定n值则从m到最后
返回字符串所占用的字节数
从表达式或列中搜索给定的字符串的所处位置,m代表从第几个字符开始搜,n代表要搜索的字符第几次出现. m和n默认都是1
从源字符串中去掉指定的字符 可以用leading tailing来修饰去掉的字符串是在开头或结尾,默认是两者都
默认截取的是空格,生产上有时候有的字段会产生空格,这个会给应用带来很大的麻烦,用这个函数就
可以很容易的,除去字段两头的空格,是非常实用的。
将不足20个字符的位置用指定符号填充.
从源字符串中找到搜索的old字符串,替换成new字符串
str 被转换的字符串
16:使用16进制方式显示
1016:把数据库当前字符集显示出来
E S开始的后续结束字符位置
四舍五入到小数点后的n位
修改当前会话的日期显示格式
使用函数查看系统当前时间,这个时间来自于操作系统,数据库里面是不存储当前时间的
默认情况下,参与运算的单位是‘天’
如果想让小时参与运算,可以处以24
以此类推,分钟,秒都可以这样计算
计算两个日期间所相差的月份
日期1大于日期2返回正数,日期1小于日期2返回负数
从给定日期算起,下一个指定的星期几是几号
返回该日期的所在月的最后一天
我们修改一下日期显示的格式
数字的进位和截取是以小数点为中心,而日期的进位和截取是以年月日时分秒为中心
round 截取月份以16号为分割,16号及其以后的日期都入到下一个月
16号之前的日期都返回月初的日期
年的四舍五入要所输入的月份,六月及其以前的日期,都返回年初,六月之后的日期返回下一年年初
以周三中午12点为分界线,周三之前返回本周日的0:00,周三之后的日期,返回下周日的0:00
西方以周日为一周的开始
不同数据类型之间的转换
在赋值语句中数据类型会隐式转换,隐式转换应当尽量避免,因为写出来的SQL难理解,随着时间流逝自己都很难理解
特别是嵌入到大型程序中时,另外,oracle升级会修改隐式转换的规则,这会使程序移植遇到问题.
尤其是索引列不能使用隐式转换 那样就不走索引了
赋值语句中oracle的自动转换规则:
表达式中oracle的自动转换规则:
在将字符型数据转换成数字型时,要保证字符型数据为有效的数.
在将字符型数据转换成日期型时,要保证字符型数据为有效的日期.
以上例子中oracle自动将字符型的数据转换成了数值型
以上例子中oracle自动将自负类型转换为了日期类型
注意:不能直接转换的情况
数值型和日期型之间不能直接转换,必须将其中之一先转换为字符型,之后再转换为另一种类型
1.to_char(数字) 目的是将数字格式化货币显示格式
2.to_char(日期) 目的是将日期格式化需要的格式
to_number 不常用,因为数值可以直接输入
to_date 很常用,因为日期是不可以输入 只能转
将日期型数据转换成字变长字符串.fmt为日期格式
日期格式必须用单引号扩起来
以上例子中scott的入职日期被以各种维度显示出来了
将数字转换成变长字符串.fmt为数字格式
9 一个数字 给定的9个数不足 会显示#
to_char 还可以将10进制数转换成16进制数
这个数字格式体现的是前面字符串的格式
字符串一定要符合数字的格式
字符串一定要符合日期格式
简化输入的操作,必须使用yyyy-mm-dd格式,并且只能精确到天
是一个很特别的值,既不是0也不是空格.它的值是没有定义,不确定的未知值
比如一个案件的追踪表,警方在对犯罪分子一无所知,但在犯罪分子性别一栏不是男就是女,
就可以把性别栏设置为未知,当案件侦破到一定程度,警方知道了犯罪分子的性别,
既从未知变成了已知.也就是由NULL变成男或女
以上输出内容的奖金一列存在空值,如果我们统计总收入的话,那么就会出现下面的情况
奖金为null的员工最终的工资还是null,这是不合理的
想要找到奖金为null的员工信息,却没有任何结果
这是由null的特殊性决定的,null不参与运算,因此只能用is null来描述它
要使null能够参与运算,需要用函数来将null值进行转化,相关函数有
如果表达式1是NULL,则返回表达式2
如果表达式1非NULL,则返回表达式1
表达式1和表达式2可以是数字,字符串,日期格式,1和2的数据类型必须一致
空值的排序 升序会排在最后 降序排在最前
返回第一个非空的表达式
emp表中有奖金的展示奖金,没有奖金的展示工资
这个函数是返回一个表达式在各种可能取值的情况下的值
最终如果没有满足任何比对条件,则返回default值
按部分编号涨工资(只打印) 10号部门涨10% 20号部分涨20% 其他部分涨30%
case when 子句分为简单和搜索两种
简单的case when子句可以实现等值比较,与decode一样
搜索case when可以实现不等值的比较
是对一组或一批数据进行综合操作后返回一个结果
上面执行的聚集函数都是对所有记录统计,一次只返回一行记录
如果想分组统计(比如统计部门的平均值)需要使用group by
为了限制分组统计的结果需要使用having过滤
求出每个部门的平均工资
还可以按照给定字段进行排序
分组排序可以使用未被选择的列
如果在查询中使用了分组函数,任何不在分组函数中的列或表达式必须在group by子句中
和where子句不同,having子句是在分组计算完成后进行的过滤,而where
子句是在分组计算前做的过滤,where 条件里面只能出现单行处理函数,而having
4.如果选择的列里有普通列,表达式和分组列 那么普通列和表达式都必须出现在group by中