SQL Foundation(1--13)

article/2025/11/11 6:12:59

1:关系数据库的由来:

          IBM的工程师Dr E F codd 的关系型数据库模型发表于1970 论文名称: A relational Model of data for  Large Shared Data Bank  (这个在wiki 和google上可以搜到)

         SQL:  Structured query language: oracle官方SQL文档

 2:如何给一个用户解锁:

          当我们安装oralce的数据库的时候,会默认安装一个SAMPLE的例子: 

                     关于oracle的书中讲解中,大多会采用这个例子经典的只有七张表:这七张表可以作为学习关系型数据库的基础

           但是这个用户默认是关闭的。这个用户的用户名为HR

          如果想看这些表,需要对HR用户进行解锁:

                           解锁步骤:

                                       1: alter user HR account unlock  ;     对改用户进行解锁 (在sqlpllus中登录sysdba执行)

                                        2:select username ,account_status from dba_users;  查询有多少用户

                                        3: alter user  HR identified by HR; 修改密码; 修改密码后才变成 open状态 

                                        4:登录 conn HR/HR 

                                        5: show user;  用于显示当前登录的用户

                                      

SQL> show user;
USER 为 "HR"

以下是这七张表:


SELECT oracle  联机文档

 3:关于null:

  关于null  :
null is a value that is unavailable,unassigned, unknown,
or inapplicable.
null is not the same as  zero or  a blank space.

         null和其他值进行数学运算的时候,
如果在算术表达式中,有一个值包含null 这个值就是null。
null 和字符串进行合并的时候 为其他字符串本身。

4:别名

别名的命名:
  可以用AS或者空格 ex: select  last_name as name, solary  solary_month from employees;
  select last_name||first_name AS "Employees" from employees;
  增加可读性 加空格:
  select last_name||'   '||first_name AS "Employees" from employees;
  IN(set) 判断某个值是否在某个集合里面。
  也可以用or来写。
  Like  用%匹配 0个或者多个字符串
  _ 匹配一个字符。
  如果想匹配_ 需要用转义字符 like '%S\_%' escape '\'
       后面是指定 转义字符为escape '\'     \    

关于查询出来的行数据含有null值时候,在数据显示的时候null放前还是放后的问题;

 select  last_name ,department_id,salary from employees order by department_id ,salary desc
以上例子意思是,首先按照department_id 升序排列, 然后当 department_id相同即部门相同 的时候
,再按照 salary 降序排列。 关于null放前还是放后的问题,
有命令 null first 或 null last 等:

5:substitution variables(使用变量):

可以通过 & 或者 && 使用变量。
     几乎所有地方都可以使用。  
SQL> select  last_name ,department_id,salary from employees where employee_id=&e
mploy_null  ;


替换变量是客户端软件的功能,不是数据库服务器的功能,在发回到数据库服务器的时候,
就不存在替换变量了。


select employee_id ,last_name,job_id, &&column_name from employees
order by &column_name


如果一个&变量 每次都要输入值,如果用两个&&表示后面还有需要输入这个值。
&&需要的参数。
也可以用define
define employee_num = 200
define命令 能够显示定义的变量》
定义后 &后的变量就可以不用数据输入了。
消除定义为 undefine  employee_num

6:oracle常用函数

function::=

Description of function.gif follows
oracle函数类型太多了常用的一下两类:
1: single-row function  : 对单行进行操作的函数,

 2:mutiple-row funciton :就是多行函数,对多行进行操作,聚合函数

-------------------------------------------------------------------------------------------------------------------------------------------------- 
大小写函数 LOWER('STR')
           UPPER('STR')
           INITCAP('STR')

                          INSTR() IN--INDEX 就是
 LPAD()   pad是填充的意思。为了使输出格式化对齐
example:
SELECT LPAD('Page 1',15,'*.') "LPAD example"FROM DUAL;LPAD example
---------------
*.*.*.*.*Page 1
 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ROUND(88.947,2)  88.95   四舍五入  如果2为-1 则为  90  如果为0  89
        TRUNC(88.947) 88.94    直接截取掉  
        MOD(1500,200)   100      求余
以上详细参见参考文档
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------      
using conversion functions and  conditional expressions
使用转化函数和条件表达式:
1:首先讨论数据类型的转换
           >>>>> 隐式转换 
                               char  varchar2 ---->  date
                        ex:select  last_name , hire_date from employees where  hire_date >'09-july-90';
                                char   varchar2 ----> number  
                         ex:select  '99.00' + 22.23 from  dual  
>>>>显示转换:
character --->number  TO_NUMBER(char[,'format_model'])
                char 必须是 0--9的字符
 
                             select TO_NUMBER('-$123,456.78','$999,999.99') from dual;       (前后的转换的格式必须保持一致,不然容易出错)
---------------------------------------------------------------------------------------------------------------------------------------------------------------
date ----> character   TO_CHAR(date,'format_model');
select employee_id ,TO_CHAR(hire_date,'MM/YY') Month_Hired from employees
                                              where  last_name='Higgins';         
result:
EMPLOYEE_ID MONTH
                                                             ----------- -----
                                                                      205 06/94
select employee_id ,TO_CHAR(hire_date,'fmMM/YY') Month_Hired from employees
                               where  last_name='Higgins';  fm作用是把前面的0去掉;
EMPLOYEE_ID MONTH
----------- -----205 6/94
     ------------------------------------------------------------------------------------------------------------------------------------------------
character---->date     TO_DATE(char[,'format_model']);
            ??? SELECT TO_DATE('July 07 , 2008','Month DD ,YYYY') from dual
----------------------------------------------------------------------------------------------------------------------------------------------------
number---->character TO_CHAR(number,'format_model');
  select TO_CHAR(salary,'$99,999.00') salary from employees where last_name='Ernst';
-----------------------------------------------------------------------------------------------------------------------------------------------------
函数嵌套:
      Nesting function:
              优先计算内部的函数,然后再计算外面的。

-----------------------------------------------------------------------------------------------------------------------------------------------------------

常见函数general functions::
 >>>>NVL(exp1,exp2)
NVL  lets you replace null (returned as a blank) with a string in the results of a query. If  expr1  is null, then  NVL  returns  expr2 . If  expr1  is not null,                             then  NVL  returns expr1 .
       >>>>NVL2(exp1,exp2,exp3)
              NVL2 lets you determine the value returned by a query based on whether a specified expression is null or not null. If expr1 is not null,                                          then NVL2 returns expr2. Ifexpr1 is null, then NVL2 returns expr3
                 if exp1=null exp3 
          if exp1 != null  exp2
        >>>> NULLIF(exp1,exp2)
             NULLIF compares expr1 and expr2. If they are equal, then the function returns null. If they are not equal, then the function returns expr1. You cannot                   specify the literal NULL for expr1.
           

The NULLIF function is logically equivalent to the following CASE expression:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
>>>>>>COALESCE(); 从左到右,返回不是null的值。
COALESCE  returns the first non-null  expr  in the expression list. You must specify at least two expressions. If all occurrences of  expr  evaluate to null, then the function returns null.

You can also use COALESCE as a variety of the CASE expression. For example,

COALESCE(expr1, expr2)

is equivalent to:

CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END

Similarly,

COALESCE(expr1, expr2, ..., exprn)

where n >= 3, is equivalent to:

CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE COALESCE (expr2, ..., exprn) END
 case是sql国际标准 为了兼容性 可以用case
这个非常有用:
CASE  expr when comparison_expr1 then return_expt1
           [when comparison_expr2  then return_expt2
           when comparison_exprn  then return_exptn
                 else else_expt]   
END

             意思就是 当expr = expr1 时 返回 expt1 ,当 expr = expr2时,返回 expt2 , 当expr=exprn时,返回 exptn  ,如果以上都不匹配 返回 else_expt
      decode是oracle特有的:

Description of decode.gif follows

DECODE compares expr to each search value one by one. If expr is equal to a search, then Oracle Database returns the corresponding result. If no match is found, then Oracle returns default. If default is omitted, then Oracle returns null.

7:使用聚合函数

1: count(*) 和 count(1)用法一致。 count(1)的执行速度比count(*)稍微快一点。
     count(column_name|exp) 在满足列或者表达式的非空行的数据的个数。
count(distinct expr)  不相同的非空行的个数。:

2:AVG用法:

 select  AVG(comission_pct) from
 select AVG(NVL(comission_pct,0)) from  employees n --排除非空行;

3:Group 字句:

  group by  和 where放在一起,先执行where 再执行 group by,
 select 中的列 在 group by 中 必须要有,在查询的时候一定要保持查出来的数据想对应,不然容易出错。好好回味 多个分组的意义

           group by 后的列 如果有多个,这些列查出来的一行是中 group by后的列名组合起来是唯一的,一定是唯一的,所以如果select后的非聚合函数列

如果不和group by 保持一致,得出的数据不一定是唯一的,所以会造成数据的出错。

为了方便不出错,group by 后面的和 select后面的保持一致。
select  department_id,job_id, sum(salary) from  employees  group by  department_id ,job_id order by department_id;

DEPARTMENT_ID JOB_ID     SUM(SALARY)
------------- ---------- -----------10 AD_ASST           440020 MK_MAN           1300020 MK_REP            600030 PU_CLERK         1390030 PU_MAN           1100040 HR_REP            650050 SH_CLERK         6430050 ST_CLERK         5570050 ST_MAN           3640060 IT_PROG          2880070 PR_REP           10000DEPARTMENT_ID JOB_ID     SUM(SALARY)
------------- ---------- -----------80 SA_MAN           6100080 SA_REP          24350090 AD_PRES          2400090 AD_VP            34000100 FI_ACCOUNT       39600100 FI_MGR           12000110 AC_ACCOUNT        8300110 AC_MGR           12000SA_REP            7000已选择20行。 


以上结果中:拿出一个分组进行分析:

          100 FI_ACCOUNT       39600100 FI_MGR           12000
这个  100 FI_ACCOUNT 和 100  FI_MGR是唯一的。

如果  只按照department_id分组, 这两个数据一定是和在一起的,为: 100 51600 求和 也是求着两个的和,如果再按照 job_id分组,相当于 在部门为100的部门中,job_id不同的有哪些,就是100部门的人都做那些不同的工作, 这样就要在 部门号为100的部门中 按照 job_id分组,就显示了以上的分组结果:

因为 select 后面的的聚合函数执行在 group by 语句后面,即 在分组后再进行聚合函数计算,所以sum(salary) 聚合函数计算的是group by后的结果,

即 部门号为100 做 FI_ACCOUNT工作的人的工资总数为 39600;

group by后面的列数越多,分组越细,不管怎么分,聚合函数一定在分组后计算,having一定在聚合函数后计算,order by一定在 having后排序。这个执行顺序是不变的。

注意: group by后面的顺序不同,表示的意义也相同,不过由于都是表示唯一的分组情况,所以 颠倒顺序行数还是一样的。
如把  job_id 和 department_id的顺序颠倒一下,其实还是一样的,都是这么多唯一的数据。

SQL> select  job_id, department_id, sum(salary) from  employees  group by  job_i
d , department_id order by department_id;JOB_ID     DEPARTMENT_ID SUM(SALARY)
---------- ------------- -----------
AD_ASST               10        4400
MK_MAN                20       13000
MK_REP                20        6000
PU_CLERK              30       13900
PU_MAN                30       11000
HR_REP                40        6500
SH_CLERK              50       64300
ST_CLERK              50       55700
ST_MAN                50       36400
IT_PROG               60       28800
PR_REP                70       10000JOB_ID     DEPARTMENT_ID SUM(SALARY)
---------- ------------- -----------
SA_MAN                80       61000
SA_REP                80      243500
AD_PRES               90       24000
AD_VP                 90       34000
FI_ACCOUNT           100       39600
FI_MGR               100       12000
AC_ACCOUNT           110        8300
AC_MGR               110       12000
SA_REP                          7000已选择20行。


select column,group_function from  table
[where condition]
[group by group_by_expression]
[having group_function]
order by  column
执行顺序,先执行where之句,再执行 group by子句,再执行 select 后的group_function
再执行 having 顺序,,最后再执行order by  这是这个语句的执行顺序。
where语句是不能包括 group_function的  因为 先执行where。



http://chatgpt.dhexx.cn/article/M1em3ovI.shtml

相关文章

一、快速入门 MongoDB 数据库

文章目录 一、NoSQL 是什么1.1 NoSQL 简史1.2 NoSQL 的种类及其特性1.3 NoSQL 特点1.4 NoSQL 的优缺点1.5 NoSQL 与 SQL 数据库的比较 二、MongoDB 基础知识2.1 MongoDB 是什么2.2 MongoDB 的体系结构2.3 MongoDB 的特点2.4 MongoDB 键特性2.5 MongoDB 的核心服务和工具2.6 Mon…

数据库总结(考研复试和期末复习皆可用)

数据库总结 点击下载该文档 密码:cqoq 本人自制了简答题的速记卡片 地址,大家可以参考使用。[下载Markji App 使用] 第一章 绪论 1.1 数据库系统概述 数据库管理系统(DBMS)的功能: 数据定义功能数据组织、存储和管理数据库操纵功能数据库的事务和运行…

一步步教你轻松学KNN模型算法

一步步教你轻松学KNN模型算法 ( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用。本文通过一个模拟的实际案例进行讲解。整个流程包括:采集数据、数据格式化处理、数据分析、数…

Oracle实战详解

Oracle实战详解 1.oracle介绍 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORA…

数据库|SQL / MySQL的基本理论用法

本文从数据库MySQL的数据类型、关系模型、增删改查语句、管理MySQL、实用SQL语句、事务等方面进行介绍。 数据类型 对于一个关系表,除了定义每一列的名称外,还需要定义每一列的数据类型。关系数据库支持的标准数据类型包括数值、字符串、时间等&#xf…

KNN模型算法研究与案例分析

KNN模型算法研究与案例分析( 白宁超 2018年8月29日15:39:13 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用。本文通过一个模拟的实际案例进行讲解。整个流程包括:采集数据、数据格式化处理、数据分析、数据归…

SQL总结

目录 简介 在Android中存储数据有时会用到数据库,Android给我们提供了 一系列的API来操作数据库,非常简单,我们只需要输入对应的SQL语句,甚至不懂SQL语句,只传入对应的参数即可使用。还有一些第三方库,如G…

Windows开机启动项设置详解

一、开机启动原理 Windows系统都有一个“启动”文件夹,把需要打开的程序的快捷方式或脚本放到“启动”文件夹里,就可以实现开机自启动。 启动”文件夹分为两种:“系统启动文件夹”和“用户启动文件夹”。 系统启动文件夹 Win10系统“启动”…

「C#」设置开机启动

自己写了个监控键盘按键的小程序。 在界面上实时显示按下的键,但是想实现程序的开机自启如何实现呢。 开机自启动一种是在windows的“C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup”家快捷方式。但是这种方法自测有时候不成功。…

centos7 设置开机启动项

高端的废话就是没有引言这种废话。 1.这里我已我的centos7为例输入: systemctl list-unit-files #查看开机启动表如图下: 最左边就是服务 ,最右边就是状态 。如当你想要服务器开机启动firewalld(防火墙)输入 system…

计算机怎么管理自启,电脑如何设置开机启动项

大家都知道将程序添加到开机启动项进入系统就可以自动打开了,但是有些流氓软件会强制进入开机启动项,这就导致电脑开机速度变慢,内存占用过多,运行卡顿的问题。下面,我就教大家如何设置开机启动 现在几乎家家户户都配备…

电脑设置开机

我们知道电脑可以通过修改系统任务计划来实现定时关机的功能,那么,能不能让电脑实现自动开机的功能呢?答案是可以的,我们可以通过BIOS设置,指定电脑在某个时间点自动开机,接下来,小编来介绍一下如何通过BI…

nginx 设置开机自启动

一、下载 在windows下实现开机自启动需要一个开源项目Windows Service Wrapper 来实现。 我用的是这个版本。 下载下来,放在Nginx根目录下 下载下来,放在Nginx根目录下,名字改为start-nginx.exe,再新建一个txt文件&#xff0c…

Win11开机启动项怎么调整,Win11开机启动项怎么设置

Win11开机启动项怎么调整?Win11开机启动项怎么设置?现在很多应用或软件下载安装之后默认都是开机自启的,如果开机自启的软件多了的话难免会导致系统开机速度变慢。最近有使用win11系统的小伙伴就遇到了这个问题,有网友想了解怎么设…

windows设置开机启动程序

1.新建文件,填写路径 echo off cd F:\程序路径\ //后面填写3D所在的路径 F: //程序的个盘符 run.bat把这个文件填写完成后,改个名字,后缀改为bat,并把这个文件放在机房的程序目录下 2.设置开机计划任务 windows 7 在【开始】菜单中,输入【任务计划】&#xf…

计算机软件自启动设置,设置开机启动项,详细教您电脑如何设置开机启动项

身边不少朋友买了电脑都在比拼电脑开机速度,一般新电脑开机启动时间保持在30s左右就已经很不错了,不过不少朋友电脑开机时间需要1分多钟,不少朋友的答案的设置开机启动项目,尽量减少程序开机启动,那么如何优化提升电脑…

Windows 三种开机自启动的设置方式(全面)

一、修改注册表的方式 进入注册表,点击任务栏开始,输入regedit.exe,进入[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]位置后,新建一个二进制字符类型的项,数值数据位置填入所需开机自启动的应…

linux设置开机启动脚本的3种方法

Linux 下设置开机启动的三种简单但可行的开机启动设置方法。 方法一:修改 /etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话,可以将自己脚本路径加到该文件里…

Win11怎么设置开机启动项?

我们在使用电脑的时候经常会打开非常多的软件,而每次开机都需要手动去点击,就会变得非常的麻烦,那么在Win11操作系统中我们应该怎么设置呢?其实方法非常简单,下面小编就带着大家一起看看吧! 操作方法&#…

WebLogic RMI 反序列化漏洞

文章目录 WebLogic RMI 反序列化基础知识影响版本漏洞概述漏洞危害漏洞复现目标机搭建漏洞环境漏洞验证端口探测 漏洞检测脚本在kali上运行命令下载反序列化漏洞利用工具 ysoserial启动 JRMPListener server执行反弹shell命令 使用python脚本发送payload下载 exploit脚本脚本执…