经典_Oracle的sql语句百例训练 (1)

合集下载

oracle sql练习题

oracle sql练习题

oracle sql练习题1. 编写一个SQL查询,找出员工表中工资最高的员工的姓名和工资。

```SELECT ename, salFROM empWHERE sal = (SELECT MAX(sal) FROM emp);```2. 编写一个SQL查询,计算出每个部门的平均工资,并按照平均工资降序排列。

```SELECT deptno, AVG(sal) as avg_salaryFROM empGROUP BY deptnoORDER BY avg_salary DESC;```3. 编写一个SQL查询,找出没有任何员工的部门(即部门中没有员工记录的部门)。

```SELECT d.deptno, d.dnameFROM dept dLEFT JOIN emp e ON d.deptno = e.deptnoWHERE e.deptno IS NULL;```4. 编写一个SQL查询,找出在每个部门中薪资排名第二高的员工的姓名和工资。

```SELECT d.dname, e.ename, e.salFROM emp eINNER JOIN dept d ON e.deptno = d.deptnoWHERE e.sal = (SELECT DISTINCT salFROM empWHERE deptno = e.deptnoORDER BY sal DESCOFFSET 1 ROW FETCH FIRST 1 ROW ONLY);```5. 编写一个SQL查询,找出拥有部门管理权限(即至少管理一个部门)且工资不超过5000的员工的姓名。

```SELECT enameFROM empWHERE empno IN (SELECT DISTINCT mgrFROM empWHERE sal <= 5000);```6. 编写一个SQL查询,找出在工资表中有重复记录的员工姓名和工资。

```SELECT ename, salFROM empGROUP BY ename, salHAVING COUNT(*) > 1;```7. 编写一个SQL查询,找出至少在两个部门工作过的员工的姓名。

oracle 复杂sql练习题

oracle 复杂sql练习题

oracle 复杂sql练习题Oracle 复杂 SQL 练习题在数据库管理系统中,SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准语言。

Oracle是一种常用的关系数据库管理系统,它支持SQL语言的广泛应用。

本文将介绍一些复杂的Oracle SQL练习题,旨在提高读者对SQL语言的理解和应用能力。

1. 学生成绩统计假设有两张表:学生表(Student)和成绩表(Score)。

学生表包含学生的姓名(Name)和学号(ID),成绩表包含学生的学号(ID)和对应的科目(Subject)及成绩(Grade)。

现在需要统计每个学生的总分和平均分,并按照平均分从高到低排序。

解决方案:```sqlSELECT , SUM(sc.Grade) AS TotalGrade, AVG(sc.Grade) AS AverageGrade FROM Student sJOIN Score sc ON s.ID = sc.IDGROUP BY ORDER BY AverageGrade DESC;```2. 部门工资排名假设有两张表:员工表(Employee)和部门表(Department)。

员工表包含员工的姓名(Name)、工号(ID)和所属部门(DeptID),部门表包含部门的名称(DeptName)和部门编号(DeptID)。

现在需要统计每个部门的平均工资,并按照平均工资从高到低排序。

解决方案:```sqlSELECT d.DeptName, AVG(e.Salary) AS AverageSalaryFROM Department dJOIN Employee e ON d.DeptID = e.DeptIDGROUP BY d.DeptNameORDER BY AverageSalary DESC;```3. 订单统计假设有三张表:订单表(Order)、订单详情表(OrderDetail)和商品表(Product)。

oracle版本的sql语句

oracle版本的sql语句

【1】Oracle版本的SQL语句【2】Oracle是一个流行的关系型数据库管理系统,其SQL语句是与标准SQL兼容的,但也包含了一些特有的功能和语法。

【3】以下是一些常见的Oracle版本的SQL语句,供大家参考和学习。

【4】查询语句【5】1. 查询所有的列SELECT * FROM table_name;【6】2. 查询指定的列SELECT column1, column2, ... FROM table_name;【7】3. 按条件查询SELECT * FROM table_name WHERE condition;【8】4. 模糊查询SELECT * FROM table_name WHERE column_name LIKE 'value';【9】5. 范围查询SELECT * FROM table_name WHERE column_name BETWEENvalue1 AND value2;【10】6. 排序查询SELECT * FROM table_name ORDER BY column_name;【11】7. 分组查询SELECT column1, COUNT(column2) FROM table_name GROUP BY column1;【12】更新语句【13】1. 更新单个列UPDATE table_name SET column_name = value WHERE condition;【14】2. 更新多个列UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;【15】删除语句【16】1. 删除指定行DELETE FROM table_name WHERE condition;【17】2. 删除所有行DELETE FROM table_name;【18】插入语句【19】1. 插入单行数据INSERT INTO table_name VALUES (value1, value2, ...);【20】2. 插入多行数据INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...), (value1, value2, ...);【21】子查询【22】1. 单行子查询SELECT column_name FROM table_name WHERE column_name = (SELECT column_name FROM table_name);【23】2. 多行子查询SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM table_name);【24】联合查询【25】1. 内连接SELECT * FROM table1 INNER JOIN table2 ONtable1.column_name = table2.column_name;【26】2. 外连接SELECT * FROM table1 LEFT JOIN table2 ONtable1.column_name = table2.column_name;【27】函数【28】1. 聚合函数SELECT AVG(column_name) FROM table_name;【29】2. 字符函数SELECT UPPER(column_name) FROM table_name;【30】3. 数值函数SELECT ROUND(column_name, n) FROM table_name;【31】4. 日期函数SELECT MONTHS_BETWEEN(date1, date2) FROM table_name;【32】视图【33】1. 创建视图CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition;【34】2. 删除视图DROP VIEW view_name;【35】存储过程【36】1. 创建存储过程CREATE PROCEDURE procedure_nameASBEGINsql_statements;END;【37】2. 调用存储过程EXEC procedure_name;【38】以上就是一些常见的Oracle版本的SQL语句,希望对大家有所帮助。

sql常用语句100例

sql常用语句100例

--update phoneinfo set cityname = '克孜勒苏柯尔克孜' where cityname = '克孜勒苏柯尔克孜州'--update phoneinfo set cityname = '湘西' where pad1 = '湖南&nbsp;吉首'select * from dbo.PhoneInfo--update dbo.PhoneInfo set provincename=b.provincename,cityname=b.cityname from dbo.PhoneInfo a,PhoneInfo_hl b--where a.phonebound=b.phonebound--select * from dbo.UnknowPhoneBound--select * from dbo.Area--select * from phoneinfo a, phoneinfo_old b, phoneinfo_hl c where a.phonebound = b.phonebound and a.phonebound = c.phonebound and (a.cityname <> b.cityname or a.cityname <> c.cityname)--select * from phoneinfo a, phoneinfo_hl b where a.phonebound = b.phonebound and a.cityname <> b.citynameselect * from phoneinfo a, phoneinfo_old b where a.phonebound = b.phonebound and a.cityname <> b.cityname--select * into phoneinfo_bak from phoneinfo--select * from phoneinfo_bakselect * from phoneinfo a, phoneinfo_old b where a.phonebound = b.phonebound and a.cityname <> b.cityname--select * from dbo.PhoneInfo_Telecom--update PhoneInfo_Telecom set provincename = '内蒙古' where pad1 = '内蒙兴安盟'update PhoneInfo set cityname = '酒泉' where pad1 = '甘肃&nbsp;酒泉嘉峪关'--update dbo.PhoneInfo_old set provincename=b.provincename,cityname=b.cityname from dbo.PhoneInfo_old a,PhoneInfo_Telecom b--where a.phonebound=b.phoneboundcreate table client_allasselect t2.mobilephone,t2.clientName,t2.sex,t2.birthdayyear,t2.birthdaymonth,t2.birthdaydate,t2.cardtype,t2.FundPurchaseTotalFee,t2.InsurePurchaseTotalFee,t2.FundSource,t2.InsureSource,t2.BankSourcefrom (select mobilephone,clientName,Sex,birthdayyear,birthdaymonth,birthdaydate,cardtype,fund_sum_fee FundPurchaseTotalFee,insure_sum_fee InsurePurchaseTotalFee,case when sourceindustry = '±£ÏÕ'then'±£ÏÕ'end as FundSource,case when sourceindustry = '»ù½ð'then'»ù½ð'end as InsureSource,case when sourceindustry = 'ÒøÐÐ'then'ÒøÐÐ'end as BankSource from (select c.*, f.fund_sum_fee, insure_sum_feefrom client_55 cleft join (select sum(cast(fee as float)) fund_sum_fee,mobilephonefrom fund_client_behavior_55group by mobilephone) f on c.mobilephone =f.mobilephoneleft join (select sum(cast(fee as float)) insure_sum_fee,mobilephonefrom client_purchase_55group by mobilephone) i on i.mobilephone =c.mobilephone) t) t2。

Oracle综合sql语句练习

Oracle综合sql语句练习

Oracle综合sql语句练习
沃克IT教育--测试表,请先在自己的用户模式下创建如下表
练习:
注意:以下练习中的数据是根据初始化到数据库中的数据来写的SQL 语句,请大家务必注意。

16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;
##没上过编号“c002”课程的同学学号
##没上过编号“c002”课程的同学学号(总数);
##没上过编号“c002”课程的同学学号(排序)
18、按各科平均成绩从低到高和及格率的百分数从高到低顺序
28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序
40、统计每门课程的学生选修人数(超过10 人的课程才统计)。

要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
42、查询全部学生都选修的课程的课程号和课程名。

oracle的sql练习题

oracle的sql练习题

oracle的sql练习题1. 编写SQL查询语句,从员工表(EMPLOYEES)中选择工资(SALARY)大于5000的员工信息,按照工资的降序排列。

```sqlSELECT * FROM EMPLOYEES WHERE SALARY > 5000 ORDER BY SALARY DESC;```2. 编写SQL查询语句,从部门表(DEPARTMENTS)中选择部门名称(DEPARTMENT_NAME)、部门位置(LOCATION_ID)以及该部门员工的数量,按照员工数量的升序排列。

```sqlSELECT DEPARTMENT_NAME, LOCATION_ID, COUNT(*) AS EMPLOYEE_COUNTFROM DEPARTMENTSJOIN EMPLOYEES ON DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_IDGROUP BY DEPARTMENT_NAME, LOCATION_IDORDER BY EMPLOYEE_COUNT ASC;```3. 编写SQL查询语句,从员工表(EMPLOYEES)中选择员工的姓名(FIRST_NAME)以及所属部门的名称(DEPARTMENT_NAME),要求只选择属于部门名称以"E"开头的员工信息。

```sqlSELECT FIRST_NAME, DEPARTMENT_NAMEFROM EMPLOYEESJOIN DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_IDWHERE DEPARTMENT_NAME LIKE 'E%';```4. 编写SQL查询语句,从员工表(EMPLOYEES)中选择员工的姓名(FIRST_NAME)以及所属部门的名称(DEPARTMENT_NAME),要求只选择属于部门名称以"A"结尾的员工信息,且员工的工资(SALARY)在3000到6000之间。

oracle sql 试题及答案

oracle sql 试题及答案

oracle sql 试题及答案在Oracle数据库管理和开发中,SQL(Structured Query Language)是一种标准化的关系型数据库语言。

在这篇文章中,我们将提供一些Oracle SQL试题及其答案,旨在帮助读者巩固和加深对Oracle SQL语言的理解。

请注意,答案中不再重复题目,仅给出相应的解答。

1. 以下SQL语句中,哪一个用于创建一个名为"Employees"的表?CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,LastName VARCHAR2(50),FirstName VARCHAR2(50),DateOfBirth DATE);2. 在一个名为"Employees"的表中,你想要删除LastName为"Smith"的所有行。

你应该使用以下哪个SQL语句?DELETE FROM Employees WHERE LastName = 'Smith';3. 假设你有一个名为"Employees"的表,你想要增加一个名为"Salary"的列,数据类型为NUMBER(10,2)。

你应该使用以下哪个SQL 语句?ALTER TABLE Employees ADD (Salary NUMBER(10,2));4. 以下SQL查询语句将返回哪些列?SELECT LastName, FirstName FROM Employees;答案:该查询将返回"Employees"表中的LastName和FirstName列。

5. 以下SQL语句将返回"Employees"表中有多少条记录?SELECT COUNT(*) FROM Employees;答案:该查询将返回"Employees"表中的记录数。

oracle sql 语句

oracle sql 语句

oracle sql 语句创建与此标题相符的正文并拓展:Oracle SQL是一种用于管理和处理数据库的强大编程语言。

它被广泛用于各种企业级应用程序和数据库系统中。

Oracle SQL提供了丰富的功能和语法,使开发人员能够执行各种数据库操作,如数据查询、插入、更新和删除等。

在Oracle SQL中,创建数据表是一个非常重要的操作。

通过使用CREATE TABLE语句,可以定义表的结构、字段和约束。

例如,以下是一个创建学生表的示例:CREATE TABLE Students (StudentID NUMBER(10),FirstName VARCHAR2(50),LastName VARCHAR2(50),Age NUMBER(3),Gender CHAR(1),PRIMARY KEY (StudentID));上面的语句创建了一个名为Students的表,包含了StudentID、FirstName、LastName、Age和Gender等字段。

其中,StudentID字段被定义为主键,确保了每个学生都有一个唯一的标识符。

除了创建表,Oracle SQL还提供了各种其他类型的语句,用于插入、更新和删除数据。

例如,以下是一个插入学生数据的示例:INSERT INTO Students (StudentID, FirstName, LastName, Age, Gender)VALUES (1, 'John', 'Doe', 20, 'M');上面的语句将一条新的学生记录插入到Students表中。

此外,Oracle SQL还提供了强大的查询功能,用于检索和过滤数据。

例如,以下是一个查询所有年龄大于等于18岁的学生的示例: SELECT * FROM StudentsWHERE Age >= 18;上面的语句将返回所有满足条件的学生记录。

除了基本的查询语句,Oracle SQL还支持复杂的查询操作,如联接(join)、子查询(subquery)和聚合函数(aggregate function)等。

oracle常用的SQL及语法

oracle常用的SQL及语法

1、两个oracle 开发工具介绍a)SqlDbx王金生曾推荐过的一款数据库客户端开发工具,使用容易,不需要额外的安装其它插件,有sql提示功能,支持Oracle,Sybase ASE, IBM,DB2/UDB, MicrosoftSQL Server 和ODBC数据源,免费绿色版。

b)PLSQL Developer专门针对oracle开发的一款比较专业的客户端工具,除了常用的数据库操作外,还支持存储过程及函数的调试功能等比较高级的功能,详细的操作可以安装完毕后大家去慢慢研究。

配置方式见网上找的一段方法,第二种:/view/65b5a80f6c85ec3a87c2c583.html以上提到的工具及可能用到的插件见共享目录中的文件。

2、oracle 与 sqlserver 语法大比较a)oracle各类型字段描述b)字段类型比较c)常用函数比较注:此处仅记录语法有区别的地方,更多丰富的语法请查看附件中的手册。

以下的exp为expression的缩写d)关于脏读目前我们使用的sqlserver 数据库,在查询数据时,都要求在select语句中后面跟一个(nolock)或(with nolock)来保证读取大表时不影响其它程序进程的数据操作。

在oracle中,目前还不允许脏读的方式,在每次select 后,读到的数据都是已经commit的数据,所以为了避免读取数据的不准确,程序中如果有比较耗时的sql 操作,尤其是在insert 和update后,尽量减小事务,而且要在事务结束后及时commit。

e)表(主键、外键、CHECK、UNIQUE、DEFAULT、INDEX)在创建表及其主键、外键、CHECK、UNIQUE、DEFAULT、INDEX时,SQL SERVER 与ORACLE的语法大致相同。

主要区别如下:Oracle定义表字段的default属性紧跟字段类型之后,如下:Create table MZ_Ghxx( ghlxh number primay key ,rq date default sysdate not null,….)而不能写成Create table MZ_Ghxx( ghlxh number primay key ,rq date not null default sysdate,….)f)存储过程/函数结构的不同SQLSERVER中存储过程的结构大致如下CREATE PROCEDURE procedure_name/*输入、输出参数的声明部分*/ASDECLARE/*局部变量的声明部分*/BEGIN/*主体SQL语句部分*//*游标声明、使用语句在此部分*/ENDORACLE中存储过程的结构大致如下CREATE OR REPLACE PROCEDURE procedure_name(/*输入、输出参数的声明部分*/ )AS/*局部变量、游标等的声明部分*/BEGIN/*主体SQL语句部分*//*游标使用语句在此部分*/EXCEPTION/*异常处理部分*/END ;ORACLE端FUNCTION语法说明CREATE [OR REPLACE] FUNCTION function_name[(argument [{IN | OUT | IN OUT }] ) type,…[(argument [{IN | OUT | IN OUT }] ) typeRETURN return_type {IS | AS}BEGIN…END;变量赋值在SQL SERVER语句中用如下语句对局部变量赋值(初始值或数据库表的字段值或表达式):“SELECT 局部变量名= 所赋值(初始值或数据库表的字段值或表达式)”;而在ORACLE中,将初始值赋给局部变量时,用如下语句:“局部变量名: = 所赋值(初始值或表达式);”,将检索出的字段值赋给局部变量时,用如下语句:“SELECT 数据库表的字段值INTO 局部变量名…”。

SQL语句大全实例

SQL语句大全实例

SQL语句实例表操作例1 对于表的教学管理数据库中的表STUDENTS ,可以定义如下:CREATE TABLE STUDENTS(SNO NUMERIC (6, 0) NOT NULLSNAME CHAR (8) NOT NULLAGE NUMERIC(3,0)SEX CHAR(2)BPLACE CHAR(20)PRIMARY KEY(SNO))例2 对于表的教学管理数据库中的表ENROLLS ,可以定义如下: CREATE TABLE ENROLLS(SNO NUMERIC(6,0) NOT NULLCNO CHAR(4) NOT NULLGRADE INTPRIMARY KEY(SNO,CNO)FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO)FOREIGN KEY(CNO) REFERENCES COURSES(CNO)CHECK ((GRADE IS NULL) OR (GRADE BETWEEN 0 AND 100)))例3 根据表的STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。

CREATE TABLE GIRLAS SELECT SNO, SNAME, AGEFROM STUDENTSWHERE SEX=' 女';例4 删除教师表TEACHER 。

DROP TABLE TEACHER例5 在教师表中增加住址列。

ALTER TABLE TEACHERSADD (ADDR CHAR(50))例6 把STUDENTS 表中的BPLACE 列删除,并且把引用BPLACE 列的所有视图和约束也一起删除。

ALTER TABLE STUDENTSDROP BPLACE CASCADE例7 补充定义ENROLLS 表的主关键字。

ALTER TABLE ENROLLSADD PRIMARY KEY (SNO,CNO) ;视图操作(虚表)例9 建立一个只包括教师号、姓名和年龄的视图FACULTY 。

Oracle数据库编程经典300例

Oracle数据库编程经典300例

第7章数据操作
第8章索引与视 图
实例102不指定字段的整行插入 实例103指定字段的整行插入 实例104插入空值 实例105插入唯一值 实例106使用过程中插入多行 实例107使用INSERT SELECT语句插入多行 实例108通过输入修改单个列值 实例109通过函数修改单个列值 实例110修改数据为空值
实例016使用CREATE TABLE命令创建基本表 实例017使用ALTER TABLE命令增加新字段 实例018使用ALTER TABLE命令修改字段 实例019使用ALTER TABLE命令删除字段 实例020重命名基本表 实例021复制相同结构的表 实例022使用DROP TABLE命令删除表 实例023创建主键约束 实例024创建唯一性约束
实例084返回单行的子查询 实例085含有聚合函数的单行子查询 实例086多表查询中返回结果为单行的子查询 实例087用IN谓词实现多行子查询 实例088多表查询中使用IN谓词 实例089 EXISTS子查询 实例090 EXISTS替代单行子查询 实例091相关子查询 实例092含聚合函数的相关子查询
PL/SQL控制语 句和存储过程
4
第12章触发器
5
第13章事务处 理和并发控制Fra bibliotek 第14章游标
第15章数据导 入/导出
实例143创建与注销用户 实例144修改用户口令 实例145设置和解除用户锁定 实例146更改用户名 实例147将系统权限授予用户 实例148将对象权限授予用户 实例149授予用户角色 实例150创建自定义角色 实例151收回对象权限
实例274查看Oracle版本 实例275查看表所占用的空间 实例276查看Oracle最大连接数 实例277查看并统计当前活动用户 实例278查看表空间占用空间情况 实例281自动生成查询结果序号 实例282查看数据文件放置的路径 实例283将查询结果导出到文本文件 实例284跟踪SQL语句执行

Oracle_PLSQL测试题与答案(绝对经典)

Oracle_PLSQL测试题与答案(绝对经典)

Oracle_PLSQL测试题与答案(绝对经典)Oracle PL/SQL测试题姓名:___ _________一、选择题1、Oracle数据库中为新创建的表分配的初始空间通常为多大(B)A、一个块B、一个区C、一个段D、c一个表空间2、关于存储过程参数,正确的说法是(B)A、存储过程的输出参数可以是标量类型,也可以是表类型B、存储过程输入参数可以不输入信息而调用过程C、可以指定字符参数的字符长度(函数的()或者过程的(number/varchar2))D、以上说法都不对3、下列说法,正确的说法是(B)A、只要在存储过程中有增删改语句,一定加自治事务B、在函数内可以修改表数据C、函数不能递归调用D、以上说法都不对4、有一产品表(编号,名称,价格,数量,所属分类),下列语法不正确的是(D)A、select * from 产品表where价格>1000B、select sum(价格) from 产品表group by 所属分类having max(价格)>1000C、select所属分类,sum(价格) from 产品表where 价格>1000 group by 所属分类D、select所属分类,sum(价格) from 产品表where max(价格)>1000 group by 所属分类5、关于触发器,下列说法正确的是(B)A、可以在表上创建INSTEAD OF 触发器B、语句级触发器不能使用“:old”和“:new”C、行级触发器不能用于审计功能D、触发器可以显式调用6、下列那些是Oracle的伪列(ACD)A、ROWIDB、ROW_NUMBER()C、LEVELD、ROWNUME、COLUMN7、当表的重复行数据很多时,应该创建的索引类型应该是( C )A、B树B、reverseC、bitmapD、函数索引8、在建表时如果希望某列的值,在一定的范围内,应建什么样的约束?(C )A、primary keyB、uniqueC、checkD、not null9、利用游标来修改数据时,所用的。

oracle的sql语句

oracle的sql语句

oracle的sql语句Oracle的SQL语句可以用于查询、插入、更新和删除数据库中的数据。

以下是一些常见的Oracle SQL语句示例:1. 查询数据:- 查询所有记录:SELECT * FROM 表名;- 查询指定列:SELECT 列名1, 列名2 FROM 表名;- 带条件查询:SELECT * FROM 表名 WHERE 条件;- 排序查询:SELECT * FROM 表名 ORDER BY 列名ASC/DESC;- 分组查询:SELECT 列名, COUNT(*) FROM 表名GROUP BY 列名;2. 插入数据:- 插入单条记录:INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);- 插入多条记录:INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2), (值3, 值4), ...;3. 更新数据:- 更新单个字段:UPDATE 表名 SET 列名 = 新值WHERE 条件;- 更新多个字段:UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 条件;4. 删除数据:- 删除所有记录:DELETE FROM 表名;- 删除满足条件的记录:DELETE FROM 表名 WHERE 条件;5. 聚合函数:- 计算总数:SELECT COUNT(*) FROM 表名;- 计算平均值:SELECT AVG(列名) FROM 表名;- 计算最大值:SELECT MAX(列名) FROM 表名;- 计算最小值:SELECT MIN(列名) FROM 表名;- 计算求和:SELECT SUM(列名) FROM 表名;这些只是一些常见的Oracle SQL语句示例,实际使用中还可以结合其他语句和函数进行更复杂的查询和操作。

oracle历史sql语句

oracle历史sql语句

oracle历史sql语句Oracle是一种流行的关系型数据库管理系统。

它的历史可以追溯到20世纪70年代末和80年代初,当时Oracle公司的创始人之一Larry Ellison开始开发他的第一个数据库产品。

在接下来几十年里,Oracle在数据库技术的领域中一直处于领导地位。

以下是Oracle历史中的一些SQL语句:1. 创建表创建表是在Oracle数据库中存储数据的第一步。

以下是创建一个名为“employees”的表的SQL语句:CREATE TABLE employees (employee_id NUMBER,first_name VARCHAR2(50),last_name VARCHAR2(50),hire_date DATE,job_id VARCHAR2(50),salary NUMBER);2. 插入数据3. 更新数据要更新Oracle数据库中的数据,可以使用UPDATE语句。

以下是将员工号为101的员工的薪水更新为55000的SQL语句:UPDATE employeesSET salary = 55000WHERE employee_id = 101;4. 删除数据5. 查询数据SELECT * FROM employees;6. 添加索引索引可以帮助加快查询数据的速度。

以下是向“employees”表中的“employee_id”列添加索引的SQL语句:CREATE INDEX emp_id_idx ON employees (employee_id);7. 删除索引DROP INDEX emp_id_idx;总之,Oracle是一种功能强大的关系型数据库管理系统,它支持各种SQL语句,可以快速存储、管理、分析和检索大量数据。

ORACLE_50个sql语句

ORACLE_50个sql语句

备注:以下语句都已经改成了oracle支持的语句。

不熟的sql:15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩???是不是有having的时候就不能用distinct而只能用group by呢???貌似是的说明:以下五十个语句都按照测试数据进行过测试,最好每次只单独运行一个语句。

问题及描述:--1.学生表Student(Sno,Sname,Sage,Ssex) --Sno 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别--2.课程表Course(Cno,Cname,Tno) --Cno --课程编号,Cname 课程名称,Tno 教师编号--3.教师表Teacher(Tno,Tname) --Tno 教师编号,Tname 教师姓名--4.成绩表SC(Sno,Cno,score) --Sno 学生编号,Cno 课程编号,score 分数*/--创建测试数据create table kxsh.student(sno char(10) primary key not null,sname varchar2(10) not null,ssex char(2) check(ssex in ('男','女')) not null,sage date);insert into kxsh.student values('2008111001','赵雷','男','1990-01-01'); insert into kxsh.student values('2008111002','钱电','男','1990-12-21'); insert into kxsh.student values('2008111003','孙风','男','1990-05-20'); insert into kxsh.student values('2008111004','李云','男','1990-08-06'); insert into kxsh.student values('2008111005','周梅','女','1991-12-01'); insert into kxsh.student values('2008111006','吴兰','女','1992-03-01'); insert into kxsh.student values('2008111007','郑竹','女','1989-07-01'); insert into kxsh.student values('2008111008','王菊','女','1990-01-20');补充1:date包含年月日时分秒,oracle默认格式为’dd-mon月-yy’(dd日子、mon月份、yy 2位的年,如’06-4月-99’ 1999年4月6日)。

经典_Oracle的sql语句百例训练

经典_Oracle的sql语句百例训练

经典_Oracle的sql语句百例训练oracle系列《一》:简单sql与单行函数使用scott/tiger用户下的emp表和dept表中顺利完成以下练,表的结构表明如下dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金登入oracle数据库1、sqlplusscott/tiger2、sqlplus/nologsql>connscott/tiger若是使用sys的账号进行登录的话,则使用以下语句sql>conn/assysdba【1】emp表中内容查阅sql>select*fromemp;失效,原因就是没找出该表中,因为该表时scott用户的表中,所以查阅时必须加之scott.emp就可以了【2】显示当前用户sql>showuser【3】查看当前用户的所有表sql>select*fromtab;【4】若想重复继续执行上一条sql语句,则在sqlplus命令行下输出\即可【5】查询一张表的结构,例如dept表sql>descdept【6】在雇员表查阅雇员的编号、姓名、工作sql>selectempno,ename,jobfromemp;【7】可以为列名取别名,在linux下oracle如果英文别名不加上双引号则会变成大写sql>selectempno编号,ename姓名,job工作fromemp;【8】查询所有的工作sql>selectdistinctjobfromemp;工作可能会重复,加之distinct关键字【9】若要求按照以下的格式进行结果输出,如no:7469,name:smith,job:clerksql>select'no:'||empno||',name:'||ename||',job:'||jobfromemp;【10】建议列举每个雇员的姓名及年薪【11】查看每月可以得到奖金的雇员信息【12】建议基本工资大于1500,同时可以申领奖金的雇员信息【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息【14】查阅在1981年雇用的全部雇员信息,between..and涵盖等同于的情况sql>select*fromempwherehiredatebetween'01-jan-81'and'31-dec-81';【15】oracle对大小敏感,所以查询时名字要区分大小写【16】建议查阅出来雇员编号不是7369、7499的雇员信息sql>select*fromempwhereempnonotin(7369,7499);【17】sql中like语句必须特别注意通配符%和_sql>select*fromempwherehiredatelike'?%';【18】查阅雇员编号不是7369的雇员信息,采用<>或!=sql>select*fromempwhereempno<>7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(asc),降序(desc)sql>select*fromempgroupbysal;【20】查阅出来部门号为10的雇员信息,查阅的信息按照工资从低至高,若工资成正比则按雇佣日期从早到晚排序sql>select*fromempwheredeptno=10groupbysaldesc,hiredateasc;数据库系统中,每个数据库之间区别最小的就是在函数的积极支持上,单行函数就是最简单的函数,单行函数分成1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接受数值输入并返回数值3、日期函数:对日期型数据进行操作4、切换函数:将一种数据初始化为另一种数据类型5、通用型函数:nvl、decode函数字符函数:【1】大小写切换upper和lowersql>selectupper('smith')fromdual;【2】将雇员姓名变为开头字母大写,initcapsql>selectinitcap(ename)fromemp;字符函数中存有相连接函数concat,但不如||不好用,除了字符串处置的一些函数字符串撷取:substr()字符串长度:length()内容替代:replace()sql>selectsubstr('hello',1,3),length('hello'),replace('hello','l','x')fromdual;这里注意的是oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】建议表明所有雇员的姓名及姓名的后3个字符sql>selectename,substr(ename,length(ename)-2)fromemp;以上操作显得较为麻烦,substr()函数是可以倒着截取sql>selectename,substr(ename,-3,3)fromemp;数值函数:1、四舍五入:round()2、截断小数位:trunc()3、取余(取模):modsql>selectround(789.536)fromdual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)sql>selectround(783.56,2)fromdual;【2】使用mod()函数进行取余操作sql>selectmod(10,3)fromdual;日期函数:1、日期-数字=日期2、日期+数字=日期3、日期-日期=数字(天数)【1】求出当前日期sql>selectsysdatefromdual;oracle提供了以下的日期函数支持:months_between():谋出来给定日期范围的月数add_months():在指定日期上加上指定的月数,求出之后的日期next_day():下一个的今天的日期last_day():谋出来给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数sql>selectempno,ename,round(months_between(sysdate,hiredate))fromemp;。

Oracle的sql语句练习题与答案

Oracle的sql语句练习题与答案

Oracle的sql语句练习题含答案(二)Oracle_SQL练习题11.选择部门30中的所有员工.2.列出所有办事员(CLERK)的姓名,编号和部门编号.3.找出佣金高于薪金的员工.4.找出佣金高于薪金的60%的员工.5.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料.6.找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料.7.找出收取佣金的员工的不同工作.8.找出不收取佣金或收取的佣金低于100的员工.9.找出各月倒数第3天受雇的所有员工.10.找出早于12年前受雇的员工.11.以首字母大写的方式显示所有员工的姓名.12.显示正好为5个字符的员工的姓名.13.显示不带有"R"的员工的姓名.14.显示所有员工姓名的前三个字符.15.显示所有员工的姓名,用a替换所有"A"16.显示满10年服务年限的员工的姓名和受雇日期.17.显示员工的详细资料,按姓名排序.18.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面.19.显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序.20.显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面.21.显示在一个月为30天的情况所有员工的日薪金,忽略余数.22.找出在(任何年份的)2月受聘的所有员工。

23.对于每个员工,显示其加入公司的天数.24.显示姓名字段的任何位置包含"A"的所有员工的姓名.25.以年月日的方式显示所有员工的服务年限.答案:1.select ename,job,mgr,hiredate,sal,comm ,deptno from emp where deptno=30;2.select ename,empno,deptno from emp where job='CLERK';3.select * from emp where comm>sal;4.select *from empwhere comm>sal*0.6;5.select empno ,ename, job,hiredate,sal,comm,deptnofrom empwhere( job='MANAGER' and deptno=10)or( job='CLERK' and deptno=20);6.select empno,ename,job, hiredate,sal, deptnofrom empwhere ( job='MANAGER' and deptno=10)or( job='CLERK' and deptno=20)or((job <>'MANAGER' and job<>'CLERK') and sal>=2000);7.select distinct ename,job,commfrom empwhere NVL(comm,0)>0;注意如果像上面这样写,就job ename comm 3个同时不同的都列出来正确的是:select distinct jobfrom empwhere NVL(comm,0)>0;8.select ename,comm. from emp where NVL(comm,0)=0 or NVL(comm,0)<100; 如果按上面的写法就重复了,直接可以写成select ename,commfrom empwhere NVL(comm,0)<100;9 select ename, job,last_day(hiredate)-3from emp;select ename, job,hiredatefrom empwhere hiredate=last_day(hiredate)-2;10.select ename,jobfrom empwhere months_between(sysdate,hiredate)/12>1211.select initcap(ename) name ,job, hiredatefrom emp;12. select ename,job,hiredate from emp where length(ename)=5;13 select ename, job from emp where ename not like '%R%';14.select substr(ename, 1,3) name,job,hiredate from emp;15select replace(ename, 'A','a') name,job,hiredate from emp;16select ename, job, hiredate from empwhere months_between(sysdate,hiredate)/12>=10;17. select * from emp order by ename;18.select ename, hiredate from emp order by hiredate desc;19.select ename,job, sal from emp order by job desc, sal asc;20.select ename, to_char(hiredate,'yyyy') year, to_char(hiredate,'mm') monthsfrom emporder by months, year asc;21.select ename, sal/30 dailysalfrom emp;22. select ename, hiredatefrom empwhere to_char(hiredate,'mm')='02';23. select ename,sysdate-hiredate 天数from emp;24.select ename from emp where instr(ename,'A',1)>0;25. select ename, to_char(hiredate,'yyyy/mm/dd') from emp;--26.列出至少有一个员工的所有部门.select dname from emp,dept where emp.deptno=dept.deptno group by dname;select distinct dname from emp,dept where emp.deptno=dept.deptno;--说明:(1)select中出现的字段一定要出现在group by中;-- (2)如果select中出现的字段不出现在group by中,则一定要出现在select的聚合函数中,对于想出现的字段,可用max()或min()。

oracle sql语句面试题

oracle sql语句面试题

oracle sql语句面试题在准备Oracle SQL面试时,对一些常见的SQL语句问题有所了解是非常重要的。

在面试过程中,考官可能会针对SQL的各个方面提问,包括查询、过滤、连接、排序等等。

下面是一些常见的Oracle SQL语句面试题,希望能帮您在面试中有所准备。

1. 简单查询1.1 请列出查找一个表中所有的行和列的SQL语句。

1.2 如何查找一个表中特定列的数据?1.3 如何查找满足一定条件的行?1.4 如何使用排序来对结果集排序?2. 连接查询2.1 如何进行简单的内连接查询?2.2 如何进行左连接和右连接查询?2.3 如何进行自连接查询?3. 分组和聚合函数3.1 如何使用GROUP BY子句进行列分组?3.2 如何使用聚合函数对分组结果进行计算?3.3 请列出一些常见的聚合函数有哪些?4. 子查询4.1 什么是子查询?如何使用子查询?4.2 如何在FROM子句中使用子查询?4.3 如何在WHERE子句中使用子查询?5. 表操作5.1 如何创建一个新表?5.2 如何向表中插入数据?5.3 如何更新表中的数据?5.4 如何删除表中的数据?6. 视图6.1 什么是视图?如何创建视图?6.2 如何在视图中使用聚合函数?6.3 如何在视图中更新数据?7. 索引7.1 什么是索引?如何创建索引?7.2 如何使用索引来加速查询?8. 事务控制8.1 什么是事务?如何控制事务?8.2 如何使用COMMIT和ROLLBACK控制事务?9. 数据库安全性9.1 如何创建和管理用户?9.2 如何为用户授予角色和权限?9.3 如何查看用户的权限?通过准备以上问题的答案,您将能够在Oracle SQL面试中更加自信。

请记住,除了对问题的准确回答外,还要注重语法的正确性和代码的整洁。

在面试中展示您的专业知识和技能将有助于提升您的竞争力。

祝您面试顺利!。

sql语句经典例题

sql语句经典例题

sql语句经典例题以下是几个经典的SQL语句示例,用于演示不同的查询和操作:1. 查询所有员工的信息:```sqlSELECT * FROM employees;```2. 查询特定员工的详细信息:```sqlSELECT * FROM employees WHERE employee_id = 1;```3. 查询员工的工资,按工资降序排列:```sqlSELECT employee_id, salary FROM employees ORDER BY salary DESC;```4. 查询工资高于平均工资的员工信息:```sqlSELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);```5. 插入一条新员工记录:```sqlINSERT INTO employees (employee_id, name, salary) VALUES (2, 'John Doe', 5000);```6. 更新特定员工的工资:```sqlUPDATE employees SET salary = 6000 WHERE employee_id = 1; ```7. 删除特定员工记录:```sqlDELETE FROM employees WHERE employee_id = 2;```8. 查询所有销售部门的员工信息:```sqlSELECT * FROM employees WHERE department = 'Sales';```9. 查询工资高于平均工资的销售部门员工信息:```sqlSELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees WHERE department = 'Sales');```以上就是关于sql语句经典例题的介绍,欢迎补充。

oracle实例练习

oracle实例练习

oracle实例练习1.用sys账户登录,解锁scott账户代码:Connect sys/orcl@orcl_client AS SYSDBAALTER USER "SCOTT" ACCOUNT UNLOCK2.以scott身份登录数据库conn scott/tiger@orcl3.创建学生表student(sno,sname,sgender,sbirthday,sadd) score(sno,math,english) 代码:create table student(sno char(3),sname varchar2(10),sgender char2(20),sbirthday date,sadd varchar2(50))create table score(sno char(3),math number(4,1),english number(4,1))4.插入记录student插入记录:001,小张,女,1980-8-20,济南002,小王,男,1983-4-1,莱芜003,小李,女,1980-5-20,济南004,小赵,女,1980-5-20,莱芜005, 小孔, 女, 1982-6-18 威海score插入记录:(005没参加考试,800是个进修生,不是学校的正式生)001,90,92002,85,79003,80,94004,78,77800 79, 88代码:alter session set nls_date_format ='YYYY-MM-DD HH24:MI:SS';insert into student values('001','小张','女',to_date('1980-08-20','yyyy-mm-dd'),'济南');insert into student values('002','小王','男',to_date('1983-04-01','yyyy-mm-dd'),'莱芜');insert into student values('003','小李','女',to_date('1980-05-20','yyyy-mm-dd'),'济南');insert into student values('004','小赵','女',to_date('1980-05-20','yyyy-mm-dd'),'莱芜');insert into student values('005','小孔','女',to_date('1982-06-18','yyyy-mm-dd'),'威海');insert into score values('001','90','92');insert into score values('002','85','79');insert into score values('003','80','94');insert into score values('004','78','77');insert into score values('800','79','88');5.a统计各个地区的学生数b计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字不要出现在报告单上,进修生的成绩也不在报告单上)报告单标题显示:学号姓名数学英语总成绩c计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字也要出现在报告单上,进修生的成绩不在报告单上)报告单标题显示:学号姓名数学英语总成绩代码:select sadd 地区,count(*) as 人数from student group by saddselect student.sno 学号, sname 姓名, math 数学, english 英语, (math+english) 总成绩from student inner join score on score where student.sno=score.sno order by 总成绩descselect student.sno 学号, sname 姓名, math 数学, english 英语, math+english 总成绩from student left outer join score onstudent.sno=score.sno order by 总成绩desc或select student.sno 学号, sname 姓名, math 数学,english 英语, (math+english) 总成绩from student,score where student.sno=score.sno(+) order by 总成绩desc;6.根据student表,创建一个新表student_copy(结构相同,数据只有济南的两个学生)从student表中查出莱芜得同学信息,插入到student_copy表中commit//提交刚才的插入代码:create table student_copy as select * from student Where sadd='济南';insert into student_copy(select * from student where sadd='莱芜');commit;7.插入一条新的学生纪录:006 小林男1979-7-9 泰安savepoint a //设置保存点a删除掉学号为003的学生纪录(误删)rollback to savepoint a察看结果commit(提交插入纪录的操作)/rollback(回滚到插入006记录前的数据状态)代码:insert into student values('006','小林','男',to_date('1979-07-09','yyyy-mm-dd'),'泰安');select * from student;savepoint a;delete from student where sno='003';rollback to savepoint a;select * from student;commit;/rollback;8.修改student_copy表名为student2删除表student2的数据(注意delete/truncate的区别)删除表student,score,student2代码:rename student_copy to student2;delete from student2;rollback;select * from student2;truncate table student2;rollback;select * from student2;drop table student;drop table score;drop table student2;9.创建100个表,table_0到table_99,分别插入数据,第1条数据插入到第1个表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle系列《一》:简单SQL与单行函数使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)dept部门表(deptno部门编号/dname部门名称/loc地点)工资=薪金+佣金登录Oracle数据库1、sqlplus scott/tiger2、sqlplus /nologSQL>conn scott/tiger若是使用SYS的账号进行登录的话,则使用以下语句SQL>conn / as sysdba【1】EMP表内容查询SQL> SELECT * FROM emp;出错,原因是没有找到该表,因为该表时SCOTT用户的表,所以查询时应该加上scott.emp就可以了【2】显示当前用户SQL> show user【3】查看当前用户的所有表SQL> SELECT * FROM tab;【4】若想重复执行上一条SQL语句,则在sqlplus命令行下输入"/"即可【5】查询一张表的结构,例如dept表SQL> desc dept【6】在雇员表中查询雇员的编号、姓名、工作SQL> SELECT empno,ename,job FROM emp;【7】可以为列名取别名,在Linux下Oracle如果英文别名不加上双引号则会变成大写SQL> SELECT empno 编号,ename 姓名,job 工作 FROM emp;【8】查询所有的工作SQL> SELECT DISTINCT job FROM emp;工作可能会重复,加上DISTINCT关键字 distinct【9】若要求按照以下的格式进行结果输出,如NO:7469,Name:SMITH,Job:CLERKSQL> SELECT 'NO:'||empno||',Name:'||ename||',Job:'||job FROM emp;【10】要求列出每个雇员的姓名及年薪SQL> SELECT ename,sal*12 income FROM emp;这里年薪最好用别名进行标识,可以一眼就能明白【11】查看每月可以得到奖金的雇员信息SQL> SELECT * FROM emp WHERE comm is NOT NULL;【12】要求基本工资大于1500,同时可以领取奖金的雇员信息SQL> SELECT * FROM emp WHERE sal>1500 AND comm is NOT NULL;如果是或的是关系,则使用 OR【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息SQL> SELECT * FROM emp WHERE NOT(sal>1500 AND comm is NOT NULL);【14】查询在1981年雇佣的全部雇员信息,BETWEEN .. AND 包含等于的情况SQL> SELECT * FROM empWHERE hiredate BETWEEN '01-JAN-81' AND '31-DEC-81';【15】Oracle对大小敏感,所以查询时名字要区分大小写【16】要求查询出雇员编号不是 7369、7499的雇员信息SQL> SELECT * FROM empWHERE empno NOT IN(7369,7499);【17】SQL中LIKE语句要注意通配符 % 和 _SQL> SELECT * FROM empWHERE hiredate LIKE '%81%';【18】查看雇员编号不是7369的雇员信息,使用<>或!=SQL> SELECT * FROM empWHERE empno<>7369;【19】要求对雇员的工资由低到高进行排序,升序为默认(ASC),降序(DESC)SQL> SELECT * FROM empORDER BY sal;【20】查看出部门号为10的雇员信息,查询的信息按照工资从高到低,若工资相等则按雇用日期从早到晚排列SQL> SELECT * FROM empWHERE deptno=10ORDER BY sal DESC,hiredate ASC;数据库系统中,每个数据库之间区别最大的就是在函数的支持上,单行函数是最简单的函数,单行函数分为1、字符函数:接受字符输入并且返回字符或数值2、数值函数:接受数值输入并返回数值3、日期函数:对日期型数据进行操作4、转换函数:将一种数据类型转换为另一种数据类型5、通用函数:NVL、DECODE 函数字符函数:【1】大小写转换 UPPER 和 LOWERSQL> SELECT UPPER('smith') FROM dual;【2】将雇员姓名变为开头字母大写,INITCAPSQL> SELECT INITCAP(ename) FROM emp;字符函数中有连接函数CONCAT,但不如 || 好用,还有字符串处理的一些函数字符串截取:substr()字符串长度:length()内容替换:replace()SQL> SELECTsubstr('hello',1,3),length('hello'),replace('hello','l',' x') FROM dual;这里注意的是Oracle中字符串截取从0和从1开始都是一样的,谨防面试提问【3】要求显示所有雇员的姓名及姓名的后3个字符SQL> SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;以上操作显得较为麻烦,substr()函数是可以倒着截取SQL> SELECT ename,SUBSTR(ename,-3,3) FROM emp;数值函数:1、四舍五入:ROUND()2、截断小数位:TRUNC()3、取余(取模):MODSQL> SELECT ROUND(789.536) FROM dual;【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了) SQL> SELECT ROUND(783.56,2) FROM dual;【2】使用MOD()函数进行取余操作SQL> SELECT MOD(10,3) FROM dual;日期函数:1、日期 - 数字 = 日期2、日期 + 数字 = 日期3、日期 - 日期 = 数字(天数)【1】求出当前日期SQL> SELECT SYSDATE FROM dual;Oracle提供了以下的日期函数支持:MONTHS_BETWEEN():求出给定日期范围的月数ADD_MONTHS():在指定日期上加上指定的月数,求出之后的日期NEXT_DAY():下一个的今天的日期LAST_DAY():求出给定日期的最后一天日期【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数SQL> SELECTempno,ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp;【3】验证 ADD_MONTHS()、NEXT_DAY()、LAST_DAY()SQL> SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL;SQL> SELECT NEXT_DAY(SYSDATE,'MON') FROM DUAL;SQL> SELECT LAST_DAY(SYSDATE) FROM DUAL;转换函数:1、TO_CHAR():将日期或数值转换成字符串2、TO_NUMBER():将字符串转换成数字3、TO_DATE():将字符串转换成日期【1】将年月日进行分开,要指定拆分的通配符,yyyy-mm-ddSQL> SELECT empno,ename,TO_CHAR(hiredate,'yyyy') datetime FROM emp;【2】将薪水的数字进行格式化,'$99,999'表示美元,'L99,999'表示当地货币SQL> SELECT empno,ename,TO_CHAR(sal,'99,999) salary FROM emp;【3】TO_NUMBER()验证SQL> SELECT TO_NUMBER('123')+TO_NUMBER('123') FROM DUAL;【4】TO_DATE()验证,如下例子执行后显示为 11-JUL-11SQL> SELECT TO_DATE('2011-7-11','yyyy-mm-dd') FROM DUAL;通用函数:【1】求出每个雇员的年薪(应算上奖金)SQL> SELECT empno,ename,(sal+comm)*12 FROM emp;由于comm中有NULL,NULL值计算后还是NULL,正确如下:SQL> SELECT empno,ename,NVL(comm,0),(sal+NVL(comm,0))*12 income FROM emp;NVL可以理解为将NULL值转换为具体的内容,这里是0【2】DECODE()函数,该函数类似于 IF ... ELSEIF...ELSE语法如下:DECODE(col/expression,选择1,结果1[,选择2,结果2,...,默认])验证DECODE()函数SQL> SELECT empno,ename,hiredate,DECODE(job,'CLERK','业务员','SALESMAN','销售人员',’MANAGER','经理','ANALYST','分析员','PRESIDENT','总裁') 职位FROM emp;SQL简单语句练习:【1】找出佣金高于薪金的60%的员工SQL> SELECT * FROM emp WHERE comm>sal*0.6【2】找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料SQL> SELECT * FROM empWHERE (deptno=20 AND job='MANAGER')OR (deptno=10 AND job='CLERK');【3】找出既不是经理又不是办事员但其薪金大于或等于2000的所有员工的资料SQL> SELECT * FROM empWHERE job NOT IN('MANAGER','CLERK') AND sal >= 2000;【4】找出有奖金的员工的不同国祚SQL> SELECT DISTINCT job FROM empWHERE comm IS NOT NULL;【5】找出各月倒数第3天受雇的所有员工SQL> SELECT * FROM empWHERE LAST_DAY(hiredate)-2=hiredate;【6】找出早于12年前受雇的员工SQL> SELECT * FROM empWHERE MONTHS_BETWEEN(sysdate,hiredate)/12 > 12;【7】显示刚好为5个字符的员工的姓名SQL> SELECT ename FROM empWHERE length(ename)=5;【8】显示不带有"R"的员工的姓名SQL> SELECT ename FROM empWHERE ename NOT LIKE '%R%';【9】显示员工的姓名和受雇日期,将最老的员工排在最前SQL> SELECT * FROM empOrder BY hiredate;【10】显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则按年份排序SQL> SELECT ename,TO_CHAR(hiredate,'yyyy')year,TO_CHAR(hiredate,'mm') month FROM empORDER BY month,year;【11】找出在2月受聘的员工SQL> SELECT * FROM empWHERE TO_CHAR(hiredate,'mm')=2;【12】以年月日方式显示所有员工服务年限SQL> SELECTename,TRUNC(MONTHS_BETWEEN(sysdate,hiredate)/12) year, TRUNC(MOD(MONTHS_BETWEEN(sysdate,hiredate),12)) month, TRUNC(MOD(sysdate-hiredate,30)) dayFROM emp;Oracle系列《二》:多表复杂查询和事务处理多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名【1】要求查询雇员的编号、姓名、部门编号、部门名称及部门位置SQL> SELECT e.empno,e.ename,d.deptno,d.dname,d.locFROM emp e,dept dWHERE e.deptno = d.deptno;【2】要求查询每个雇员的姓名、工作、雇员的直接上级领导的姓名(表自关联)SQL> SELECT e.ename,e.job,m.enameFROM emp e,emp mWHERE e.mgr = m.empno;【3】对【2】进行扩充,将雇员所在部门名称同时列出SQL> SELECT e.ename,e.job,m.ename,d.dnameFROM emp e,emp m,dept dWHERE e.mgr = m.empno AND e.deptno=d.deptno;【4】查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade),及其领导的姓名所在公司的等级<1>先确定工资等级表的内容SQL> SELECT * FROM salgrade;<2>查询每个雇员的姓名、工资、部门名称和工资在公司的等级SQL> SELECT e.ename,e.sal,d.dname,s.gradeFROM emp e,dept d,salgrade sWHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal ANDs.hisal;<3>查询其领导姓名及工资所在公司的等级SQL> SELECTe.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.gradeFROM emp e,dept d,salgrade s,emp m,salgrade msWHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisalAND e.mgr = m.empno AND m.sal BETWEEN ms.losal AND ms.hisal;【5】左连接与右连接的概念,"+"在等号左边表示右连接,反之,左连接查询雇员的编号、姓名及其领导的编号、姓名SQL> SELECT e.empno,e.ename,m.empno,m.enameFROM emp e,emp mWHERE e.mgr = m.empno(+);就发现将KING的那条记录也连过来了SQL1999语法中有如下几种连接(了解)1、交叉连接CROSS JOIN,产生笛卡尔积SQL> SELECT * FROM emp CROSS JOIN dept;2、自然连接NATURAL JOIN,自动进行关联字段的匹配SQL> SELECT * FROM emp NATURAL JOIN dept;3、使用USING子句,直接关联操作列SQL> SELECT * FROM emp JOIN dept USING(deptno)WHERE deptno=30;4、使用ON子句,用户自己编写的条件SQL> SELECT * FORM emp JOIN dept ON(emp.deptno = dept.deptno) WHERE deptno=30;5、左连接(左外连接、LEFT (OUTER) JOIN)、右连接(右外连接、RIGHT (OUTER) JOIN)组函数及分组统计1、COUNT():求出全部记录数2、MAX():求出一组中最大值3、MIN():求出最小值4、AVG():求出平均值5、SUM():求和【1】求出每个部门的雇员数量SQL> SELECT deptno,count(empno)FROM empGROUP BY deptno;【2】按部门分组,并显示部门的名称,及每个部门的员工数SQL> SELECT d.dname,COUNT(e.empno)FROM emp e,dept dWHERE e.deptno=d.deptnoGROUP BY d.dname;【3】要求显示平均工资大于2000的部门编号和平均工资SQL> SELECT deptno,AVG(sal)FROM empWHERE AVG(sal)>2000GROUP BY deptno;出错,WHERE子句中不能出现分组函数的条件,要使用HAVING子句上述语句应该改为如下SQL> SELECT deptno,AVG(sal)FROM empGROUP BY deptnoHAVING AVG(sal)>2000【4】显示非销售人员工作名称以及从事同一工作雇员的月工资总和,并且要求从事同一工作的雇员月工资合计大于$5000,输出结果按月工资的合计升序排序<1>按工作分组,求出非销售人员的月工资总和SQL> SELECT job,SUM(sal)FROM empWHERE job<>'SALESMAN'GROUP BY job;<2>对分组条件进行限制,然后进行排序,HAVING子句不能使用别名SQL> SELECT job,SUM(sal) totalSalFROM empWHERE job<>'SALESMAN'GROUP BY jobHAVING SUM(sal) > 5000ORDER BY totalSal;【3】分组函数可以嵌套使用,但是在SELECT列中就不能再出现该分组条件的列名了SQL> SELECT deptno,MAX(AVG(sal))FROM empGROUP BY deptno;出错!修改如下SQL> SELECT MAX(AVG(sal))FROM empGROUP BY deptno;【4】查询出比7654工资要高的全部雇员的信息<1>首先要查询雇员编号7654的工资SQL> SELECT sal FROM emp WHERE empno=7654;<2>以上述条件的结果最后后续查询的依据SQL> SELECT * FROM empWHERE sal>(SELECT sal FROM emp WHERE empno=7654);子查询在操作中分为以下三类:1、单列子查询:返回的结果是一列的内容2、单行子查询:返回多个列,也可能是一条记录3、多行子查询:返回多个记录【1】要求查询工资比7654高,同时与7788从事相同工作的全部雇员SQL> SELECT * FROM empWHERE sal>(SELECT sal FROM emp WHERE empno=7654)AND job=(SELECT job FROM emp WHERE empno=7788);【2】要求查询部门名称、部门员工数、部门平均工资,部门的最低收入雇员的姓名<1>查询部门员工数、部门平均工资SQL> SELECT deptno,COUNT(empno),AVG(sal)FROM empGROUP BY deptno;<2>查询部门的名称,及最低收入雇员姓名,要进行表关联(子查询)SQL> SELECT d.dname,ed.c,ed.a,e.enameFROM dept d,(SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) minFROM empGROUP BY deptno) ed, emp eWHERE d.deptno=ed.deptno AND e.sal = ed.min;若上述存在两个最低工资的情况,则会出错,在子查询中存在以下3种查询的操作符号IN:指定一个查询范围,例如查询每个部门的最低工资(返回值有多个)SQL> SELECT * FROM empWHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);ANY:=ANY(与IN操作一样)、>ANY(比最小大)、<ANY(比最大小)SQL> SELECT * FROM empWHERE sal <ANY(SELECT MIN(sal) FROM emp GROUP BY deptno); ALL: >ALL(比最大要大)、<ALL(比最小的小),SQL语句类似上面SQL多列子查询示例如下SQL> SELECT * FROM empWHERE (sal,NVL(comm,-1)) IN(SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20);数据库更新操作INSERT、UPDATE、DELETE【1】复制一张表,例如复制EMP表为MYEMPSQL> CREATE TABLE MYTEMP AS SELECT * FROM emp;【2】将编号为7899的雇员的领导取消SQL> UPDATE myemp SET mgr=null WHERE empno=7899;【3】更新时,一定要注意不能批量更新(加上WHERE子句),多列更新例子如下SQL> UPDATE myemp SET mgr=null,comm=null WHERE empnoIN(7369,8899);【4】删除掉全部领取奖金的雇员SQL> DELECT FROM emp WHERE comm is NOT NULL;事务处理 ACIDA:Atomicity 原子性:事务中的操作或者都完成,或者都取消C:Consistency 一致性:事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况I:Isolation 隔离性:当前的事务与其他未完成的事务是隔离的D:Durability 持久性:在COMMIT之后,数据永久保存在数据库中,在此之前,事务的操作都可以回滚验证事务过程:<1>创建一张临时表,只包含部门10SQL> CREATE TABLE emp10 AS SELECT * FROM emp WHERE empno=10;<2>删除emp10中的7782雇员SQL> DELETE FROM emp10 WHERE empno=7782;再打开另一个窗口,发现数据还存在,此时如果可以使用以下的两种命令进行事务处理COMMIT 和 ROLLBACK 提交事务和回滚事务SQL查询练习【1】列出至少一个员工的所有部门SQL> SELECT d.*,ed.cou FROM dept d,(SELECT deptno,COUNT(empno) cou FROM empGROUP BY deptnoHAVING COUNT(empno) > 1) edWHERE d.deptno=ed.deptno;【2】列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门SQL> SELECT d.deptno,d.dname,e.empno,e.enameFROM dept d,emp eWHERE d.deptno = e.deptno(+);【3】列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数<1>关联dept表SQL> SELECT e.ename,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptno and e.job='CLERK';<2>使用GROUP BY 完成部门分组人数SQL> SELECT e.ename,d.dname,ed.cou FROM emp e,dept d,(SELECT deptno,COUNT(empno) cou FROM empGROUP BY deptno) edWHERE job='CLERK' AND e.deptno=d.deptno ANDed.deptno=e.deptno;Oracle系列《三》:表、(约束)索引、序列、视图的使用一、创建、删除、修改表建立表:Oracle中主要数据类型 VARCHAR2、NUMBER、DATE、CLOB(大量文本)、BLOB(图片、音乐、电影)如果只能复制一张表的结构,但不复制内容,则加上一个不可能成立的条件即可,例如SQL> CREATE TABLE tmp AS (SELECT * FROM emp WHERE 1==2)例如创建表Person如下:CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(30),age NUMBER(3),birthday DATE,sex VARCHAR(2) DEFAULT 'M');如果发现创建表后需要添加特定的列,例如address列,则可以使用ALTER TABLE命令SQL> ALTER TABLE person ADD(address VARCHAR2(20));修改表中的列属性SQL> ALTER TABLE person MODIFY(address VARCHAR2(30));在数据库程序开发中,很少去修改表结构,在IBM DB2中就没有提供ALTER TABLE命令在Oracle中提供RENAME命令对表进行重命名SQL> RENAME person to personer;在Oracle中要清空一张表的数据,但又不需要回滚,需要立即释放资源(与DELETE区别)SQL> TRUNCATE TABLE personer;(与DROP TABLE区别:前者删除内容,后者删除表)二、表的约束约束分类:主键约束、唯一约束、检查约束、非空约束、外键约束添加约束如下:CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(30) NOT NULL,age NUMBER(3) CHECK(age BETWEEN 0 AND 150),birthday DATE,sex VARCHAR(2) DEFAULT 'M' ,CONSTRAINT person_pid_pk PRIMARY KEY(pid),CONSTRAINT person_name_uk UNIQUE(name),CONSTRAINT person_sex_ck CHECK(sex IN('M','F')));以上约束可以采取自动命名和手动命名现在要再添加一张表,使用主-外键约束CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR(20),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid));这时候如果要删除掉person表的话,就会出现错误,此时可以使用强制性的删除手段DROP TABLE person CASCADE CONSTRAINT;但是这种做法一般不用如果在person 和 book 表中添加记录,而在person表中进行删除一条记录时,假设该记录的pid被book表引用,那么会出现删除错误。

相关文档
最新文档