可读性较差,为此可以为这样的字段添加别名,那么结果集会以这个别名作为该字段的名字
SELECT ename,sal*12 AS 年薪 FROM emp
别名本身不区分大小写,而且不能含有空格。若希望别名区分大小写或含有空格,那么
可以在别名上使用双引号括起来
SELECT ename,sal*12 "s al" FROM emp
SELECT * FROM emp WHERE deptno=10
SELECT * FROM emp WHERE job = 'SALESMAN'
查询条件,使用>,<,>=,<=,!=(<>,推荐用这个),=
SELECT * FROM emp
SELECT * FROM emp WHERE sal>1000 AND JOB='CLERK'
SELECT * FROM emp WHERE sal>1000 OR job='CLERK'
SELECT ename,sal,job FROM emp WHERE sal>1000 AND (job='SALESMAN' or JOB='CLERK')
AND的优先级高于OR,可以用括号来提高OR的优先级
LIKE用于模糊匹配字符串,支持两个通配符:
_:单一的一个字符
%:任意个字符
SELECT ename,sal FROM emp WHERE ename LIKE '_A%'
SELECT ename,sal FROM emp WHERE ename LIKE '_A%N'
IN和NOT IN
判断是否在列表中或者不在列表中
SELECT * FROM emp
SELECT * FROM emp WHERE job in('CLERK','SALESMAN')
SELECT * FROM emp WHERE deptno NOT IN(10,20)
IN 和NOT IN常用来判断子查询的结果
BETWEEN ...AND...
判断在一格区间范围内,数字或者日期
工资在1500-3000之间的员工
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000
IS NULL和IS NOT NULL
判断一个值是否为空
SELECT * FROM emp WHERE comm IS NULL
ANY 和 ALL
ANY和ALL配合>,>=,<,<=一个列表使用的。
>ANY(list):大于列表中最小的即可
>ALL(list):大于列表中最大的
<ANY(list):小于列表中最大的
<ALL(list):小于列表中最小的
ANY和ALL常用语子查询
SELECT * FROM emp WHERE sal>ANY(2500,4000,4500)
DISTINCT关键字
对结果集中指定字段值重复的记录进行去重
多字段去重,是对这些字段值的组合进行去重
查看公司中有哪些职位
SELECT DISTINCT job,ename FROM emp distinct
排序
ORDER BY子句
ORDER BY可以根据其后指定的字段对结果集按照该字段的值进行升序或者降序排列
ASC:升序,不写默认就是升序
DESC:降序。
SELECT ename,sal,job FROM emp ORDER BY sal DESC
ORDER BY按照多个字段排序
ORDER BY首先按照第一个字段的排序方式对结果进行排序,当第一个字段有重复值时
才会按照第二个字段排序方式进行排序,以此类推。每个地段都可以单独指定排序方式
SELECT ename,sal,deptno FROM emp ORDER BY deptno,ename
排序的字段中含有NULL值,NULL被认作最大值。
SELECT ename,comm FROM emp ORDER BY comm DESC
聚合函数
聚合函数又叫多行函数,分组函数,聚合函数是对结果集某字段的值进行统计的。
MAX.MIN求给定字段的最大值与最小值
SELECT MAX(sal),MIN(sal) FROM emp
AVG,SUM求平均值和总和
SELECT AVG(sal),SUM(sal) FROM emp
COUNT 函数
COUNT函数不是对给定字段的值进行统计而是对给定字段不为NULL的记录数的统计。实际上所有聚合函数都忽略NULL值统计
SELECT COUNT(comm) FROM emp
通常查看表的记录数可以使用COUNT(*)
SELECT COUNT(*) FROM emp
SELECT AVG(NVL(comm,0)) FROM emp
分组
GROUP BY子句
GROUP BY可以将结果集按照其后指定的字段值相同的记录看作一组,然后配合聚合函数进行更细分的统计工作
查看每个部门的平均工资
SELECT ROUND(AVG(sal),2),deptno FROM emp GROUP BY deptno
查看每个职位的最高工资
SELECT MAX(sal),job FROM emp GROUP BY job
GROUP BY也可以根据多个字段分组,分组原则为这几个字段值都相同的记录看作一组
查看同部门同职位的平均工资
SELECT AVG(sal),job,deptno FROM emp GROUP BY job,deptno
当SELECT子句中含有聚合函数时,那么凡不在聚合函数中的其他单独字段都必须出现在GROUP BY子句中,反过来则不是必须的
查看部门的平均工资,前提是该部门的平均工资高于2000
SELECT AVG(sal),deptno FROM emp WHERE AVG(sal)>2000 GROUP BY deptno
WHERE中不能使用聚合函数作为过滤调你家呢,原因是过滤时机不对。WHERE是在数据库检索表中数据时,对数据逐条过滤以决定是否
查询出该数据时使用的,所以WHERE用来确定结果集的数据。
使用聚合函数的结果作为过滤条件,那么一定是数据从表中查询完毕(WHERE在查询过程中发挥作用)得到结果集,并且
分组完毕才进行聚合函数统计结果,得到后才可以对分组进行过滤,由此课件,这个过滤时机实在WHERE之后进行的。
聚合函数的过滤条件要在HAVING子句中使用,HANING必须跟在GROUP BY子句之后。HAVING是用来过滤分组的。
SELECT ROUND(AVG(sal),2),deptno FROM emp GROUP BY deptno HAVING AVG(sal)>2000
查看平均工资高于2000的部门的最高工资和最低工资分别是多少
SELECT MAX(sal),MIN(sal),deptno FROM emp GROUP BY deptno HAVING AVG(sal)>2000
关联查询
从多张表中查询对应记录的信息,关联查询的重点在于这些表中的记录的对应关系,这个关系也称为连接条件
SELECT * FROM dept
查询每个员工的名字以及其所在部门的名字
当两张表有同名字段时,SELECT子句中必须明确指定该字段来自哪张表,在关联查询中,表名也可以添加别名,这样可以简化SELECT语句的复杂度
关联查询要添加连接条件,否则会产生笛卡尔积,笛卡尔积通常是一个无意义的结果集,它的记录数是所有参与查询的表的记录数成绩的结果。
要避免出现,数据量大时极易出现内存溢出等现象。
N张表关联查询要有至少N-1个连接条件。
SELECT e.ename,d.dname,d.deptno FROM emp e,dept d WHERE e.deptno=d.deptno
SELECT e.ename,d.dname FROM emp e,dept d
查询在纽约工作的员工
SELECT e.ename,e.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND d.loc='NEW YORK'
查看工资高于3000的员工的名字,工资,部门名以及所在地
SELECT e.ename,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND sal>3000
内连接
内连接也是用来完成关联查询的
查询SALES部门的员工名字以及部门的名字
SELECT e.ename,d.dname FROM emp e JOIN dept d
ON e.deptno = d.deptno (+)
+号在哪哪边添加NULL
WHERE d.dname='SALES'
不满足连接条件的记录是不会在关联查询中被查询出来的。
外链接
外链接除了会将满足链接条件的记录查询出来之外,还会将不满足链接条件的记录也查询出来
外链接分为:
1、左外链接:以JOIN左侧表作为驱动表(所有数据都会被查询出来),那么当该表中的某条记录满足链接条件是来自右侧表中的
字段全部填NULL
SELECT e.ename,d.dname
FROM emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno
2、右外链接:以右侧表为驱动表
SELECT e.ename,d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno
3、全外链接:两侧表为驱动
SELECT e.ename,d.dname
FROM emp e FULL OUTER JOIN dept d
ON e.deptno=d.deptno
DESC EMP
自连接
自连接即:当前表的一条记录可以对应当前表自己的多条记录
自连接是为了解决同类型数据当时有存在上下级关系的树状结构数据时使用。
查看每个员工以及其领导的名字
SELECT * FROM EMP
SELECT e.ename,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno
查看CLARK上司在哪个城市工作
SELECT m.ename,d.loc
FROM emp e JOIN dept d
ON e.deptno=d.deptno JOIN emp m
ON e.mgr=m.empno
WHERE e.ename='WARD'
SQL高级查询
子查询
子查询是一条SELECT语句,但它是嵌套在其他SQL语句中的,为的是给该SQL提供数据以支持其执行操作。
查看谁的工资高于CLARK
SELECT ename,sal
FROM emp
WHERE sal>any(SELECT sal FROM emp WHERE ename='CLARK' OR ename='TURNER')
查看谁和CLARK是相同职位的
SELECT * FROM emp
SELECT ename,job
FROM emp
WHERE job=(SELECT job FROM emp WHERE ename='CLARK')
查看与CLARK同部门的员工
SELECT ename,deptno
FROM emp
WHERE deptno=(SELECT deptno FROM emp WHERE ename='CLARK')
DROP TABLE employee
COMMIT
创建表employee,表中字段为:
empno,ename,job,sal,deptno,dname,loc,数据为现有表中emp与dept对应的数据
创建表时若子查询中的字段有别名则该表对应的字段就使用该别名作为其字段名,当子查询中一格字段含有函数或
表达式,那么该字段必须给别名
CREATE TABLE employee AS
SELECT e.empno id,e.ename name,e.job,e.sal*12 salary,e.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)
SELECT * FROM employee
删除CLARK所在部门的所有员工
DELETE FROM employee
WHERE deptno=(SELECT deptno FROM employee WHERE name ='CLARK')
SELECT ename,sal FROM emp WHERE sal>(SELECT AVG(sal) FROM emp)
COMMIT
资产讯根据查询结果集的不同分为:
单行单列子查询:常用于过滤条件,可以配合=,>,>=,<,<=等等使用
多行单列子查询:常用语过滤条件,由于查询处多个值,在判断=时要用IN,判断>,>=,<>等操作时要配合ANY,ALL
多行多列子查询:常当做一张表看待
查询与SALESMAN同部门的其他职位员工
SELECT ename,job,deptno FROM emp WHERE deptno IN(
SELECT deptno FROM emp WHERE job='SALESMAN') AND job <> 'SALESMAN'
查看比职位是CLERK和SALESMAN工资都高的员工
SELECT ename,sal FROM emp WHERE sal > ALL(
SELECT sal FROM emp WHERE job IN ('CLERK','SALESMAN'))
EXISTS关键字
EXISTS后面跟一个子查询,当该子查询可以查询处至少一条记录时,则EXISTS表达式成立并返回true
查询出没有员工的部门
SELECT deptno,dname FROM dept d
WHERE NOT EXISTS(
SELECT * FROM emp e WHERE e.deptno=d.deptno
)
查看每个部门的最低薪水是多少,前提是该部门的最低薪水要高于30号部门的最低薪水
SELECT MIN(sal) FROM emp GROUP BY deptno
HAVING MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=30)
子查询在FROM 子句中的使用
当一个子查询是多列子查询,通常将该子查询的结果集当做一张表看待并基于它进行二次查询
查看比自己所在部门平均工资高的员工
SELECT AVG(sal),deptno
FROM emp
GROUP BY deptno
SELECT e.ename,e.sal,e.deptno
FROM emp e,(SELECT AVG(sal) avg_sal,deptno
FROM emp
GROUP BY deptno) t
WHERE e.deptno=t.deptno
AND e.sal>t.avg_sal
子查询在SELECT中
在SELECT子句中使用子查询,可以将查询的结果当做外层查询记录中的一格字段值显示
SELECT e.ename,e.sal,(SELECT d.dname FROM dept d WHERE deptno=e.deptno) de
FROM emp e
分页查询
分页查询是将查询表中数据时分段查询,而不是一次性将所有数据查询出来。
又是查询的数据量非常庞大,这会导致系统资源消耗大,响应速度常,数据冗余严重。
为此当遇到这种情况时一般使用分页查询解决。
数据库基本都支持分页,但是不同数据库语法不同(方言)
ORACLE中的分页是基于伪列ROWNUM实现的。
ROWNUM不存在与任何一张表中,但是所有的表都可以查询该字段,该字段的值是随着查询自动生成的,
方式是:每当可以从表中查询出一条记录时,该字段的值即为该条记录的行号,从1开始,逐次递增
SELECT * FROM(
SELECT ROWNUM rn,empno,ename,sal,job FROM emp )
WHERE rn BETWEEN 6 AND 10
在使用ROWNUM对结果集进行编号的查询过程中不能使用ROWNUM做>1以上的判断,否则将查询不出任何数据
查看公司工资排名的第6到第10名
SELECT * FROM(
SELECT ROWNUM rn,ename,sal,job FROM(
SELECT ename,sal,job FROM emp ORDER BY sal DESC) WHERE ROWNUM<=10)
WHERE rn>=6
计算区间公式
pageSize:每页显示的条目数
page:页数
star:(page-1)*pageSize+1
end:pageSize*page
DECODE函数,可以实现分支效果
SELECT ename,job,sal,DECODE(job,'MANAGER',sal*1.2,
'ANALYST',sal*1.1,
'SALESMAN',sal*1.05,
sal)bonus
FROM emp
DECODE函数功能相似的有CASE语句,实现类似于if-else的操作
SELECT ename,job,sal, CASE job WHEN 'MANAGER' THEN sal*1.2
WHEN 'ANALYST' THEN sal*1.1
WHEN 'SALESMAN' THEN sal*1.05
ELSE sal END bonus
FROM emp
DECODE在GROUP BY分组中的应用可以将字段值不同的记录看作一组
将MANAGER,SALESMAN看作一组,其余职业看作另一组,分别统计人数
SELECT COUNT(*),DECODE(job,'MANAGER','ZU1',
'ANALYST','ZU1',
'OTHER')
FROM emp GROUP BY DECODE(job,'MANAGER','ZU1',
'ANALYST','ZU1',
'OTHER')
按照OPERATIONS ACCOUNTING SALES ..排序
SELECT deptno,dname,loc FROM dept ORDER BY DECODE (dname,'OPERATIONS',1,'ACCOUNTING',2,'SALES',3)
排序函数
排序函数允许对结果集按照指定的字段分组,在组内再按照指定的字段排序,最终生成组内编号。
ROW_NUMBER()函数生成组内连续且唯一的数字,
查看每个部门的工资排名
SELECT ename,sal,deptno,ROW_NUMBER() OVER(
PARTITION BY deptno
ORDER BY sal DESC
) rank
FROM emp
RANK函数,生成组内不连续也不唯一的数字,同组内排序字段值一样的记录,生成的数字也一样。
SELECT ename,sal,deptno,RANK() OVER(
PARTITION BY deptno
ORDER BY sal DESC
) rank
FROM emp
DENSE_RANK函数生成组内连续但不唯一的数字
SELECT ename,sal,deptno,DENSE_RANK() OVER(
PARTITION BY deptno
ORDER BY sal DESC
) rank
FROM emp
SELECT ename,sal,deptno,
DENSE_RANK() OVER(
PARTITION BY deptno
ORDER BY sal DESC
) RANK
FROM emp
CREATE TABLE sales_tab(
year_id NUMBER NOT NULL,
month_id NUMBER NOT NULL,
day_id NUMBER NOT NULL,
sales_values NUMBER(10,2) NOT NULL
);
INSERT INTO sales_tab
SELECT
TRUNC(DBMS_RANDOM.value(2010,2012)) AS year_id,
TRUNC(DBMS_RANDOM.value(1,13)) AS month_id,
TRUNC(DBMS_RANDOM.value(1,32)) AS day_id,
TRUNC(DBMS_RANDOM.value(1,100)) AS sales_value
FROM dual
CONNECT BY level <=1000;
SELECT * FROM sales_tab
集合
合并职位是'MANGER'的员工和薪水大于2500的员工集合,
UNION并集
SELECT ename,job,sal FROM emp WHERE job='MANAGER' UNION
SELECT ename,job,sal FROM emp WHERE sal>=2500
UNION ALL 并集
SELECT ename,job,sal FROM emp WHERE job='MANAGER' UNION ALL
SELECT ename,job,sal FROM emp WHERE sal>=2500
交集:INTERSECT
SELECT ename,job,sal FROM emp WHERE job='MANAGER' INTERSECT
SELECT ename,job,sal FROM emp WHERE sal>2500
MINUS插集,取前面有的,后面没有的
SELECT ename,job,sal FROM emp WHERE job='MANAGER' MINUS
SELECT ename,job,sal FROM emp WHERE sal>2500
SELECT * FROM sales_tab
高级分组函数
高级分组函数用在GROUP BY子句中,每个高级分组函数都有一套分组策略。
ROLLUP():分组原则,参数逐次递减,一直到所有参数都不要,每一种分组都统计一次结果并且在一个结果集显示
SELECT year_id,month_id,day_id,SUM(sales_values)
FROM sales_tab
GROUP BY ROLLUP(year_id,month_id,day_id)
CUBE():每种组合分一次组
分组次数:2的参数个数次方
SELECT year_id,month_id,day_id,SUM(sales_values)
FROM sales_tab
GROUP BY CUBE(year_id,month_id,day_id)
仅查看每天与每月营业额
GROUPING SETS:每个参数是一种分组方式,然后将这些分组统计后并在一格结果集显示。仅查看每天与每月营业额。
SELECT year_id,month_id,day_id,SUM(sales_values)
FROM sales_tab
GROUP BY GROUPING SETS(
(year_id,month_id,day_id),
(year_id,month_id)
)
视图
视图是数据库对象之一,所哟与数据库对象名字不能重复,所以视图名字一般是以“v_”开头的。
视图在SQL语句中体现的角色与表相同,但是视图并不是一张真是存在的表,而知识对应一格SELECT语句的查询结果集,并将其
当做表看待而已。使用视图的目的是简化SQL语句的复杂度,重用子查询,限制 数据访问。
CREATE VIEW v_emp_10 AS
SELECT empno,ename,sal,deptno FROM emp WHERE deptno=10
查看视图数据:
SELECT * FROM v_emp_10
视图对应的子查询中的字段若含有函数或者表达式,那么该字段必须指定别名,当视图对应的子查询中的字段使用了别名,
那么视图中该字段就用别名来命名。
修改视图
由于视图仅对应一个SELECT语句,所以修改视图就是替换该SELECT语句而已
CREATE OR REPLACE VIEW v_emp_10 AS
SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10
SELECT * FROM v_emp_10
视图分为简单视图与复杂视图
简单视图:对应的子查询中不含有关联查询,查询的字段不包含函数,表达式等,没有分组,没有去重,反之则是复杂视图。
对视图进行DML操作,仅能对简单视图进行DML操作,对视图进行DM操作就是对视图数据来源的基础表进行的操作
SELECT * FROM v_emp_10
INSERT INTO v_emp_10 (id,name,salary,deptno) VALUES (1000,'JACK',3000,20)
SELECT * FROM EMP
UPDATE v_emp_10 set salary=5000 WHERE name='JACK'
COMMIT
DELETE FROM v_emp_10 WHERE name='JACK'
对视图的DML操作就是对基表操作,那么操作不当可能对基表进行数据污染
视图对ROSE不可见
更新同样存在更新后对数据不可控的情况
INSERT INTO v_emp_10 (id,name,salary,deptno) VALUES (1001,'ROSE',3000,20)
删除不会对基表产生数据污染
DELETE FROM v_emp_10 WHERE deptno=20
WITH CHECK OPTION
为视图添加检查选项,可以保证对视图的DML操作后视图对其可见,否则不允许进行该DML操作,
这样就避免了对基表进行数据污染。
CREATE OR REPLACE VIEW v_emp_10 AS
SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10
WITH CHECK OPTION
UPDATE v_emp_10 SET deptno=20
WITH READ ONLY
SELECT * FROM v_emp_10
为视图添加只读选项,那么该视图不允许进行DML操作
CREATE OR REPLACE VIEW v_emp_10 AS
SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10
WITH READ ONLY
DELETE FROM v_emp_10 WHERE name='JACK'
user_objects 所有表
SELECT object_name FROM USER_OBJECTS WHERE object_type='VIEW'
SELECT TEXT,view_name FROM user_views
SELECT table_name FROM user_tables
复杂视图
创建一个含有公司部门工资情况的视图,内容为:部门编号,部门名称,部门的最高、最低、平均以及工资总和信息
SELECT * FROM emp
SELECT * FROM dept
CREATE OR REPLACE VIEW v_emp_sal AS
SELECT deptno,MAX(sal) max_sal,MIN(sal) min_sal,AVG(sal) avg_sal,SUM(sal) sum_sal
FROM emp GROUP BY deptno
SELECT
CREATE OR REPLACE VIEW v_dept_sal AS
SELECT d.deptno,d.dname,v1.max_sal,v1.min_sal,v1.avg_sal,v1.sum_sal FROM dept d,v_emp_sal v1
WHERE d.deptno =v1.deptno
SELECT * FROM v_dept_sal
SELECT * FROM v_emp_sal
查看谁比自己所在部门平均工资高
SELECT e.ename,e.sal,e.deptno FROM emp e,v_emp_sal d
WHERE e.deptno=d.deptno AND e.sal>d.avg_sal
序列
序列也是数据库对象之一,作用是生成一系列数字,序列常用于某张表的主键字段提供值使用。
CREATE SEQUENCE seq_emp_id
START WITH 1
INCREMENT BY 1 --步长
(MAXVALUE m | NOMAXVALUE
MINVALUE n | NOMINVALUE
CYCLE|NOCYCLE
CACHE p |NOCACHEK )
序列支持两个伪列:
NEXTVAL:获取序列下一个值,若是新创建的序列,那么第一次调用返回的是START WITH指定的值,以后
每次调用都会得到当前序列值加上步长后的数字。NEXTVAL会导致序列发生步进,且序列不能回退。
CURRVAL:获取序列当前值,即:最后一次调用
NEXTVAL后得到的值,CURRVAL不会导致步进。但是新创建的序列至少调用一次NEXTVAL后才可以使用CURRVAL
SELECT seq_emp_id.CURRVAL FROM dual
使用序列为EMP表中插入的数据提供主键字段的值
SELECT * FROM emp
INSERT INTO emp(empno,ename,sal,job,deptno) VALUES(seq_emp_id.NEXTVAL,'ROSE',6000,'CLERK',10)
DROP SEQUENCE seq_emp_id
索引
索引是数据库对象之一,索引是为了提高查询效率,索引的统计与应用是数据库自动完成的,只要数据库认为可以使用某个
已创建的索引时就会自动应用
CREATE INDEX idx_emp_ename ON emp(ename)
CREATE INDEX idx_emp_job_sal ON emp(job,sal)
修改和删除索引
重建索引
ALTER INDEX idx_emp_ename REBUILD
删除索引
DROP INDEX idx_emp_ename
合理使用索引
1、不要在小表上建立索引
2、经常出现在WHERE子句中的字段就要创建索引
3、经常出现在ORDER BY、DISTINCT后面的字段
4、经常改的数据库
SELECT * FROM employee
DROP TABLE employee
约束条件
CREATE TABLE employee(
eid NUMBER(6),
name VARCHAR2(30) NOT NULL,
salary NUMBER(7,2),
hiredate DATE CONSTRAINT employee_hiredate_nn NOT NULL
)
ALTER TABLE employee MODIFY (eid NUMBER(6) NOT NULL)
ALTER TABLE employee MODIFY (eid NUMBER(6) NULL)
约束
唯一性约束
唯一性约束可以保证表中该字段的值任何一条记录都不可以重复,NULL除外
CREATE TABLE employees1(
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE,
CONSTRAINT employees1_email_uk UNIQUE(email)
)
ALTER TABLE employees1 ADD CONSTRAINT employees1_name_uk UNIQUE(name)
主键约束
主键约束只能对应一个字段,该字段不能重复且非空
CREATE TABLE employees2(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE
)
INSERT INTO employees2 (eid,name) VALUES(2,'JACK')
检查约束
ALTER TABLE employees2 ADD CONSTRAINT employees2_salary_check CHECK(salary>2000 AND salary<4000)
INSERT INTO employees2(eid,name,salary) VALUES(3,'ROSE',5000)