知识点:关于字符串连接
在练习系统的数据库里,字符串的连接用 || 来完成
select 'a' || 'b';
就像数字的加法 1+1,只不过这里是字符串相加(也就是连接)
select a || b;
这里的 'a' 是字符串,a则是字段a,所以要提前搞清字符串和字段的区别。
知识点:substr字符串截取
在练习系统的数据库里,字符串的截取用 substr 来完成
用法:
string为字符串,start为起始位置;字符串的第一个字符的位置为1,不是从0开始计算
length为长度。
select substr('abcdef', 1, 2); -------> 'ab'
知识点:UPPER函数
UPPER(字符串) 函数可以把小写字母转成大写字母
elect UPPER('abc') -------> ABC
知识点:UNION联结
如果想把两个查询或表的数据合在一起,可以用UNION语法.是指的把表2的所有行插入到表1的最后一行后面,
语法:
select xx 查询1\
UNION\
select yy 查询2\
UNION\
select zz 查询3\
....\
注意:这些查询的字段个数必须相同
连接方式
inner join、left join、right join、full outer join、union、union all的区别
1. Inner join 产生的结果集中,是A和B的交集。
2. Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。可以使用IFNULL判断
3. FULL OUTER JOIN 产生A表和B表没有交集的数据集。
添加这个 where 条件,可以排除掉两表的数据交集:
WHERE TableA.id IS null OR TableB.id IS null
4.Left outer join 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
(1)SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
(2)SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null
其实就是在上一步的结果集中又做了一次筛选工作,产生在A表中有而在B表中没有的集合。
5.UNION 与 UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。
函数
substr函数
| 参数 | 必须 | 参数说明 |
|---|---|---|
| string | 必须 | 指定的要截取的字符串 |
| start | 必须 | 规定在字符串的何处开始: (正数) - 在字符串的指定位置开始 (负数) - 在从字符串结尾的指定位置开始 ( 0 ) - 在字符串中的第一个字符处开始 |
| length | 可选 | 指定要截取的字符串长度,缺省时返回字符表达式的值结束前的全部字符 |
例如:
select substr('abcdefg',3,4) from dual;结果是cdef
select substr('abcdefg',-3,4) from dual;结果efg
select
substr('abcde',2), ------ bcde
substr('abcde',-2), ------de
substr('abcde',2,3), ------bcd
substr('abcdewww',-7,3) -------bcd
from dual;
窗口函数
over (partition by <用于分组的列名>order by <用于排序的列名>)
tip:分组函数(GROUP BY)适用于统计(相当于新的表), 窗口函数适用于排名(相当于加字段)。不过这两个函数都对数据做了分组(先分组之后统计或先分组之后排名)。
如果学员A的成绩是 80分,B的也是80分,C是79分,那怎么排名呢?
规则1:并列排名,假设A是第5名,B也是第5名,C是第6名,对于函数 dense_rank()
规则2:并列排名,顺延,假设A是第5名,B也是第5名,C是第7名, 对应函数 rank()
规则3:纯排序,假设A是第5名,B是第6名,C是第7名, 对应 row_number()
select *,
rank() over (order by 成绩 desc) as ranking,
dense_rank() over (order by 成绩 desc) as dese_rank,
row_number() over (order by 成绩 desc) as row_num
from 班级表
结果为: