MySQL

132 阅读3分钟

知识点:关于字符串连接

在练习系统的数据库里,字符串的连接用 || 来完成

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的交集。

图片.png

2. Full outer join 产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。可以使用IFNULL判断

图片.png

3. FULL OUTER JOIN 产生A表和B表没有交集的数据集。

图片.png

添加这个 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

图片.png

(2)SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

图片.png

其实就是在上一步的结果集中又做了一次筛选工作,产生在A表中有而在B表中没有的集合。

5.UNIONUNION 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 班级表

结果为: 图片.png