数据库-函数

一、函数

1. distinct去除重复列

SELECT DISTINCT age FROM student;

2. 使用算数运算符+-*/

SELECT age,age+2 FROM person;

3. 字符串的拼接 ||

SELECT 'hello' || 'oracle' FROM dual;


SELECT NAME || '的年龄是'|| age FROM person;

4. in等于值列表

SELECT * FROM person WHERE age IN(19,20,31);


SELECT * FROM person WHERE (NAME,age) IN(('jack',19),('tom',24));

5. is null 空值

SELECT * FROM person WHERE age IS NULL;

6. 模糊查询

#开头
SELECT * FROM person WHERE NAME LIKE 'j%';

#中间
SELECT * FROM person WHERE NAME LIKE '%j%;

#查询姓名的第三个字符
SELECT * FROM person WHERE NAME LIKE '__l%'

练习

--查询所有姓张的同学

SELECT * FROM student WHERE NAME LIKE '张%';

--查询所有名字带刚的24岁以下的同学

SELECT * FROM student WHERE age <=24 AND NAME LIKE '%刚%';

--查询成绩在60到65之间的记录(两种写法)

SELECT * FROM score WHERE score >=60 AND score <=65;

SELECT * FROM score WHERE score BETWEEN 60 AND 65;

--查询成绩超过60、不到65的记录(不

7. order by DESE ASC

-- desc 降序
SELECT age FROM student ORDER BY age DESC;

-- asc  升序
SELECT age FROM student ORDER BY age ASC;

-- desc asc
SELECT * FROM student ORDER BY age DESC ,id ASC

8. 截取字符串SUBSTR

-- 从第2个字符开始,截取5个字符
SELECT SUBSTR('helloworld',2,5) FROM dual;
SELECT NAME,SUBSTR(NAME,2,3) FROM person;

9. 获取长度length

SELECT LENGTH('helloworld') FROM dual;

10. 数值函数round

-- round 四舍五入
SELECT ROUND(3.131492,3) FROM dual;

11. 转换函数to_date/to_char

-- 字符串->日期 to_date
SELECT * FROM person WHERE birth > '24-7月 -19';
SELECT * FROM person WHERE birth > to_date('2019-07-24','yyyy-mm-dd');
SELECT * FROM person WHERE birth > to_date('2019-07-24 00:00:00','yyyy-mm-dd hh24:mi:ss');


--查询出生日期在2015年12月20号到2018年1月10号8点10的人
SELECT * FROM person WHERE birth >= to_date('2015-12-20','yyyy-mm-dd') AND birth <= to_date('2018-01-10 08:10:00','yyyy-mm-dd hh24:mi:ss');


-- 日期->字符串 to_char
SELECT birth,to_char(birth,'yyyy-mm-dd hh:mi:ss') FROM person;
SELECT * FROM person WHERE to_char(birth,'yyyy-mm') = '2019-09'

12. 通用函数,适用于任何数据类型,包括空值nvl(e1,e2)

--nvl(e1,e2)当e1位null时,用e2代替,需要e1和e2数据类型一致
SELECT age,nvl(age,0) FROM person;

13. 分组函数avg/sum/max/min/count

-- avg平均值、sum总计
SELECT AVG(age),SUM(age) FROM person;


-- max最大值、min最小值
SELECT MAX(age),MIN(age) FROM person;


-- count计数
SELECT COUNT(*) FROM person;


-- 查询score表中有多少个学生考试
SELECT COUNT(DISTINCT sno) FROM scor

14. 每、各、不同,需要使用group by

--统计每个学生的选课门数,并按选课门数的递增顺序显示结果
SELECT sno,COUNT(*)
FROM score
GROUP BY sno
ORDER BY COUNT(*);

--查询每个同学的总分、考试科目数量
SELECT sno,SUM(score),COUNT(*)
FROM score
GROUP BY sno;

--查询每门课总分
SELECT lno,SUM(score)
FROM student
GROUP BY lno;

--查询每门课的选课人数
SELECT lno,COUNT(*)
FROM score
GROUP BY ln

15. 内连接,等值连接

多表查询,假设要显示两个列,其中一个列来自一张表,另一个列来自令一张表。
需要将这两张表都显示出来的话,需要将这两张表进行关联之后再显示出来。
相对而言,隐式连接好理解好书写,语法简单,担心的点较少。
但是显式连接可以减少字段的扫描,有更快的执行速度。这种速度优势在3张或更多表连接时比较明显

-- 隐式内连接
SELECT * FROM stu,tea WHERE stu.tid=tea.tid;

-- 显式内连接
SELECT * FROM stu JOIN tea ON stu.tid=tea.tid;

16. 左右内连接


-- left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
-- 左连接:left outer join,以左表为主,无论能否关联到右表记录都要被查询到,右表关联到就显示关联记录,关联不到就显示空。
 左连接就是以from左边为主,拿上面两个例子来说,
 第一种是以学生(students)为主,假如学生成绩为空,也能查询到学生信息,只不过成绩为空。
 而第二种则是以成绩为主(sc)所以先查学生成绩,如果成绩为空就算学生存在,也查不到记录。

-- right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
-- 右连接:right outer join,以右表为主,无论能否关联到左表记录都要被查询到,左表关联到就显示关联记录,关联不到就显示空。

-- inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。

-- full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。
-- 全连接:full outer join,任一边表有记录都要被查询到,无论另一边能否关联到。另一边关联到就显示关联记录,关联不到就显示为空。

17. 子查询

子查询,假如要显示一个表中的重要数据。
需要跟另一个表中的数据进行对比之后才能显示出来,但是不需要显示对比的表的内容

-- 在where子句中使用,=、!=、>、<、<=、>=
---- select mgr from emp where ename='SMITH';=7902
---- select ename from emp where empno=7902;
SELECT ename FROM emp WHERE empto=(SELECT mgr FROM emp WHERE ename = 'SMITH');

-- 在from子句中
SELECT * FROM (SELECT * FROM person ORDER BY age) WHERE rownum<=5;

-- 在having子句中
--- 求平均年龄大于江苏省平均年龄的省份及平均年龄
SELECT address,AVG(age) FROM student GROUP BY address HAVING AVG(age)>(SELECT AVG(age) FROM student WHERE address='江苏省');


二、查询语句语法

1. 在where中不能使用多行函数

--报错
select sex from person where count(*)>0;

2. group by总结

--总结:语句中如果有group by,那么在select语句中
--不可以放:
--不是group by后面的列,
--以及对不是group by后面的列使用单行函数情况
-- 一般放:group by后面的列直接展示、多行函数(背诵二)
select sex,max(age),min(age),sum(age),avg(age),count(age)
from person
group by sex;

3. select后面

--select后不可以放的列,就不能出现在order by后面

4. 书写顺序

--其中select和from是必须的,其他关键词是可选的
select--from--where--group by--having--order by

5. 执行顺序(与书写顺序不一样)

from--where--group by--having--select--order by,

6. having使用前提

语句中使用group by

7. 语句中如果有group by

那么在having中,与select后面可以放的内容相同

8. 两个过滤

where(不能使用多行函数,其它的都可以)
having(多行函数必须使用having)
posted @ 2021-09-12 10:20  难删亦删  阅读(102)  评论(0)    收藏  举报