oracle数据库基本知识和操作-程序员宅基地

技术标签: 程序员  oracle  数据库  

FROM EMPLOYEES;

–从倒数第N位截取指定长度的字符串

SELECT SUBSTR(LAST_NAME,-3,2)

FROM EMPLOYEES;

- -INSTR():在第一个参数中查找第二个参数首次出现的位置,没找到返回0.

SELECT LAST_NAME,INSTR(LAST_NAME,‘a’)

FROM EMPLOYEES;

SELECT LAST_NAME

FROM EMPLOYEES

WHERE INSTR(LOWER(LAST_NAME),‘a’)>0;

–LPAD()/RPAD():显示第一个参数的值,并使用第二个参数指定第一个参数显示的长度,如果第一个参数长度不够,则使用第三个参数在第一个参数的左/右面补齐长度。

SELECT LPAD(EMPLOYEE_ID,6,0),LAST_NAME

FROM EMPLOYEES;

SELECT TRIM( ’ ABC ABC ') AS A–去掉字符串两端的空格

FROM DUAL;

SELECT TRIM(‘A’ FROM ‘AAABACAAA’)–去掉字符串两端指定的字符

FROM DUAL;

–查询employees表中所有员工的last_name,要求显示的last_name首字母为小写,其它均为大写。

SELECT LOWER(SUBSTR(LAST_NAME,1,1))||UPPER(SUBSTR(LAST_NAME,2))

FROM EMPLOYEES;

–数字单行函数

– ROUND():四舍五入

SELECT ROUND(2563.987),ROUND(2563.987,2),ROUND(2563.987,0),ROUND(2563.987,-1)

FROM DUAL;

- -TRUNC():截断数字

SELECT TRUNC(2563.987),TRUNC(2563.987,2),TRUNC(2563.987,0),TRUNC(2563.987,-1)

FROM DUAL;

- -MOD():取余数

SELECT MOD(15,2)

FROM DUAL;

–ABS():绝对值

SELECT ABS(-100)

FROM DUAL;

–日期单行函数

- -SYSDATE:获得数据库当前日期+时间

SELECT SYSDATE-100

FROM DUAL;

/*

1.日期+天数=日期

2.日期-天数=日期

3.日期-日期=天数

4.日期不能加日期

*/

–查询employees表中所有员工的last_name,hire_date,月数

SELECT LAST_NAME,HIRE_DATE,TRUNC((SYSDATE-HIRE_DATE)/30) AS 月数

FROM EMPLOYEES;

– MONTHS_BETWEEN():获得两个日期相差的月数

SELECT LAST_NAME,HIRE_DATE,TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)) AS 月数

FROM EMPLOYEES;

- -ADD_MONTHS():在指定的日期上加上指定的月数

SELECT ADD_MONTHS(SYSDATE,100)

FROM DUAL;

–NEXT_DAY():获得下一个星期N的日期 。

SELECT NEXT_DAY(SYSDATE,4)

FROM DUAL;

SELECT NEXT_DAY(SYSDATE,‘星期三’)

FROM DUAL;

–类型转换单行函数

–自动转换

SELECT LAST_NAME,SALARY

FROM EMPLOYEES

WHERE SALARY>‘10000’;

- -手动转换:TO_CHAR(),TO_DATE(),TO_NUMBER()

/*

1.字符串与日期可以相互转换

2.字符串与数字可以相互转换

3.日期与数字不能相互转换

*/

–TO_CHAR(N,F):将日期类型N根据模板F转换为字符串类型的值 。

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘YYYY-MM-DD’)

FROM EMPLOYEES;

SELECT TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI:SS DAY DY’)

FROM DUAL;

SELECT TO_CHAR(SYSDATE,‘D DD DDD’)

FROM DUAL;

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘FMYYYY"年"MM"月"DD"日"’)

FROM EMPLOYEES;

–查询employees表中所有星期一入职员工的last_name,hire_date(格式如:1999-1-1 星期一)

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘FMYYYY-MM-DD DAY’)

FROM EMPLOYEES

WHERE TO_CHAR(HIRE_DATE,‘DAY’)=‘星期一’;

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘FMYYYY-MM-DD DAY’)

FROM EMPLOYEES

WHERE TO_CHAR(HIRE_DATE,‘D’)=‘2’;

–TO_CHAR(N,F):将数据类型N根据模板F转换为字符串类型的值。

SELECT

TO_CHAR(256987.9654,‘FM$99,999,999.00’) AS A,

TO_CHAR(256987.9654,‘FML99,999,999.00’) AS A

FROM DUAL;

– RR:可自动补齐年的前2位

–T O_DATE(C,F):根据模板F将字符类型C转换为日期类型的值

SELECT TO_DATE(‘2017-1-27’,‘YYYY-MM-DD’)-SYSDATE

FROM DUAL;

SELECT TO_DATE(‘2017-1-27’,‘YYYY-MM-DD’)

FROM DUAL;

- -TO_NUMBER(C,F):根据模板F将字符类型C转换为数字类型的值。

SELECT TO_NUMBER(‘¥50,000.00’,‘L99,999.00’)

FROM DUAL;

–通用单行函数

–NVL():当第一个参数不为NULL,返回第一个参数。当第一个参数为NULL,返回第二个参数。两个参数的类型必须一致 。

SELECT LAST_NAME,NVL(TO_CHAR(COMMISSION_PCT,‘FM0.999’),‘没有佣金’)

FROM EMPLOYEES;

–关系数据库中,算术运算中出现NULL时,结果一定为NULL。

–查询employees表中所有员工的last_name,salary,commission_pct,年薪,年收入(年薪+年薪*佣金)

SELECT LAST_NAME,SALARY,COMMISSION_PCT,SALARY*12 AS 年薪,(SALARY*12)+(SALARY*12*NVL(COMMISSION_PCT,0)) AS 年收入

FROM EMPLOYEES;

–SQL Server中IFNULL()的功能与Oracle中的NVL()功能一致。

– 分支选择:case表达式,decode()

–CASE表达式:结果的类型必须保持一致 。

–查询employees表中所有员工的last_name,job_id,salary,新工资。如果job_id为it_prog时,工资增加10%。如果job_id为st_clerk时,工资增加15%。如果job_id为sa_rep时,工资增加20%,其它职位工资不变。

SELECT LAST_NAME,JOB_ID,SALARY,

CASE

WHEN JOB_ID=‘IT_PROG’ THEN TO_CHAR(SALARY*1.1,‘FM$999,999.00’)

WHEN JOB_ID=‘ST_CLERK’ THEN TO_CHAR(SALARY*1.15,‘FM$999,999.00’)

WHEN JOB_ID=‘SA_REP’ THEN TO_CHAR(SALARY*1.2,‘FM$999,999.00’)

ELSE ‘不在此次活动范围内’

END AS 新工资

FROM EMPLOYEES;

–只能判断是否相等

SELECT LAST_NAME,JOB_ID,SALARY,

CASE JOB_ID

WHEN ‘IT_PROG’ THEN TO_CHAR(SALARY*1.1,‘FM$999,999.00’)

WHEN ‘ST_CLERK’ THEN TO_CHAR(SALARY*1.15,‘FM$999,999.00’)

WHEN ‘SA_REP’ THEN TO_CHAR(SALARY*1.2,‘FM$999,999.00’)

ELSE ‘不在此次活动范围内’

END AS 新工资

FROM EMPLOYEES;

- -DECODE()函数:只能判断是否相等

SELECT LAST_NAME,JOB_ID,SALARY,

DECODE(

JOB_ID,

‘IT_PROG’,SALARY*1.1,

‘ST_CLERK’,SALARY*1.15,

‘SA_REP’,SALARY*1.2,

SALARY

)AS 新工资

FROM EMPLOYEES;

–2016-11-15

–查询employees表中所有5月入职的员工的last_name,hire_date(格式如:1999-5-1)

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘FMYYYY-MM-DD’)

FROM EMPLOYEES

WHERE TO_CHAR(HIRE_DATE,‘MM’)=‘05’;

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘FMYYYY-MM-DD’)

FROM EMPLOYEES

WHERE TO_CHAR(HIRE_DATE,‘MON’)='5月 ';

–表

/*

CREATE TABLE 表名(

列名 数据类型[(长度)] [约束],

列名 数据类型[(长度)] [约束],

……

列名 数据类型[(长度)] [约束]

);

*/

–常用的数据类型

/*

一、数字类型:NUMBER

1.整数:NUMBER(5),长度可以省略,省略时默认为38位的数字。

2.浮点数:NUMBER(8,2),长度不能省略,整个数字为8位,其中有两位小数。

二、字符类型:不能省略长度。默认单位为字节。

1.CHAR:保存固定长度的字符串,如果内容的长度不足,使用空格在内容的后面补齐长度。

2.VARCHAR2:保存可变长度的字符串(不能超过上限),不会使用空格补齐长度。

三、日期类型:不能指定长度。

DATE:日期+时间

*/

CREATE TABLE TEST(

T_ID NUMBER(5),

T_NAME VARCHAR2(20 CHAR),

T_SEX CHAR(1 CHAR),

T_BIRTHDAY DATE

);

–查看表结构:DESC 表名/视图名

–数据操作

/*

一、添加数据:INSERT INTO语句;

1.向表中添加一行新数据,并向新行中所有的列赋值。

格式:INSERT INTO 表名 VALUES(值,值,……);

例:

INSERT INTO TEST VALUES(1,‘AA’,‘男’,TO_DATE(‘1989-10-20’,‘YYYY-MM-DD’));

2.向表中添加一行新数据,并向新行中指定的列赋值。

格式:INSERT INTO 表名(列名,列名,……) VALUES(值,值,……);

例:

INSERT INTO TEST(T_ID,T_NAME) VALUES(2,‘BB’);

3.将其它表中的数据复制到指定的表中。

格式:INSERT INTO 表名[(列名,列名,……)] SELECT语句;

例:

INSERT INTO TEST(T_ID,T_NAME,T_BIRTHDAY) SELECT EMPLOYEE_ID,LAST_NAME,HIRE_DATE FROM EMPLOYEES;

二、修改数据:UPDATE语句;

格式:UPDATE 表名 SET 列名=值[,列名=值,……] [WHERE 条件];

例:

UPDATE TEST SET T_BIRTHDAY=SYSDATE WHERE T_BIRTHDAY IS NULL;

UPDATE TEST SET T_NAME=‘张三’,T_SEX=‘女’ WHERE T_ID=1;

三、删除数据:DELETE语句;

格式:DELETE [FROM] 表名 [WHERE 条件];

例:

DELETE FROM TEST WHERE T_ID>=200;

–删除TEST表T_NAME列中所有的数据。

UPDATE TEST SET T_NAME=NULL;

*/

– 事务:单位时间内的一系列操作,这些操作要么全部成功,要么全部失败。

–提交事务:COMMIT。将对表中数据的操作保存到表中。

–回退事务:ROLLBACK。将数据还原为最初或最后一次提交的状态。

/*

SQL语句的分类:

DML(数据操作语句):SELECT,INSERT,UPDATE,DELETE

DDL(数据定义语句):CREATE,DROP,ALTER等

DCL(数据控制语句):COMMIT,ROLLBACK,SAVEPOINT等

*/

/*

1.当出现一个DDL语句时,数据库会自动提交事务。

2.当正常退出Oracle时,Oracle会自动提交事务。

3.当异常退出Oracle时,Oracle会自动回退事务。

*/

–约束:

1 .主键约束:PRIMARY KEY,不能为NULL,不能重复。 通过主键可以在表中查询出唯一的一行数据。

2.非空约束:NOT NULL,不能为空。

3.检查约束:CHECK,添加或修改列中的数据时,检查数据是否合法。

4.默认值:DEFAULT,当没有向列中添加数据时,Oracle自动为列添加的数据。

5.唯一约束:UNIQUE,可以为NULL,不能重复。

6.外键约束:FOREIGN KEY。

- -删除表:DROP TABLE 表名;删除表同时删除表中所有的数据,删除的数据不能回退 。

DROP TABLE STUDENTS;

CREATE TABLE STUDENTS(

STU_ID NUMBER(5) PRIMARY KEY,

STU_NAME VARCHAR2(10 CHAR) NOT NULL,

STU_SEX CHAR(1 CHAR) CHECK(STU_SEX IN(‘男’,‘女’)),

STU_DATE DATE DEFAULT SYSDATE

);

INSERT INTO STUDENTS VALUES(1,‘AA’,‘女’,NULL);

INSERT INTO STUDENTS(STU_ID,STU_NAME,STU_SEX) VALUES(2,‘BB’,‘男’);

–数据库中不能存在同名的对象

CREATE TABLE S(

S_ID NUMBER(6) PRIMARY KEY,

S_NAME VARCHAR2(20 CHAR)

);

CREATE TABLE C(

C_ID NUMBER(3) PRIMARY KEY,

C_NAME VARCHAR2(100 CHAR)

);

CREATE TABLE SC(

SC_ID NUMBER(8) PRIMARY KEY,

SC_S_ID NUMBER(6) NOT NULL,

SC_C_ID NUMBER(3) NOT NULL,

CONSTRAINT SC_SID_FK FOREIGN KEY(SC_S_ID) REFERENCES S(S_ID),

CONSTRAINT SC_CID_FK FOREIGN KEY(SC_C_ID) REFERENCES C(C_ID)

);

– 添加数据:先添加主表数据,再添加子表数据。

–删除数据:先删除子表数据,再删除主表数据。

–视图

/*

CREATE [OR REPLACE] VIEW 视图名

AS

SELECT语句;

CREATE OR REPLACE VIEW V1

AS

SELECT LAST_NAME,JOB_ID,SALARY,

CASE

WHEN JOB_ID=‘IT_PROG’ THEN TO_CHAR(SALARY*1.1,‘FM$999,999.00’)

WHEN JOB_ID=‘ST_CLERK’ THEN TO_CHAR(SALARY*1.15,‘FM$999,999.00’)

WHEN JOB_ID=‘SA_REP’ THEN TO_CHAR(SALARY*1.2,‘FM$999,999.00’)

ELSE ‘不在此次活动范围内’

END AS 新工资

FROM EMPLOYEES;

SELECT *

FROM V1;

视图的作用:

1.简化查询。

2.提高数据库的安全性。

–视图中没有数据,视图的数据来自于表。

*/

–截断表:TRUNCATE TABLE 表名;删除表中所有的数据,但不删除表结构。删除的数据不能ROLLBACK。

–序列:产生一个数字。通常用于自动生成主键。

/*

创建序列的格式:

CREATE SEQUENCE 序列名

[INCREMENT BY n] --每次序列的值时,序列的值加N/减N,默认为1

[START WITH n] --起始值,默认为0

[{MAXVALUE n | NOMAXVALUE}] --最大值为N/没有最大值(默认)

[{MINVALUE n | NOMINVALUE}] --最小值为N/没有最小值

[{CYCLE | NOCYCLE}] --循环/不循环(默认)

[{CACHE n | NOCACHE}] --当数据库启动时将序列的后N个值存入缓存中(默认)/当数据库启动时不将序列的值存入缓存中;

*/

CREATE SEQUENCE TEST_ID_SEQ;

–序列的值不能ROLLBACK;

– 序列属性:

1.NEXTVAL:获得序列的下一个值。每次调用此属性一定改变序列的值。

2.CURRVAL:获得序列当前的值。调用此属性不会改变序列的值。

INSERT INTO TEST(T_ID,T_NAME) VALUES(TEST_ID_SEQ.NEXTVAL,‘AA’);

SELECT TEST_ID_SEQ.CURRVAL

FROM DUAL;

–2016-11-16

–查询出employees表中所有员工的last_name,hire_date(格式:YYYY-MM-DD),salary(格式:FM$99,999.00),工龄(只保留整数),奖金。奖金的计算方式如下:工龄大于15年,奖金为5倍工资。工龄大于20年,奖金为10倍工资,工龄大于25年,奖金为20倍工资。如果工龄没超过15年,则显示“没有奖金”,查询结果根据工龄降序排序。

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘YYYY-MM-DD’) AS 入职时间,TO_CHAR(SALARY,‘FM$99,999.00’) AS 工资,TRUNC(MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12) AS 工龄,

CASE

WHEN MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12 > 25 THEN TO_CHAR(SALARY*20,‘FM$99,999,999.00’)

WHEN MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12 > 20 THEN TO_CHAR(SALARY*10,‘FM$99,999,999.00’)

WHEN MONTHS_BETWEEN(SYSDATE,HIRE_DATE)/12 > 15 THEN TO_CHAR(SALARY*5,‘FM$99,999,999.00’)

ELSE ‘没有奖金’

END AS 奖金

FROM EMPLOYEES;

–查询employees表中所有员工的last_name,hire_date(格式:YYYY-MM-DD),入职时间的星期

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘YYYY-MM-DD’) AS 入职时间,TO_CHAR(HIRE_DATE,‘DAY’) AS 星期

FROM EMPLOYEES

ORDER BY TO_CHAR(HIRE_DATE-1,‘D’) ASC;

–多表连接

–笛卡尔积

–原因:没有连接条件或连接条件不正确。

–行数:多张表行数据的乘积。

–多表连接时,建议在每个列的前面都添加表名的前缀,可以提高查询的效率。

–等值连接(内连接):只能查询出满足连接条件的数据。

–查询员工的last_name,department_id,department_name

SELECT E.LAST_NAME,E.DEPARTMENT_ID,D.DEPARTMENT_NAME

FROM EMPLOYEES E,DEPARTMENTS D

WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID;

–查询员工的last_name,job_id,job_title(在JOBS表中)

SELECT E.LAST_NAME,E.JOB_ID,J.JOB_TITLE

FROM EMPLOYEES E,JOBS J

WHERE E.JOB_ID=J.JOB_ID;

–通常情况下,连接条件的个数是表为个数减一。

–查询员工的last_name,department_name,city

SELECT E.LAST_NAME,D.DEPARTMENT_NAME,L.CITY

FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L

WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID

AND D.LOCATION_ID=L.LOCATION_ID;

–查询在城市’Toronto’工作的员工的last_name,department_id,department_name,job_title

SELECT E.LAST_NAME,E.DEPARTMENT_ID,D.DEPARTMENT_NAME,J.JOB_TITLE

FROM EMPLOYEES E,DEPARTMENTS D,JOBS J,LOCATIONS L

WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID

AND E.JOB_ID=J.JOB_ID

AND D.LOCATION_ID=L.LOCATION_ID

AND L.CITY=‘Toronto’;

–非等值连接

–查询员工的last_name,salary,grade_level

SELECT E.LAST_NAME,E.SALARY,J.GRADE_LEVEL

FROM EMPLOYEES E,JOB_GRADES J

WHERE E.SALARY BETWEEN J.LOWEST_SAL AND J.HIGHEST_SAL;

–SQL:99

–查询员工的last_name,department_name

SELECT E.LAST_NAME,E.DEPARTMENT_ID,D.DEPARTMENT_NAME

FROM EMPLOYEES E INNER JOIN DEPARTMENTS D

ON E.DEPARTMENT_ID=D.DEPARTMENT_ID;

–查询员工的last_name,department_name,job_title,city

SELECT E.LAST_NAME,D.DEPARTMENT_NAME,J.JOB_TITLE,L.CITY

FROM EMPLOYEES E JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

JOIN LOCATIONS L ON L.LOCATION_ID=D.LOCATION_ID

JOIN JOBS J ON J.JOB_ID=E.JOB_ID;

- -外连接:可以查询出满足连接条件与不满足连接条件的数据

–左外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D

ON E.DEPARTMENT_ID=D.DEPARTMENT_ID;

–右外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E RIGHT OUTER JOIN DEPARTMENTS D

ON E.DEPARTMENT_ID=D.DEPARTMENT_ID;

–全外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E FULL OUTER JOIN DEPARTMENTS D

ON E.DEPARTMENT_ID=D.DEPARTMENT_ID;

–Oracle中特有的外连接语法:(+)

–左外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E,DEPARTMENTS D

WHERE E.DEPARTMENT_ID=D.DEPARTMENT_ID(+);

–右外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E,DEPARTMENTS D

WHERE E.DEPARTMENT_ID(+)=D.DEPARTMENT_ID;

–SQL Server中特有的外连接语法:*

–左外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E,DEPARTMENTS D

WHERE E.DEPARTMENT_ID*=D.DEPARTMENT_ID;

–右外连接

SELECT E.LAST_NAME,D.DEPARTMENT_NAME

FROM EMPLOYEES E,DEPARTMENTS D

WHERE E.DEPARTMENT_ID=*D.DEPARTMENT_ID;

- -组函数(聚合函数 )

–常用的组函数

–SUM():求总和

SELECT SUM(SALARY)

FROM EMPLOYEES;

–AVG():求平均值

SELECT AVG(SALARY)

FROM EMPLOYEES;

–MAX()/MIN():最大/最小值

SELECT MAX(SALARY),MIN(SALARY)

FROM EMPLOYEES

SELECT MAX(HIRE_DATE),MIN(HIRE_DATE)

FROM EMPLOYEES;

SELECT MAX(LAST_NAME),MIN(LAST_NAME)

FROM EMPLOYEES;

–COUNT()

SELECT COUNT(COMMISSION_PCT)–查询指定列中不为NULL的值

FROM EMPLOYEES;

SELECT COUNT(*)–获得查询结果的行数

FROM EMPLOYEES;

–查询50号部门的人数

SELECT COUNT(*)

FROM EMPLOYEES

WHERE DEPARTMENT_ID=50;

–组函数与DISTINCT

SELECT COUNT(JOB_ID),COUNT(DISTINCT JOB_ID),COUNT(DISTINCT DEPARTMENT_ID)

FROM EMPLOYEES;

–组函数与NULL:所有的组函数在运算时会自动忽略NULL.

SELECT AVG(NVL(COMMISSION_PCT,0))

FROM EMPLOYEES;

–2016-11-17

–GROUP BY子句:分组,统计,报表

SELECT 4

FROM 1

[WHERE] 2

[GROUP BY] 3

[ORDER BY] 5

–统计每个部门的人数,显示:department_id,人数,结果根据部门编号升序排序。

SELECT DEPARTMENT_ID,COUNT(*)

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID

ORDER BY DEPARTMENT_ID ASC;

–统计每个职位的平均工资,显示:job_id,平均工资

SELECT JOB_ID,AVG(SALARY)

FROM EMPLOYEES

GROUP BY JOB_ID;

– 当使用GROUP BY子句时,SELECT子句中出现的非组函数的列必须出现在GROUP BY子句中参加分组。

–统计每个部门的最高工资与最低工资,显示:department_name,最高工资,最低工资,人数,结果根据department_name升序排序。

SELECT D.DEPARTMENT_NAME,MAX(NVL(E.SALARY,0)),NVL(MIN(E.SALARY),0),COUNT(E.EMPLOYEE_ID)

FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

GROUP BY D.DEPARTMENT_NAME

ORDER BY D.DEPARTMENT_NAME ASC;

– GROUP BY子句中分组的列,可以不在SELECT子句中出现 。

SELECT DEPARTMENT_ID

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID;

–查询每个部门中每个职位的平均工资与人数,显示:department_name,job_title,平均工资,人数

SELECT D.DEPARTMENT_NAME,J.JOB_TITLE,AVG(E.SALARY),COUNT(*)

FROM EMPLOYEES E JOIN DEPARTMENTS D ON E.DEPARTMENT_ID=D.DEPARTMENT_ID

JOIN JOBS J ON E.JOB_ID=J.JOB_ID

GROUP BY D.DEPARTMENT_NAME,J.JOB_TITLE

ORDER BY 1 ASC;

– HAVING子句:过滤分组的结果,使用HAVING子句时必须使用GROUP BY子句。

SELECT 5

FROM 1

[WHERE] 2

[GROUP BY] 3

[HAVING] 4

[ORDER BY] 6

– WHERE子句中不能使用组函数作为过滤的条件

–HAVING子句中可以使用组函数作为过滤条件

–查询平均工资大于10000的职位与平均工资,显示:job_id,平均工资

SELECT JOB_ID,AVG(SALARY)

FROM EMPLOYEES

GROUP BY JOB_ID

HAVING AVG(SALARY)>10000

ORDER BY AVG(SALARY) DESC;

SELECT DISTINCT LAST_NAME

FROM EMPLOYEES

ORDER BY SALARY DESC;

– 当使用DISTINCT与GROUP BY子句时,ORDER BY子句中排序的列必须在SELECT子句中出现。

–查询人数在3人或3人以上的部门与人数,显示:department_id与人数,结果根据人数降序排序。

SELECT DEPARTMENT_ID,COUNT(*)

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID

HAVING COUNT(*)>=3

ORDER BY COUNT(*) DESC;

- -尽量将过滤条件放在WHERE子句中,可以提高查询效率。

–查询最低工资大于6000,并且job_id不包含’REP’的job_id与最低工资。

SELECT JOB_ID,MIN(SALARY)

FROM EMPLOYEES

WHERE JOB_ID NOT LIKE ‘%REP%’

GROUP BY JOB_ID

HAVING MIN(SALARY)>6000;

–组函数嵌套

–查询平均工资最高的部门的平均工资

SELECT MAX(AVG(SALARY)),MIN(AVG(SALARY)),COUNT(*)

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID;

/*

1.组函数嵌套时必须使用GROUP BY子句。

2.组函数嵌套时,SELECT子句中只能出现组函数嵌套的列(COUNT()除外)

3.组函数嵌套只能直接出现在SELECT子句中。

*/

–统计出每年入职的人数,显示:年,人数,结果根据年升序排序。

SELECT TO_CHAR(HIRE_DATE,‘YYYY’) AS 年,COUNT(*)

FROM EMPLOYEES

GROUP BY TO_CHAR(HIRE_DATE,‘YYYY’)

ORDER BY 年 ASC;

–子查询(嵌套查询)

–查询employees表中收入比176号员工高的员工的employee_id,last_name,salary

SELECT EMPLOYEE_ID,LAST_NAME,SALARY

FROM EMPLOYEES

WHERE SALARY>(SELECT SALARY

FROM EMPLOYEES

WHERE EMPLOYEE_ID=176);

/*

1.从Oracle8开始,除了GROUP BY子句外,其它子句都可以使用子查询。

2.无论子查询出现在哪个子句中, 子查询必须放在一对小括号内 。

3.如果子查询作为条件,建议将子查询放在运算符的右面,可以提高查询的效率。

4.如果子查询作为条件,子查询中列的个数与 类型 必须与主查询中条件列的个数与类型保持 一致 。

5.除非作TOP N的操作,否则 不能在子查询中作用ORDER BY子句 (仅限于Oracle)。

*/

– 普通子查询:先执行子查询,再执行主查询。

–查询employees表中在Fay员工之后入职的员工,显示:last_name,hire_date(格式为:YYYY-MM-DD)

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘YYYY-MM-DD’)

FROM EMPLOYEES

WHERE HIRE_DATE>(SELECT HIRE_DATE

FROM EMPLOYEES

WHERE LAST_NAME=‘Fay’);

–子查询与组函数

–查询哪些员工的工资大于公司的平均工资,显示:last_name,salary

SELECT LAST_NAME,SALARY

FROM EMPLOYEES

WHERE SALARY>(SELECT AVG(SALARY)

FROM EMPLOYEES);

–查询公司最早入职的员工的last_name,hire_date

SELECT LAST_NAME,HIRE_DATE

FROM EMPLOYEES

WHERE HIRE_DATE = (SELECT MIN(HIRE_DATE)

FROM EMPLOYEES);

–查询与入职最早的员工在同一部门工作的员工,显示:last_name,job_id,department_id

SELECT LAST_NAME,JOB_ID,DEPARTMENT_ID

FROM EMPLOYEES

WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID

FROM EMPLOYEES

WHERE HIRE_DATE=(SELECT MIN(HIRE_DATE)

FROM EMPLOYEES));

–HAVING子句与子查询

–查询哪些部门的平均工资大于公司的平均工资,显示:department_id,平均工资,结果根据department_id升序排序

SELECT DEPARTMENT_ID,AVG(SALARY)

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID

HAVING AVG(SALARY)>(SELECT AVG(SALARY)

FROM EMPLOYEES)

ORDER BY 1 ASC;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
行主查询。

–查询employees表中在Fay员工之后入职的员工,显示:last_name,hire_date(格式为:YYYY-MM-DD)

SELECT LAST_NAME,TO_CHAR(HIRE_DATE,‘YYYY-MM-DD’)

FROM EMPLOYEES

WHERE HIRE_DATE>(SELECT HIRE_DATE

FROM EMPLOYEES

WHERE LAST_NAME=‘Fay’);

–子查询与组函数

–查询哪些员工的工资大于公司的平均工资,显示:last_name,salary

SELECT LAST_NAME,SALARY

FROM EMPLOYEES

WHERE SALARY>(SELECT AVG(SALARY)

FROM EMPLOYEES);

–查询公司最早入职的员工的last_name,hire_date

SELECT LAST_NAME,HIRE_DATE

FROM EMPLOYEES

WHERE HIRE_DATE = (SELECT MIN(HIRE_DATE)

FROM EMPLOYEES);

–查询与入职最早的员工在同一部门工作的员工,显示:last_name,job_id,department_id

SELECT LAST_NAME,JOB_ID,DEPARTMENT_ID

FROM EMPLOYEES

WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID

FROM EMPLOYEES

WHERE HIRE_DATE=(SELECT MIN(HIRE_DATE)

FROM EMPLOYEES));

–HAVING子句与子查询

–查询哪些部门的平均工资大于公司的平均工资,显示:department_id,平均工资,结果根据department_id升序排序

SELECT DEPARTMENT_ID,AVG(SALARY)

FROM EMPLOYEES

GROUP BY DEPARTMENT_ID

HAVING AVG(SALARY)>(SELECT AVG(SALARY)

FROM EMPLOYEES)

ORDER BY 1 ASC;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-KLxl9vbB-1713347395992)]

[外链图片转存中…(img-pmUsjXXW-1713347395993)]

[外链图片转存中…(img-fgPZoFIc-1713347395993)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

[外链图片转存中…(img-7kHdz8mS-1713347395993)]

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-gjC7TIHg-1713347395994)]

[外链图片转存中…(img-7pPyQ8vy-1713347395994)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84009317/article/details/137882429

智能推荐

软件测试流程包括哪些内容?测试方法有哪些?_测试过程管理中包含哪些过程-程序员宅基地

文章浏览阅读2.9k次,点赞8次,收藏14次。测试主要做什么?这完全都体现在测试流程中,同时测试流程是面试问题中出现频率最高的,这不仅是因为测试流程很重要,而是在面试过程中这短短的半小时到一个小时的时间,通过测试流程就可以判断出应聘者是否合适,故在测试流程中包含了测试工作的核心内容,例如需求分析,测试用例的设计,测试执行,缺陷等重要的过程。..._测试过程管理中包含哪些过程

政府数字化政务的人工智能与机器学习应用:如何提高政府工作效率-程序员宅基地

文章浏览阅读870次,点赞16次,收藏19次。1.背景介绍政府数字化政务是指政府利用数字技术、互联网、大数据、人工智能等新技术手段,对政府政务进行数字化改革,提高政府工作效率,提升政府服务质量的过程。随着人工智能(AI)和机器学习(ML)技术的快速发展,政府数字化政务中的人工智能与机器学习应用也逐渐成为政府改革的重要内容。政府数字化政务的人工智能与机器学习应用涉及多个领域,包括政策决策、政府服务、公共安全、社会治理等。在这些领域,人工...

ssm+mysql+微信小程序考研刷题平台_mysql刷题软件-程序员宅基地

文章浏览阅读219次,点赞2次,收藏4次。系统主要的用户为用户、管理员,他们的具体权限如下:用户:用户登录后可以对管理员上传的学习视频进行学习。用户可以选择题型进行练习。用户选择小程序提供的考研科目进行相关训练。用户可以进行水平测试,并且查看相关成绩用户可以进行错题集的整理管理员:管理员登录后可管理个人基本信息管理员登录后可管理个人基本信息管理员可以上传、发布考研的相关例题及其分析,并对题型进行管理管理员可以进行查看、搜索考研题目及错题情况。_mysql刷题软件

根据java代码描绘uml类图_Myeclipse8.5下JAVA代码导成UML类图-程序员宅基地

文章浏览阅读1.4k次。myelipse里有UML1和UML2两种方式,UML2功能更强大,但是两者生成过程差别不大1.建立Test工程,如下图,uml包存放uml类图package com.zz.domain;public class User {private int id;private String name;public int getId() {return id;}public void setId(int..._根据以下java代码画出类图

Flume自定义拦截器-程序员宅基地

文章浏览阅读174次。需求:一个topic包含很多个表信息,需要自动根据json字符串中的字段来写入到hive不同的表对应的路径中。发送到Kafka中的数据原本最外层原本没有pkDay和project,只有data和name。因为担心data里面会空值,所以根同事商量,让他们在最外层添加了project和pkDay字段。pkDay字段用于表的自动分区,proejct和name合起来用于自动拼接hive表的名称为 ..._flume拦截器自定义开发 kafka

java同时输入不同类型数据,Java Spring中同时访问多种不同数据库-程序员宅基地

文章浏览阅读380次。原标题:Java Spring中同时访问多种不同数据库 多样的工作要求,可以使用不同的工作方法,只要能获得结果,就不会徒劳。开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文以在Spring框架下开发一个Sp..._根据输入的不同连接不同的数据库

随便推点

EFT试验复位案例分析_eft电路图-程序员宅基地

文章浏览阅读3.6k次,点赞9次,收藏25次。本案例描述了晶振屏蔽以及开关电源变压器屏蔽对系统稳定工作的影响, 硬件设计时应考虑。_eft电路图

MR21更改价格_mr21 对于物料 zba89121 存在一个当前或未来标准价格-程序员宅基地

文章浏览阅读1.1k次。对于物料价格的更改,可以采取不同的手段:首先,我们来介绍MR21的方式。 需要说明的是,如果要对某一产品进行价格修改,必须满足的前提条件是: ■ 1、必须对价格生效的物料期间与对应会计期间进行开启; ■ 2、该产品在该物料期间未发生物料移动。执行MR21,例如更改物料1180051689的价格为20000元,系统提示“对于物料1180051689 存在一个当前或未来标准价格”,这是因为已经对该..._mr21 对于物料 zba89121 存在一个当前或未来标准价格

联想启天m420刷bios_联想启天M420台式机怎么装win7系统(完美解决usb)-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏13次。[文章导读]联想启天M420是一款商用台式电脑,预装的是win10系统,用户还是喜欢win7系统,该台式机采用的intel 8代i5 8500CPU,在安装安装win7时有很多问题,在安装win7时要在BIOS中“关闭安全启动”和“开启兼容模式”,并且安装过程中usb不能使用,要采用联想win7新机型安装,且默认采用的uefi+gpt模式,要改成legacy+mbr引导,那么联想启天M420台式电..._启天m420刷bios

冗余数据一致性,到底如何保证?-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏9次。一,为什么要冗余数据互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。水平切分会有一个patition key,通过patition key的查询能..._保证冗余性

java 打包插件-程序员宅基地

文章浏览阅读88次。是时候闭环Java应用了 原创 2016-08-16 张开涛 你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题:1、程序代码和依赖都是人工上传到服务器,不是通过工具进行部署和发布;2、目录结构没有规范,jar启动时通过-classpath任意指定;3、fat jar,把程序代码、配置文件和依赖jar都打包到一个jar中,改配置..._那么需要把上面的defaultjavatyperesolver类打包到插件中

VS2015,Microsoft Visual Studio 2005,SourceInsight4.0使用经验,Visual AssistX番茄助手的安装与基本使用9_番茄助手颜色-程序员宅基地

文章浏览阅读909次。1.得下载一个番茄插件,按alt+g才可以有函数跳转功能。2.不安装番茄插件,按F12也可以有跳转功能。3.进公司的VS工程是D:\sync\build\win路径,.sln才是打开工程的方式,一个是VS2005打开的,一个是VS2013打开的。4.公司库里的线程接口,在CmThreadManager.h 里,这个里面是我们的线程库,可以直接拿来用。CreateUserTaskThre..._番茄助手颜色

推荐文章

热门文章

相关标签