数据库简介及SELECT查询语句

一、数据库相关概念

1、数据库(Database):

是按照数据结构来组织、存储和管理数据的仓库

2、数据库管理系统(Database Management System):

是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。

数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。

它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过 DBMS访问数据库中的数据,数据 库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的 方法在同时或不同时刻去建立,修改和询问数据库。

3、关系型数据库

根据存储模型可将数据库划分为关系型数据库和非关系型数据库。

关系型数据库, 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库 中的数据。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是 由二维表及其之间的联系所组成的一个数据组织。

当前主流的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。

4、SQL语言:

  • 一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。
  • 分类:
    DDL (数据定义语言)
    DML (数据管理语言)(DQL数据查询语言+DML数据管理语言)
    DCL (数据库控制语句)

5、表(Table)

  • 表是从属于用户的 ,查询表(用户名.表名),当前用户查询自己的表时,用户名. 可以省略,其他用户查询 别的用户表 ,不能省略,同时必须存在权限。 在关系数据模型中一张表就是一个关系。
  • 表是逻辑表(概念表),不是物理表 块(8k) --->区(连续块)-->段(连续区) -->表(多个段) ,数据段不全是表,表一定是数据段。还 有其他段:如索引段
  • 组成:行和列

列是同类信息组成,是一个属性或者特征,又称为一个字段。

行包括若干列的信息,又叫做一条记录,意义是信息的组合,整体用来描述一个对象。比如一个学生信息表,其中的列有姓名,性别,出生年月,籍贯,等等,这些信息组合在一起都是为了来描述学生这么个对象。

clipboard.png
  • 结构:类比JAVA


    image.png

6、三范式:

6.1、范式

简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。

6.2、三大范式:

  • 第一范式:

当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。

目的:尽量合并属性一样的列,确保不产生冗余数据

  • 第二范式:

如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

目的:这样便实现了一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。

  • 第三范式:

设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

简而言之,就是数据不能存在传递关系

注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
二、 select查询命令
1、查询列

  • 简单查询select-from
--两个中横线代表sql中的注释
--结尾分号要为英文状态下的分号
--select * from 表名;查询某个表中的所有数据
select * from emp;
--select 字段名1,字段名2...from表名;查询部分字段数据
select sal,comm from emp;
  • 使用distinct关键字去重
--去重使用distinct关键字
select distinct sal from emp;
  • 伪列:不存在的列,构建虚拟的列
--select表达式from 表名;结果字段的名字为表达式的名字,值为表达式计算的结果-->计算器
select 1+1 from emp;
select distinct 123*456,12*34 from emp;
--对数字和日期进行加减乘除运算
select empno/2 from emp;
  • as 关键字
    使用AS给查询结果取别名(AS也可以省略):
--别名  select 字段1 as 别名,字段2 as 别名, 字段3 别名.. from 表名 别名;
--别名如果是英文默认大写
select distinct  123*456 as sum,12*34 as 哈哈 from emp;
--''代表字符串  ""原样输出 结果字段名和值原样字符串输出
--如果别名为英文默认大写,别名为中文为原样。如果想要原样使用英文或者中文加空格则需用""引用
select '哈哈' as "sum"   from emp;
  • 字符串的拼接使用||
select distinct 'a-'||'b-' "EE" from emp;
select '尚学堂'||ename as "学生姓名" from emp;
  • 虚拟表:dual
    Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。例如:执行一个查看当前日期的语句 select sysdate from dual
    可以用来查看用户,调用函数,获取序列值,计算器,查看日期等
--虚表: oracle中不是真是存在的表,其中没有任何数据  dual
select sysdate from dual;
  • null遇到数字参与运算的结果为 null,遇到字符串为空串
select '2'||null from dual;
select 1+null from dual;

2、查询行:

  • where 条件过滤,执行顺序 from---where---select
--select *|字段1,字段2.. from 表名 where 行过滤条件;
--求20部门所有员工信息
select * from emp where deptno = 20;
  • 比较运算关系
-- = 、 >、 <、 >=、 <=、 !=、 <>、
--所有员工中薪资>800
select * from emp where sal >800;

不等于的几种表达方式 not != <>

  --求除了SMITH以外的所有员工信息
select * from emp where ename != 'SMITH';
select * from emp where ename <> 'SMITH';
select * from emp where not ename = 'SMITH';
  • 逻辑运算
--and 、or、 not , between and
select * from emp where sal>=1500 and sal <=2500;
select * from emp where sal between 1500 and 2500--是>=  <=
  • null判断使用is
--求奖金为null的人
select * from emp where comm is null;
--求有奖金的人
select * from emp where comm is not null;
select * from emp where not comm is null;
--select * from emp where comm not is null;  错误事例
  • 集合操作
--Union并集Union All并集(不去重)、Intersect(交集)、Minus(差集) 
select * from emp where sal>1500
union 
select * from emp where deptno =30;
  • 模糊查询
--模糊查询  %任意个任意字符  _任意一个字符
select * from emp where ename like 'A%';
--找出名字带有%的,使用escape指定转义字符
select * from emp where ename like 'A%%' escape(A);
  • 事务
    在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
--提交事务
commit;
--回滚事务
rollback;
  • in关键字
    in相当于使用or的多个等值,定值集合 ,如果存在 子查询,确保 类型相同、字 段数为1,如果记录多,效率不高,用于 一些 少量定值判断上
--in 匹配后面结果集中的任意一个数据,无法做区间判断
--查询部门编号为10,20的员工姓名
select deptno,ename from emp where deptno in(10,20);
select * from salgrade;
--查询 销售部(SALES) 中 工资大于1500的员工信息
--查询的数据:*
--来源:emp
--条件: 销售部(SALES)   sal>1500
select * from emp where sal>1500 and 
     deptno in (select deptno from dept where dname='SALES');
  • exists
    指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
--exists 存在即保留 存在即合法
select * from emp where exists (select * from dept where dname = 'a');
select * from emp where exists (select * from emp);
--查询销售和财务所有员工信息
select *
  from emp
 where exists (select *
          from dept
         where dname in ('SALES', 'ACCOUNTING')
           AND emp.deptno = dept.deptno);
--查询10编号部门所有员工信息
select *
  from emp
 where exists (select deptno
          from dept
         where deptno = 10
           and dept.deptno = emp.deptno);
  • order排序
--order by  desc 降序  asc升序
--select * from 表名 where 行过滤条件 order by 排序字段;  --默认升序
--from--where--select--order by
--10编号部门根据薪资排序
select * from emp where deptno=10 order by sal asc;
--根据奖金排序
select * from emp order by comm desc nulls last;

函数:
函数分为系统内置函数 自定义函数(后期学习的 plsql中定义);了解系统内置函数(方法),重点掌握 to_date 、 to_char (字符和日期的转换)
根据函数的返回结果,我们将函数分为单行函数和多行函数
单行函数:一条记录返回一个结果
多行函数 组函数 聚合函数 (重点) :多条记录 返回一个结果 (重点)
ORACLE中规定,组函数嵌套只能嵌两层。其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套。但是,单行函数是可以多层嵌套的。
3、单行函数

  • 日期函数
--当前日期
select sysdate from dual;
select current_date from dual;
--日期计算,天数加减
select hiredate,hiredate +3 from emp;
--月份加减
select add_months(hiredate,3)from emp;
--月份最后一天
select last_day(sysdate) from dual;
--months between(date1,date2) date1要在date2之后,否则为负数
select months_between(sysdate,hiredate) from emp;
--下个周二
select next_day(sysdate,'星期二') from dual;
--to_date(c,m) 字符串以指定格式转换为日期
select to_date('2018-05-15 23:23:34','yyyy/mm/dd hh24:mi:ss')from dual;
  • 其它函数
--decode(字段,字段值1,值2,字段值2,值3..,默认值)根据某个字段进行判断
--打印所用的部门名称,如果10,添加一个伪列,显示对应部门的大写名称
select deptno,decode(deptno,10,'十',20,'二十',30,'三十','其他') from dept;
--case when then else end
select ename,
       sal,
       deptno,
       (case deptno
         when 10 then
          sal * 1.1
         when 20 then
          sal * 1.08
         when 30 then
          sal * 1.15
         else
          sal * 1.2
       end) raisesal
  from emp;

4、组函数

  • count
--计算员工数 count(*|1|字段)
--count(*|1)评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数
select * from emp;
select count(comm) from emp;
select count(*) from emp;
select count(1) from emp;
select count('anything') from emp;
select count('comm') from emp;

注意:

评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数,只要()中指定非null表达式,结果没有任何区别

对于Count(字段)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。

摘:count(1)和count(*)的区别

count(1)和count(*)的作用:

都是检索表中所有记录行的数目,不论其是否包含null值。

count(1)比count(*)效率更高

count(字段)与count(1)和count(*)的区别:

count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录

参考:[https://www.cnblogs.com/zyy1688/p/10436816.html]

  • max min 求最大值、最小值
--查询薪资最高的员工姓名和薪资
select max(sal) from emp;
select ename,sal from emp where sal=(select max(sal)from emp);
  • avg求平均
--avg
--求20部门平均薪资
select avg(sal) from emp where deptno =20
  • sum求和
--求一个公司这个月的薪资开销
select sum(sal) from emp;
  • 分组:group by 将符合条件的记录 进一步的分组
    过滤组:having , 过滤组信息 ,表达式 同 where 一致
--分组 group by 分组字段
--select *|字段.. from 表名 where 行过滤条件  group by 分组字段  having 组过滤信息 order by 排序字段;
--执行流程:from--where--group by--having--select--order by
--select ename en from emp where en='SMITH';
-- 找出20部门和30部门的最高工资 
select max(sal) from emp group by deptno having deptno in(20,30)
-- 求出平均工资高于2000的部门编号和平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--查询 最低平均工资的部门编号
--先查出最低的部门平均薪资
select min(avg(sal))  from emp group by deptno;
select deptno
  from emp
 group by deptno
having avg(sal) = (select min(avg(sal)) from emp group by deptno);

注意:
select 出现分组函数,就不能使用 非分组信息,可以使用 group by 字段
group by字段 可以不出现 select 中 ,反之select 除组函数外的,其他字段必 须出现在group by 中
过滤组 having : where :过滤行记录,不能使用组函数, having:过滤组 可以使用组函数

  • 说明
组信息 与单条记录不能同时查询 
组函数 不能用在 where中,能使用的地方 select  having 
null 不参与运算 
  • 注意
组函数仅在选择列表和Having子句中有效   
出现组函数,select 只能有组函数或分组字段 

参考信息:百度百科

https://www.2cto.com/database/201807/762737.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容