问:什么是关系型数据库管理系统?
答:由关系、数据、数据之间的约束三者所组成的数据模型则称为RDBMS,即关系型数据库管理系统。
问:简述结构化查询语言的分类
答:SQL(Structured Query Language)结构化查询语言
SQL可分为:
-数据定义语言(DDL) Data Definition Lauguage
CREATE(创建)\DROP(删除表结构)\ALTER(修改)\TRUNCATE(删除表数据,保留表结构)
-数据操纵语言(DML) Data Manipulation Lauguage 执行完后需要执行事物控制语句提交后才能真正的将改变应用到数据库中
INSERT(将数据插入到表中)\UPDATE(更新数据表中已存在的数据)\DELETE(删除数据表中的数据)
-事物控制语言(TCL) Transaction Control Lauguage
COMMIT(提交)\ROLLBACK(回滚)\SAVEPOINT(保存点)
-数据查询语言(DQL) Data Query Lauguage
SELECT语句
-数据控制语言(DCL) Data Control Lauguage
GRANT(授权)/REVOKE(收权)/CREATE USER(创建用户)
表是二维的,有行和列组成。行表示横排数据,也称作记录(Record),列是竖排数据,也被称作字段(Field)
表是关系数据库的基本存储结构,一个关系数据库由多个数据表(Table)组成。
表与表之间的关联关系:一对一,一对多,多对多
# CHAR定长字符串,最大支持2000字节:查得快,浪费空间
# VARCHAR、VARCHAR2变成字符串,最大支持4000字节:节约空间,查得慢
VARCHAR 所有数据库都支持
VARCHAR2 只有Oracle数据库支持
# DATE定义日期时间的数据,长度是7个字节
# 创建表 CREATE TABLE 表名
# 查看表的结构 DESC 表名
# 删除表 DROP TABLE 表名
DROP TABLE employee_zhangchao_sc;
DESC employee_zhangchao_sc;
CREATE TABLE employee_zhangchao_sc(
id NUMBER(4),
name VARCHAR2(20),
gender CHAR(1) DEFAULT 'M',
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptno NUMBER(2)
);
在数据库中,所有类型的默认值都是NULL。即当插入数据时,若某个字段没有指定值时,默认就将NULL作为值插入。
可以在创建表的时候通过使用DEFAULT关键字来单独指定默认值。
字符串的字面量是使用单引号括起来的,这一点与java不同。
NOT NULL 约束
当一个字段使用NOT NULL约束后,该字段在任何情况下值不允许为空
# 修改表
1.修改表名
RENAME old_name TO new_name
将employee表改为myemp
RENAME employee TO myname
DECODE函数
--可以实现分支结构。
--如果第一个参数等于第二个参数,那返回第三个参数
--如果第一个参数等于第四个参数,那么返回第五个参数
--如果都不满足,返回最后一个
SELECT ename,job,salary,DECODE(job,
'MANAGER',salary*1.2,
'ANALYST',salary*1.1,
'SALESMAN',salary*1.05,
salary) bonus
FROM emp_zhangchao_sc;
####查询条件
##DISTINCT 过滤重复
--去除后面指定字段的重复行。
--DISTINCT必须紧跟在SELECT关键字之后!SELECT与DISTINCT之间不能用其他任何字段
SELECT DISTINCT job FROM emp_zhangchao_sc; --查看公司有哪些岗位?
####排序
##ORDER BY
--可以根据后面指定的字段对结果进行升序或者降序排列。其中ASC是升序,DESC是降序
--通常ASC可以不写,不写默认就是升序。
--ORDER BY子句只能写在SELECT语句中最后一个子句上
####集合操作 字段的数量和类型必须一致(但可以用NULL补)
##UNION --取并集,但重复的记录只会出现一次。
##UNION ALL --取并集,重复的记录会重复出现
##INTERSECT --取交集,保留上边和下边都有的
##MINUS --取差集,保留上边有,下边没有的
SELECT ename,job,salary FROM emp_zhangchao_sc
WHERE job = 'MANAGER'
MINUS
SELECT ename,job,salary FROM emp_zhangchao_sc
WHERE salary >2500;
####聚合函数
--聚合函数又称为 多行函数,分组函数
--聚合函数可以将多条记录进行统计,然后得出一个结果
--所以聚合函数是用来统计使用的
--聚合函数忽略NULL值
#MAX(),MIN() 用来统计最大值与最小值
#AVG(),SUM() 求平均值与总和
#COUNT() 统计记录总数
####高级分组函数
#ROLLUP(a,b,c)
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY ROLLUP(year_id,month_id,day_id)--需求是分组逐个递减才使用 --按照:年月日、年月、年、SUM(sales_value)
ORDER BY year_id,month_id,day_id;
#CUBE(a,b,c)
--CUBE分组方式是全方位的。
--分组方式是2的参数个数次方。abc ab ac bc a b c 全表
--但有些记录根本没意义
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY CUBE(year_id,month_id,day_id)
ORDER BY year_id,month_id,day_id;--有些记录根本每月意义
#GROUPING SETS 比较灵活
--允许指定不同的分组方式,然后将这些分组统计的结果并在一个结果集中。
SELECT year_id,month_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY GROUPING SETS(
(year_id,month_id),year_id --将按照每个参数进行分组统计 --按照:年月、年统计
)
ORDER BY year_id,month_id;
####分组
##GROUP BY
--GROUP BY子句可以将结果集按照指定的字段值相同的记录看做一组
--配合聚合函数使用可以对不同分组的记录分别进行统计后然后得到结果
--在SELECT当中使用了聚合函数,那么不在聚合函数中的其他单独字段必须出现在GROUP BY子句中,反过来不是必须得
--GROUP BY可以按照多个字段进行分组。分组原则是这些字段值的组合相同的看做一组
SELECT AVG(salary),deptno,job FROM emp_zhangchao_sc
GROUP BY deptno,job;
##HAVING子句 --WHERE子句先过滤,HAVING子句后过滤
--HAVING子句必须紧跟在GROUP BY子句之后,作用是添加条件来过滤不同的分组
--HAVING可以使用聚合函数作为过滤条件(WHERE不能使用聚合函数作为过滤条件)
SELECT MAX(salary),MIN(salary),deptno FROM emp_zhangchao_sc
GROUP BY deptno
HAVING AVG(salary)>2500;
####排序函数
##ROW_NUMBER -生成连续且唯一的数字
SELECT ename,salary,deptno,
ROW_NUMBER() OVER(
PARTITION BY deptno
ORDER BY salary
)rank
FROM emp_zhangchao_sc; --工资相同,排名不同
##RANK -生成不连续也不唯一的数字
SELECT ename,salary,deptno,
RANK() OVER(
PARTITION BY deptno
ORDER BY salary
)rank
FROM emp_zhangchao_sc; --工资相同,排名相同,名次不连续
##DENSE_RANK -生成连续但不唯一的数字 (工资相同,排名相同,名次连续)
####DECODE函数
--可以实现分支结构。
--如果第一个参数等于第二个参数,那返回第三个参数
--如果第一个参数等于第四个参数,那么返回第五个参数
--如果都不满足,返回最后一个
SELECT ename,job,salary,DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER') part
FROM emp_zhangchao_sc;
结合GROUP BY使用:
SELECT COUNT(*),DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER') part
FROM emp_zhangchao_sc
GROUP BY DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER');
####关联查询
##内连接 满足所有满足连接连接的数据记录
SELECT e.ename,d.dname
FROM emp_zhangchao_sc e JOIN dept_zhangchao_sc d
ON e.deptno = d.deptno --连接条件
WHERE d.dname = 'SALLES';--过滤条件
##外连接
#左外连接:以JOIN左侧的表为驱动表,该表所有记录都要显示出来,那么当某条记录不满足连接条件时
--那么来自JOIN右侧表中的字段值全部显示为NULL
--LEFT OUTER JOIN
SELECT e.ename,e.job,e.d eptno,d.dname,d.loc
FROM emp_zhangchao_sc e,dept_zhangchao_sc d
WHERE e.deptno = d.deptno(+);--左外连接效果
#右外连接:同理 RIGHT OUTER JOIN
SELECT e.ename,e.job,e.deptno,d.dname,d.loc
FROM emp_zhangchao_sc e,dept_zhangchao_sc d
WHERE e.deptno(+) = d.deptno;--右外连接效果
#全外连接:同理 FULL OUTER JOIN
##自连接
--当前表的一条记录对应当前表自己的多条记录,这种设计就是自连接,自连接时用来解决数据内容相同
--但是数据间又存在上下级关系的树状结构的情况。
SELECT e.ename,m.ename
FROM emp_zhangchao_sc e,emp_zhangchao_sc m
WHERE e.mgr = m.empno;
答:由关系、数据、数据之间的约束三者所组成的数据模型则称为RDBMS,即关系型数据库管理系统。
问:简述结构化查询语言的分类
答:SQL(Structured Query Language)结构化查询语言
SQL可分为:
-数据定义语言(DDL) Data Definition Lauguage
CREATE(创建)\DROP(删除表结构)\ALTER(修改)\TRUNCATE(删除表数据,保留表结构)
-数据操纵语言(DML) Data Manipulation Lauguage 执行完后需要执行事物控制语句提交后才能真正的将改变应用到数据库中
INSERT(将数据插入到表中)\UPDATE(更新数据表中已存在的数据)\DELETE(删除数据表中的数据)
-事物控制语言(TCL) Transaction Control Lauguage
COMMIT(提交)\ROLLBACK(回滚)\SAVEPOINT(保存点)
-数据查询语言(DQL) Data Query Lauguage
SELECT语句
-数据控制语言(DCL) Data Control Lauguage
GRANT(授权)/REVOKE(收权)/CREATE USER(创建用户)
表是二维的,有行和列组成。行表示横排数据,也称作记录(Record),列是竖排数据,也被称作字段(Field)
表是关系数据库的基本存储结构,一个关系数据库由多个数据表(Table)组成。
表与表之间的关联关系:一对一,一对多,多对多
# CHAR定长字符串,最大支持2000字节:查得快,浪费空间
# VARCHAR、VARCHAR2变成字符串,最大支持4000字节:节约空间,查得慢
VARCHAR 所有数据库都支持
VARCHAR2 只有Oracle数据库支持
# DATE定义日期时间的数据,长度是7个字节
# 创建表 CREATE TABLE 表名
# 查看表的结构 DESC 表名
# 删除表 DROP TABLE 表名
DROP TABLE employee_zhangchao_sc;
DESC employee_zhangchao_sc;
CREATE TABLE employee_zhangchao_sc(
id NUMBER(4),
name VARCHAR2(20),
gender CHAR(1) DEFAULT 'M',
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptno NUMBER(2)
);
在数据库中,所有类型的默认值都是NULL。即当插入数据时,若某个字段没有指定值时,默认就将NULL作为值插入。
可以在创建表的时候通过使用DEFAULT关键字来单独指定默认值。
字符串的字面量是使用单引号括起来的,这一点与java不同。
NOT NULL 约束
当一个字段使用NOT NULL约束后,该字段在任何情况下值不允许为空
# 修改表
1.修改表名
RENAME old_name TO new_name
将employee表改为myemp
RENAME employee TO myname
DECODE函数
--可以实现分支结构。
--如果第一个参数等于第二个参数,那返回第三个参数
--如果第一个参数等于第四个参数,那么返回第五个参数
--如果都不满足,返回最后一个
SELECT ename,job,salary,DECODE(job,
'MANAGER',salary*1.2,
'ANALYST',salary*1.1,
'SALESMAN',salary*1.05,
salary) bonus
FROM emp_zhangchao_sc;
####查询条件
##DISTINCT 过滤重复
--去除后面指定字段的重复行。
--DISTINCT必须紧跟在SELECT关键字之后!SELECT与DISTINCT之间不能用其他任何字段
SELECT DISTINCT job FROM emp_zhangchao_sc; --查看公司有哪些岗位?
####排序
##ORDER BY
--可以根据后面指定的字段对结果进行升序或者降序排列。其中ASC是升序,DESC是降序
--通常ASC可以不写,不写默认就是升序。
--ORDER BY子句只能写在SELECT语句中最后一个子句上
####集合操作 字段的数量和类型必须一致(但可以用NULL补)
##UNION --取并集,但重复的记录只会出现一次。
##UNION ALL --取并集,重复的记录会重复出现
##INTERSECT --取交集,保留上边和下边都有的
##MINUS --取差集,保留上边有,下边没有的
SELECT ename,job,salary FROM emp_zhangchao_sc
WHERE job = 'MANAGER'
MINUS
SELECT ename,job,salary FROM emp_zhangchao_sc
WHERE salary >2500;
####聚合函数
--聚合函数又称为 多行函数,分组函数
--聚合函数可以将多条记录进行统计,然后得出一个结果
--所以聚合函数是用来统计使用的
--聚合函数忽略NULL值
#MAX(),MIN() 用来统计最大值与最小值
#AVG(),SUM() 求平均值与总和
#COUNT() 统计记录总数
####高级分组函数
#ROLLUP(a,b,c)
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY ROLLUP(year_id,month_id,day_id)--需求是分组逐个递减才使用 --按照:年月日、年月、年、SUM(sales_value)
ORDER BY year_id,month_id,day_id;
#CUBE(a,b,c)
--CUBE分组方式是全方位的。
--分组方式是2的参数个数次方。abc ab ac bc a b c 全表
--但有些记录根本没意义
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY CUBE(year_id,month_id,day_id)
ORDER BY year_id,month_id,day_id;--有些记录根本每月意义
#GROUPING SETS 比较灵活
--允许指定不同的分组方式,然后将这些分组统计的结果并在一个结果集中。
SELECT year_id,month_id,SUM(sales_value)
FROM sales_zhangchao
GROUP BY GROUPING SETS(
(year_id,month_id),year_id --将按照每个参数进行分组统计 --按照:年月、年统计
)
ORDER BY year_id,month_id;
####分组
##GROUP BY
--GROUP BY子句可以将结果集按照指定的字段值相同的记录看做一组
--配合聚合函数使用可以对不同分组的记录分别进行统计后然后得到结果
--在SELECT当中使用了聚合函数,那么不在聚合函数中的其他单独字段必须出现在GROUP BY子句中,反过来不是必须得
--GROUP BY可以按照多个字段进行分组。分组原则是这些字段值的组合相同的看做一组
SELECT AVG(salary),deptno,job FROM emp_zhangchao_sc
GROUP BY deptno,job;
##HAVING子句 --WHERE子句先过滤,HAVING子句后过滤
--HAVING子句必须紧跟在GROUP BY子句之后,作用是添加条件来过滤不同的分组
--HAVING可以使用聚合函数作为过滤条件(WHERE不能使用聚合函数作为过滤条件)
SELECT MAX(salary),MIN(salary),deptno FROM emp_zhangchao_sc
GROUP BY deptno
HAVING AVG(salary)>2500;
####排序函数
##ROW_NUMBER -生成连续且唯一的数字
SELECT ename,salary,deptno,
ROW_NUMBER() OVER(
PARTITION BY deptno
ORDER BY salary
)rank
FROM emp_zhangchao_sc; --工资相同,排名不同
##RANK -生成不连续也不唯一的数字
SELECT ename,salary,deptno,
RANK() OVER(
PARTITION BY deptno
ORDER BY salary
)rank
FROM emp_zhangchao_sc; --工资相同,排名相同,名次不连续
##DENSE_RANK -生成连续但不唯一的数字 (工资相同,排名相同,名次连续)
####DECODE函数
--可以实现分支结构。
--如果第一个参数等于第二个参数,那返回第三个参数
--如果第一个参数等于第四个参数,那么返回第五个参数
--如果都不满足,返回最后一个
SELECT ename,job,salary,DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER') part
FROM emp_zhangchao_sc;
结合GROUP BY使用:
SELECT COUNT(*),DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER') part
FROM emp_zhangchao_sc
GROUP BY DECODE(job,
'MANAGER','VIP',
'SALESMAN','VIP',
'OTHER');
####关联查询
##内连接 满足所有满足连接连接的数据记录
SELECT e.ename,d.dname
FROM emp_zhangchao_sc e JOIN dept_zhangchao_sc d
ON e.deptno = d.deptno --连接条件
WHERE d.dname = 'SALLES';--过滤条件
##外连接
#左外连接:以JOIN左侧的表为驱动表,该表所有记录都要显示出来,那么当某条记录不满足连接条件时
--那么来自JOIN右侧表中的字段值全部显示为NULL
--LEFT OUTER JOIN
SELECT e.ename,e.job,e.d eptno,d.dname,d.loc
FROM emp_zhangchao_sc e,dept_zhangchao_sc d
WHERE e.deptno = d.deptno(+);--左外连接效果
#右外连接:同理 RIGHT OUTER JOIN
SELECT e.ename,e.job,e.deptno,d.dname,d.loc
FROM emp_zhangchao_sc e,dept_zhangchao_sc d
WHERE e.deptno(+) = d.deptno;--右外连接效果
#全外连接:同理 FULL OUTER JOIN
##自连接
--当前表的一条记录对应当前表自己的多条记录,这种设计就是自连接,自连接时用来解决数据内容相同
--但是数据间又存在上下级关系的树状结构的情况。
SELECT e.ename,m.ename
FROM emp_zhangchao_sc e,emp_zhangchao_sc m
WHERE e.mgr = m.empno;