
1打开plsql并转到登录页面。
2以管理员身份登录数据库。
3登录后,创建一个新的SQL窗口。
4,输入,以下语句选择afile#,aname,abytes / 1024/1024 CurrentMB,ceilHWM ablock_size / 1024/1024Resizeto,abytes - HWM a block_size / 1024/1024 releaseMB;
5单击“执行”按钮以执行查询 *** 作。
6,查询后,可以在查询结果中看到每个数据库文件的具体路径。
select from
(
select row_number() over(partition by '分组' order by '日期') as rownum -- 排序并分组
, -- 所需显示的字段
from 表
) as T
where Trownum = 1
对每组的数据按日期排序并加上行号
取出时只取行号为1,也就是第一条数据。
一、简单查询语句
1 查看表结构
SQL>DESC emp;
2 查询所有列
SQL>SELECT FROM emp;
3 查询指定列
SQL>SELECT empmo, ename, mgr FROM emp;
SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项
4 查询指定行
SQL>SELECT FROM emp WHERE job='CLERK';
5 使用算术表达式
SQL>SELECT ename, sal13+nvl(comm,0) FROM emp;
nvl(comm,1)的意思是,如果comm中有值,则nvl(comm,1)=comm; comm中无值,则nvl(comm,1)=0。
SQL>SELECT ename, sal13+nvl(comm,0) year_sal FROM emp; (year_sal为别名,可按别名排序)
SQL>SELECT FROM emp WHERE hiredate>'01-1月-82';
6 使用like *** 作符(%,_)
%表示一个或多个字符,_表示一个字符,[charlist]表示字符列中的任何单一字符,[^charlist]或者[!charlist]不在字符列中的任何单一字符。
SQL>SELECT FROM emp WHERE ename like 'S__T%';
7 在where条件中使用In
SQL>SELECT FROM emp WHERE job IN ('CLERK','ANALYST');
8 查询字段内容为空/非空的语句
SQL>SELECT FROM emp WHERE mgr IS/IS NOT NULL;
9 使用逻辑 *** 作符号
SQL>SELECT FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%';
10 将查询结果按字段的值进行排序
SQL>SELECT FROM emp ORDER BY deptno, sal DESC; (按部门升序,并按薪酬降序)
二、复杂查询
1 数据分组(max,min,avg,sum,count)
SQL>SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;
SQL>SELECT FROM emp where sal=(SELECT MAX(sal) from emp));
SQL>SELEC COUNT() FROM emp;
2 group by(用于对查询结果的分组统计) 和 having子句(用于限制分组显示结果)
SQL>SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;
SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;
对于数据分组的总结:
a 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中)
b 如果select语句中同时包含有group by, having, order by,那么它们的顺序是group by, having, order by。
c 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须出现在group by子句中,否则就是会出错。
使用group by不是使用having的前提条件。
3 多表查询
SQL>SELECT ename,esal,ddname FROM emp e, dept d WHERE edeptno=ddeptno order by ddeptno;
SQL>SELECT eename,esal,sgrade FROM emp e,salgrade s WHER esal BETWEEN slosal AND shisal;
4 自连接(指同一张表的连接查询)
SQL>SELECT erename, eeename mgr_name from emp er, emp ee where ermgr=eeempno;
5 子查询(嵌入到其他sql语句中的select语句,也叫嵌套查询)
51 单行子查询
SQL>SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');查询表中与smith同部门的人员名字。因为返回结果只有一行,所以用“=”连接子查询语句
52 多行子查询
SQL>SELECT ename,job,sal,deptno from emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);查询表中与部门号为10的工作相同的员工的姓名、工作、薪水、部门号。因为返回结果有多行,所以用“IN”连接子查询语句。
in与exists的区别: exists() 后面的子查询被称做相关子查询,它是不返回列表的值的。只是返回一个ture或false的结果,其运行方式是先运行主查询一次,再去子查询里查询与其对 应的`结果。如果是ture则输出,反之则不输出。再根据主查询中的每一行去子查询里去查询。in()后面的子查询,是返回结果集的,换句话说执行次序和 exists()不一样。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。
53 使用ALL
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的所有员工工资都高的员工的姓名、薪水和部门号。以上两个语句在功能上是一样的,但执行效率上,函数会高 得多。
54 使用ANY
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);查询工资比部门号为30号的任意一个员工工资高(只要比某一员工工资高即可)的员工的姓名、薪水和部门号。以上两个语句在功能上是 一样的,但执行效率上,函数会高得多。
55 多列子查询
SQL>SELECT FROM emp WHERE (job, deptno)=(SELECT job, deptno FROM emp WHERE ename='SMITH');
56 在from子句中使用子查询
SQL>SELECT empdeptno,empename,empsal,t_avgsalavgsal FROM emp,(SELECT empdeptno,avg(empsal) avgsal FROM emp GROUP BY empdeptno) t_avgsal where empdeptno=t_avgsaldeptno AND empsal>t_avgsalavgsal ORDER BY empdeptno;
57 分页查询
数据库的每行数据都有一个对应的行号,称为rownum
SQL>SELECT a2 FROM (SELECT a1, ROWNUM rn FROM (SELECT FROM emp ORDER BY sal) a1 WHERE ROWNUM<=10) a2 WHERE rn>=6;
指定查询列、查询结果排序等,都只需要修改最里层的子查询即可。
58 用查询结果创建新表
SQL>CREATE TABLE mytable (id,name,sal,job,deptno) AS SELECT empno,ename,sal,job,deptno FROM emp;
59 合并查询(union 并集, intersect 交集, union all 并集+交集, minus差集)
SQL>SELECT ename, sal, job FROM emp WHERE sal>2500 UNION(INTERSECT/UNION ALL/MINUS) SELECT ename, sal, job FROM emp WHERE job='MANAGER';
合并查询的执行效率远高于and,or等逻辑查询。
510 使用子查询插入数据
SQL>CREATE TABLE myEmp(empID number(4), name varchar2(20), sal number(6), job varchar2(10), dept number(2)); 先建一张空表;
SQL>INSERT INTO myEmp(empID, name, sal, job, dept) SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno=10; 再将emp表中部门号为10的数据插入到新表myEmp中,实现数据的批量查询。
511 使用了查询更新表中的数据
SQL>UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:
如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。
首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:
现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。
下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:
类似于Python中 :print(要打印的东西)
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、表达式、字段、也可以是函数
补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:
2、 条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
1)语法
2)分类
①条件表达式
②逻辑表达式
③模糊查询
⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。
3、 排序查询
1)语法
2)举栗
⭐ 注意:order by 一定要放到 语句最后(limit前面)
4、分组查询
1)语法
2)特点
①可以按单个字段分组
②和分组函数一同查询的字段最好是分组后的字段
③分组筛选(where 和 having区别)
④可以按多个字段分组,字段之间用逗号隔开
⑤可以支持排序
⑥having后可以支持别名
3)举栗
⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)
5、 常见函数
1)单行函数
2)分组函数
3)分组函数特点
①以上五个分组函数都忽略null值,除了count()
②sum和avg一般处理数值型,max、min、count可以处理任何数据类型
③都可以搭配distinct使用,用于统计去重后的结果
④count的参数可以支持:字段、、常量值,一般放1
6、连接查询(多表查询)
单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。
①等值连接的结果 = 多个表的交集
②多个表不分主次,没有顺序要求
③一般为表起别名,提高阅读性和性能
①语法
②好处
语句上,连接条件和筛选条件实现了分离,简洁。
⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>
右连接的交集;mysql没有外连接。
自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。
7、子查询
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。
①子查询都放在小括号内
②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
③子查询优先于主查询执行,主查询使用了子查询的执行结果
④子查询根据查询结果的行数不同分为以下两类:
2)举栗
8、分页查询 (可选)
实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。
2)特点
①起始条目索引默认从0开始
②limit子句放在查询语句的最后
③公式:select from 表 limit (page-1)sizePerPage,
3)举栗
9、union联合查询
union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>
2)特点
①多条查询语句的查询的列数必须是一致的
②多条查询语句的查询的列的类型几乎相同
③union 代表去重,union all 代表不去重
3)举栗
UNION 和 UNION ALL 运行结果的区别如下:
⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION
好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!
GROUPBY是分组查询,一般GROUPBY是和聚合函数配合使用。
用了GROUPBY按ITEM。ITEMNUM这个字段分组,那其他字段内容不同。右边3条如何变成一条,所以需要用到聚合函数,比如selectA,count(B)数量fromtablegroupbyAgroupby有一个原则,就是select后面的所有列中,没有使用聚合函数的列,必须出现在groupby后面。
扩展资料:
SQL语言结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL语言允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言作为数据输入与管理的接口。SQL语言语句可以嵌套,这使他具有极大的灵活性和强大的功能。
group by, 是分组检测,若在分组上还有条件要用having来指出条件
count是统计符合条件的数量并去掉重复的,给你个例子:
有学生表S(s#,sn,sex,age)即学号,姓名,性别,年龄,课程表C(c#,cn)课程号,课程名选课表SC(s#,c#,grade)学号,课程号,成绩
例:检索出来选修课程至少等于3门的学生学号和选课的门数
SQL>select s#,count()
from sc
group by s#
having count()>=3;不知道你能不能明白
以上就是关于oracle数据库的分组查询的语句怎么写全部的内容,包括:oracle数据库的分组查询的语句怎么写、sql数据库怎么实现分组并取每组的前1条语句,按日期排序、SQL查询语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)