您的位置:首页 > 数据库

sql 查询语言

2014-02-24 17:38 363 查看
sql 查询语言包括以下 4 种 

 1.数据定义DDL(如:创, 该, 删数据库对象) 

 2.数据操纵DML(如:insert, update, delete, select) 

 3.数据控制DCL(如:grant授予权限, revoke删除权限) 

 4.事务控制TCL(如:commit, rollback, savepoint) sql 

语句编写规则 1.sql 关键字不区分大小写 2.对象名与列名不区分大小写 3.字符值与日期区分大小写. 例如以下两条语句 select * from emp where ename = 'scott'; select * from emp where ename = 'SCOTT'; 4.每条 sql 语句要以分号结束 数据类型: 1.date select * from scott.emp; select to_char(hiredate, 'yyyy-mm-dd') "date" from scott.emp;
create table 语句: 商品类型: create table tb_shopType ( id number(10) primary key, typeName varchar2(10) not null ) 商品信息: create table tb_shop ( id number(10) primary key, shopId varchar2(20) unique not null, shopName varchar(20) not null, price number(6, 2) not
null, shopTypeId number(10) not null, manufacturingDate date not null, -- 创建约束 constraint ck_price check(price > 0), -- 外键信息 constraint fk_shopTypeId foreign key(shopTypeId) references tb_shopType(id) ) -- 在当前用户 sqlplus(命令窗体) 模式下才能用: 查看表结构 desc tb_shop; //
给表添加外键信息 ALTER TABLE tbl_fwxx ADD CONSTRAINT fk_tbl_fwxx FOREIGN KEY (LXID) REFERENCES Tbl_Fwlx(LXID);*/ -- 查询表 select * from tb_shopType; select * from tb_shop; -- 向已经创建的表增加一个新列 alter table tb_shopType add memo varchar2(100); -- 修改表中指定列的数据类型和长度 alter table
tb_shopType modify memo varchar2(50); -- 删除指定表中的列 alter table tb_shopType drop column memo; -- 创建用户 create user maran identified by 123 account unlock;-- 删除用户-- drop user maran cascade;select * from Users;----------------------------------------------------------------------------------------------------------------------------------------
阶段一 over 窗口函数的使用 ------------------------------------over 窗口函数用于计算基于组的某种聚合值, 该函数针对每个组返回多行, 而聚合函数对于每个组只返回一行.partition 用于设置统计的区间-- 指导部分/*create table tb_sale ( id number(10) primary key, saleDate date not null, sale number(10) not null );-- 添加数据insert into tb_sale
values(1, '1-2月-10', 100);insert into tb_sale values(2, '2-2月-10', 200);insert into tb_sale values(3, '3-2月-10', 300);insert into tb_sale values(4, '4-2月-10', 400);insert into tb_sale values(5, '1-2月-10', 10);insert into tb_sale values(6, '2-2月-10', 20);insert
into tb_sale values(7, '3-2月-10', 30);insert into tb_sale values(8, '4-2月-10', 40);*/-- 删除数据delete tb_sale where id > 0-- 查询数据select * from tb_sale;-- 按天累加统计营业额select a.saledate, a.sale, sum(a.sale) over(order by a.saledate) salesum from tb_sale a;select *
from tb_sale order by saledate;-- 练习部分/*create table tb_empsale ( id number(10) primary key, -- 编号 empno number(5) not null, -- 雇员编号 shopId varchar2(10) not null, -- 商品编号 sales number(5) not null, -- 销售量 saleYear number(4) not null -- 年份);*/insert into tb_empsale
values(1, 10, 'S001', 100, 2007);insert into tb_empsale values(2, 10, 'S001', 300, 2008);insert into tb_empsale values(3, 10, 'S002', 300, 2007);insert into tb_empsale values(4, 10, 'S002', 300, 2008);insert into tb_empsale values(5, 20, 'S001', 150, 2007);insert
into tb_empsale values(6, 20, 'S001', 350, 2008);insert into tb_empsale values(7, 20, 'S002', 200, 2007);insert into tb_empsale values(8, 20, 'S002', 500, 2008);-- 统计每个商品的销售总量及该商品总的销量-- 自己写的select a.id 编号, a.empno 员工, a.shopid 商品类型, a.sales 商品销量, sum(a.sales)
over(order by(a.shopid)) 销售总量 from tb_empsale a;-- 书上代码 partition 用于设置统计的区间select a.empno, a.shopid, sum(a.sales) sumsale, sum(sum(a.sales)) over(partition by a.shopid) shopsales from tb_empsale a group by a.empno, a.shopid;select empno 员工编号, sum(sales) 员工销量,
sum(sum(sales)) over(partition by shopid) 商品销量 from tb_empsale group by empno, shopid-------------------------------------------------------------------------------------------------------------------------------------- 阶段二 rank 函数的使用 ------------------------------------rank
函数用于计算一个值在一组值中的排位, 排位是以 1 开始的连续整数, 具有相等的值的行排位相同. 序数值后跳跃相应的数值, 即如果两行的序数为 1, 则没有序数为 2, 下一行的序数为 3 语法为: rank() over([partition by column] order by order_by_clause) rank-- 指导部分/*create table tb_score( id number(10) primary key, studId varchar2(10) not null, studName
varchar2(20) not null, math number(2) not null, english number(2) not null, china number(2) not null);insert into tb_score values(1, 'S001', '张三', 60, 70, 80);insert into tb_score values(2, 'S002', '李四', 60, 70, 80);insert into tb_score values(3, 'S003', '王五',
80, 70, 85);insert into tb_score values(4, 'S004', '赵六', 78, 80, 90);insert into tb_score values(5, 'S005', '张小小', 70, 80, 90);insert into tb_score values(6, 'S005', '马超', 60, 81, 52);delete tb_score*/select * from tb_score;rollback;-- 统计学生分数的排名select a.studid,
a.studname, a.math + a.english + a.china sumscore, rank() over(order by a.math + a.english + a.china desc) rank from tb_score a;-- 练习部分-- 1.使用 rank 函数以部门为参考依据统计雇员工的排名情况 select * from emp; select * from dept; -- 自己书写 select a.mgr 部门编号, a.ename 姓名, sum(a.sal)
工资, b.dname 部门, rank() over(order by sum(a.sal) desc) 排名 from emp a, dept b where a.deptno = b.deptno group by a.ename, b.dname, a.mgr; -- 书上代码 select a.empno, a.ename, a.sal, b.dname, rank() over(partition by b.deptno order by a.sal desc) rank from emp a,
dept b where a.deptno = b.deptno; -- 2.如果不以部门为参考依据, 直接计算雇员工资的排名情况, 则可以省略 "partition by column" 项 select a.empno, a.ename, a.sal, b.dname, rank() over(order by a.sal desc) rank from emp a, dept b where a.deptno = b.deptno;--------------------------------------------------------------------------------------------------------------------------------------
阶段三 rollup 函数的使用 ------------------------------------rollup 函数 与 group by 命令配合使用, 可以提供信息汇总功能(类似于 "小计"). 语法: group by rollup(分组的列)-- 指导部分-- 统计各个部门名称, 雇员名称, 工资总和, 而且每个部门都具有汇总小计功能-- 运行不带 rollup 函数的语句 select a.deptno, a.ename, sum(a.sal) from emp a group by a.deptno,
a.ename;-- 运行带 rollup 函数的语句 select a.deptno, a.ename, sum(a.sal) from emp a group by rollup (a.deptno, a.ename);-- 练习部分-- 销售记录表进行分组显示, 计算各雇员各商品的销售总额, 并实现汇总小计功能 select * from tb_empsale; select a.shopid, a.empno, sum(a.sales) from tb_empsale a group by rollup
(a.shopid, a.empno);----------------------------------------------------------------------------------------------------------------------------------- 阶段四 lag 函数的使用 ------------------------------------lag 分析函数可以在一次查询中取出同一字段的前 N 行数据, 一般与 over 窗口函数结合使用. 语法为:
lag(列名, N) over(...)-- 指导部分select a.empno, a.ename, lag(a.empno) over(order by a.empno) lag from emp a;-- 思路 /* (1):重复的部门编号只出现一次, 因此可以讲 lag 函数的特点与此特点相联系. 由于 lag 函数能够查询前一行部门编 号的值, 所以可以将当前 lag 返值的部门编号值(即上一行的部门编号)与当前部门编号值比较: 如果相等: 则表示是重复的部门, 此时不必显示部门编号; 如果不相等:
则开始查询一个新的部门, 此时可以显示该部门编号; (2):使用 lag 函数实现上述功能 */ select decode( lag(deptno) over(order by deptno), -- 返回上一行的部门编号 deptno, to_number(null), deptno -- 如果相等则返回空 ) dept, ename from emp;-- 练习(一)-- 计算各雇员各商品的销售总额, 且具有汇总小计功能, 并使用 lag 函数去掉重复的 empno select * from tb_empsale;
select a.empno, a.shopid, sum(a.sales) from tb_empsale a group by rollup(a.shopid, a.empno); -- 书上代码 select decode( lag(a.empno) over(order by a.empno), a.empno, null, a.empno) empno, a.shopid, sum(a.sales) sumsale from tb_empsale a group by rollup(a.empno,
a.shopid);-- 练习(二)-- first_value 也是 Oracle 的一个很重要的分析函数, 用于返回结果集中排在第一位的值-- 语法为: first_value (expr) over(...) select a.empno, a.ename, a.sal, a.deptno, first_value(a.ename) over(partition by a.deptno order by a.sal desc) rich_meen from emp a where a.deptno in(20,
30);----------------------------------------------------------------------------------------------------------------------------------- 操作题 ----------------------------------------------------- 1. 查询今天过生日的职工的资料. select * from emp; select * from dept; select
* from emp where to_char(hiredate, 'dd') = to_char(sysdate, 'dd'); -- 2. 统计各个部门的部门编号, 部门名称以及在 1981 出生的职工人数. select to_char(hiredate, 'yyyy-mm-dd') "date" from emp; -- 表连接 select a.deptno, b.dname, count(a.empno) from emp a, dept b where a.deptno = b.deptno
and to_char(hiredate, 'yyyy') = '1981' group by a.deptno, b.dname; -- 多表连接 select b.deptno, b.dname, count(a.empno) from emp a right join dept b on a.deptno = b.deptno and to_char(hiredate, 'yyyy') = '1981' group by b.deptno, b.dname;-- 3. 查询基本工资大于本部门平均工资的职工资料.
select * from emp a where sal > ( select avg(b.sal) from emp b where a.deptno = b.deptno); -- 各部门平均数 select b.deptno, b.dname, avg(a.sal) from emp a, dept b where a.deptno = b.deptno group by b.deptno, b.dname; -- 验证数据 select * from emp where deptno = 20 and
emp.sal > 2175;-- 4. 查询部门位置为 boston 的职工资料 select * from emp a, dept b where a.deptno = b.deptno and b.dname = 'BOSTON'; -- 5. 查询职工人数大于 4 的部门的资料 select * from dept where deptno in ( select b.deptno from emp a, dept b where a.deptno = b.deptno group by b.deptno
having count(a.ename) > 4 ); -- 创建表 -- blob: 大类型文件, 存二进制 -- clob: 存小说 /* create table tb_file( name varchar2(50) unique, fileBytes blob ) */ /* select * from tb_file; select name from tb_file insert into tb_file values(); delete tb_file where name = '妖精的尾巴国语第1集[高清版].mp4';
select * from tb_file where name = '妖精的尾巴国语第1集[高清版].mp4';*/---------------------------------------------- 函数 ------------------------------------------------------------------------------- 日期函数:-- add_months(d, 整数) 指定日期月份, 返回指定后的月数后的值(时间) select add_months(sysdate,
-1) from dual;-- months_between(d1, d2) 指定两个日期, 返回两个之间的月份数(浮点型) select months_between(sysdate, to_date('2013-1-1', 'yyyy-mm-dd')) from dual; -- last_day(d) 指定一个日期, 返回指定日期对应月份的最后一天(时间) select last_day(sysdate) from dual; -- next_day(d, day) 指定一个日期和星期数(1 - 7),
返回下个星期的时间值 select next_day(sysdate, 1) from dual;-- extract(fmt, d) 指定 fmt 提取格式和日期, 返回一个 varchar select extract(year from sysdate) from dual;------------------------------- 字符函数:-- lower(c) 小写转换(大写转小写) select lower('ABCdefG') from dual; -- upper(c) 大写转换(小写转大写)
select upper('abcdFG') from dual;-- ltrim(c1, c2) 从 c1 中去左边指定 c2 的字符, -- 如果左边第一个字符不相等, 则返回原字符串 select ltrim('abcdefg', 'abc') from dual;-- rtrim(c1, c2) 从 c1 中去右边指定 c2 的字符 -- 如果右边第一个字符不相等, 则返回原字符串 select rtrim('abcdefg', 'gfe') from dual; -- replace(c1, c2,
[c3]) 从 c1 中删除指定 c2 的字符 -- 注意 c2 是 c1 中出现的连续字符, 不然返回原字符 select replace('abcdefg', 'ab') from dual; select replace('abcdefg', 'ad', 'maran') from dual; -- 把 c1 中的 c2 替换成 c3-- instr(c1, c2) 从 c1 中查找 c2 首次出现的位置 select instr('abcdefg', 'd') from dual; -- substr(c,
m,
) select substr('abcdefg', 3) from dual; -- 截取第三个字符(包含第三个)到结束 select substr('abcdefg', 3, 4) from dual; -- 截取第三个字符(包含第三个)到 4 个长度结束 -- concat(c1, c2) 连接字符串 select concat('abc', 'defg') from dual; -- length(c) 返回该字符串的长度 select length('abcdefg') from dual;
------------------------------- 数学函数:-- abs(n\f) 绝对值 参数可以是 整数 或者 浮点型 select abs(-1.2) from dual;-- ceil(向上取整) select ceil(1.1) from dual; -- 返回 2-- floor(向下取整) select floor(1.1) from dual; -- 返回 1 -- power(n, m) 求冥 select power(2, 4) from dual; -- 4 个 2 相乘--
mod(n, m) 取模 select mod(10, 4) from dual; -- 10 % 5-- round(浮点型) select round(1.5) from dual; -- 四舍五入 -- trunc(浮点型) select trunc(1234.123456, 2) from dual; -- 保留小数点后 2 位 ------------------------------- 转换函数:-- 日期-- 格式:-- yyyy yy 年的表示:-- YYYY表示4位数字,-- YY表示2位数字
-- MM MONTH MON 月份表示:-- MM月份的数字表示,-- MONTH有为月的名称,-- MON为月名称的缩写,-- 在中文环境下,MONTH,MON都是“X月” 的形式-- DD DDD DD:当月的第几天;-- DDD:当年的第几天-- -- D DY DAY 表示星期几:-- D-数字表示;DAY-英文表示,-- DY-缩写,在中文环境下,-- DAY和DY都是“星期X”形式-- HH HH24 SS MI 时间表示:-- HH为小时、-- SS为秒、-- MI为分。-- HH24为24小时形式--
AM PM 表示时间的上午和下午
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: