数据库学习笔记 (一)——SQL


https://blog.csdn.net/m0_50546016/article/details/120070003


一、❤ 数据库及SQL介绍 ❤

在这里插入图片描述
不区分大小写

1、SQL 分类
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。

⭐ 数据查询语言(DQL: Data Query Language)

⭐ 数据操纵语言(DML:Data Manipulation Language)

  • 数据定义语言(DDL)
  • 数据控制语言 (DCL):权限

2、SQL 作用
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。

SQL 面向数据库执行查询
SQL 可从数据库回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限

** 3、数据库是什么 **
数据库是什么——顾名思义,你可以理解为数据库是用来存放数据的一个容器。
DB+DBMS 存放+管理
数据库是存放数据的地方。正是因为有了数据库后,我们可以直接查找数据。例如你每天使用余额宝查看自己的账户收益,就是从数据库读取数据后给你的;图书馆

最常见的数据库类型是关系型数据库管理系统(RDBMS):
40*40

RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access等等。
RDBMS 中的数据存储在被称为(tables)的数据库对象中。表 是相关的数据项的集合,它由列和行组成。

  • 非关系型数据库(NoSQL)
  • 关系型数据库(SQL结构化查询语言作为DDL和DML) > 二维表
    ( 底层相似)
  • 分布式数据库
    Oracle 、MySQL、SQL server区别

4、几种常见客户端 Oracle

  • SQL*PLUS
  • PL/SQL Developer(第三方软件) > 仿Oracle SQL Developer(不如PL)
  • Navicat (第三方软件)(Oracle+MySQL)

scott用户介绍

Oracle数据库 ——scott用户(4张表)
在这里插入图片描述

  • orcl是Oracle数据库的默认实例,sys高级权限,拥有数据库对象(表、视图、索引…)

在这里插入图片描述

  • text连接名;scott用户名;localhost地址;orcl用户实例名
  • orcl与text是同一个数据库实例故为同一个数据库,但两者用户不同,权限不同,看到的表不同。在这里插入图片描述
  • scott的四张表
    因为命名不合现在的规范,不易见名知意,出现新用户hr
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


二、🌙 DQL 🌙

(Oracle)
在这里插入图片描述

1. 单表查询

🐦行过滤(select xxx from xxx where)

 select columeName1,columeName2… from tableName where…
寻找符合条件的记录eg:取出符合xxx条件的人
①表达式

参考Java中的表达式,算数运算符、逻辑运算符、赋值运算符…

- 关键字
   between and等价于<= =>
- 逻辑运算符  and  or  not
- 空         is null  和 is  not null
- in替代or(多表查询)
/*查询公司中工资大于1000的人,输出他们的姓名和工资*/
select ename,sal from emp where sal>=1000;

select ename,sal from emp where sal>=1000 and sal<=1500;
select ename,sal from emp where sal between 1000 and 1500;
/* between and等价于<= => 
输出工资大于等于1000且小于等于1500的人*/

select ename, comm from emp where comm is not null;
/* 查询公司中有奖金的人即奖金不为空,并输出姓名和奖金 
注意:有无奖金 和 奖金为0 是不一样的
*/

空

②模糊查询 like 占位符 _ %
占位符: _ ——指一个字符; %——指任意多个字符(0到无穷)
select ename from emp where ename like '%m%';
/* 查询名字中含有m的人,可以是%m、m%、%m%、m 
查询结果应为空
*/
select ename from emp where ename like '%M%';

select ename from emp where ename like '_M%';
/* 查询名字中第二个字母是m的人*/

结果1
姓名
由图可知,所有成员的姓名中含有m的有SMITH,但要注意其中的M为大写。
结果2

列名不区分大小写,全为大写;但是内容即数据区分大小写

🐒列过滤(select xxx from xxx)

select columeName from tableName;
只要某一属性 eg:取出所有的姓名
select * from emp;
/*    查询表emp中所有的列,其中*表示所有   */

select ename from emp;
/* 查询表emp中列名为ename的列  */

select ename ,empno from emp;
/* 查询表emp中列名为ename和empno的列 ,查询多个列时用‘,’隔开
显示时按列名顺序显示
 */
①别名 as
as “ ”(可省略as “ ”,当别名中存在空格必须加“ ”)
双引号——字符串,存在大小写;无双引号时,全为大写,不区分大小写。

列名双引号,字符串双引号,与java中不同

select ename as “姓名” ,empno from emp;
select ename 姓名,empno from emp;
select ename “姓  名” ,empno from emp;
②查询中可以存在表达式
select ename , sal*12 as “nian xin” from emp;
/*  查询 姓名和年薪nian xin=月薪*12 */
③ 拼接字符串 ||
- Java中用+拼接字符串,SQL中用或(||)
select ename||'job is'||job from emp;
/* 查询ename拼接字符串job is拼接job ,注意字符串单引号,列名双引号 */

在这里插入图片描述

④去重 distinct
select job from emp;
/*例如查询公司的工种,这样写会全部列出,有重复*/
select distinct job from emp;
/* 去重 */

🐢排序 (order by asc/desc)

-	对查询结果按一定的顺序排序输出
- 	asc(默认)由小到大
	desc 由大到小
/* 取出工资大于等于1000的雇员, 并对工资由高到低排序输出*/
select sname , sal from emp where sal>= 1000 order by sal desc;
select sname , sal from emp where sal>= 1000 order by sal desc,comm desc;
/* 多个条件排序,满足前一个再完成第二个条件 */

🐅系统函数

Oracle单行函数 多行函数

(1)单行函数
将每条数据进行独立的计算,然后每条数据得到一条结果。

1. 特点
① 不改变真实数据,只是对数据做了进一步修饰或者处理显示。
② 可以和字段混合使用

2. 使用

 select 字段名, 函数名(字段名),字段名....from 表名

3. 分类
字符串—— INITCAP(char) LOWER(char) UPPER(char) REPLACE(char , search_str , replace_str) INSTR(char,substr[,pos]) SUBSTR(char , pos ,len ) CONCAT(char1 , char2 )
数值 —— ABS(n) CEIL(n) FLOOR(n) MOD(m,n) ROUND(m,n) TRUNC(m,n)
日期 ——MONTHS_BETWEEN ADD_MONTHS NEXT_DAY LAST_DAY (各个数据库不同)
转换 —— 类型之间进行转换的函数
to_char() to_date() to_number()
通用 :字符串、数值、日期都可以使用的函数

select instr('hsdhdhs','d') from dual;//3
select instr('hsdhdhs','d',4) from dual;//5

select sysdate from dual;
select ename , hiredate ,sysdate-hiredate from emp;//日期差=工作天数
select round(sysdate , 'year') from emp;//少

select extract(year from sysdate) from dual;//返回日期的年
select extract(month from sysdate) from dual;//返回日期的月

select to_char(sysdate,'yyyy.mm.dd.hh24:mi:ss  dy') from dual;
select to_date('2022-2-18','yyyy-mm-dd')from dual;
……
 注意: dual代表虚拟表是空表 ,常用于查询系统日期sysdate
 		SUBSTR与Java中区分
(2)多行函数
多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数, 主要用于完成一些统计功能。(组函数)
 一般分组后使用组函数,但组函数不一定分组后才能使用即对所有记录都调用
 (max,min,avg,sum,count)很重要

1. 作用:对查询的数据进行统计
2. 使用

select 多行函数名(字段名),多行函数名(字段名)..from 表名
select sal*12+nvl(comm,0) ,sal*12 from emp;
select count(sal) from emp;

注意:多行函数不能和普通字段以及单行函数混用,除非分组
–max(字段名) 返回该字段的最大值
–min(字段名) 返回该字段的最小值
–sum(字段名) 返回该字段的和
–avg(字段名) 返回该字段的平均值
–count
–count(*) 返回表的记录数
–count(字段名) 返回非空值的数量
–count(distinct 字段名) 去除重复后的字段值的数量
在这里插入图片描述

🐘分组 group by having —— 组函数

分组,用组函数进行统记运算

	1.    select xxx from xxxx group by xxxxx ;
	2.    having 对分组后的数据进行过滤
	       select xxx from xxxx where ① group by ② having ③;   先①where行过滤,后②进行分组,最后③分组后having过滤
常见错误

group by 分组后 过滤列处只能有两样东西——组函数、分组条件
select count(sal) ,deptno ,job from emp group by deptno;

select count(sal) ,deptno  from emp group by deptno;//查每个部门的员工数
select count(sal) ,deptno , max(sal) from emp group by deptno;//查每个部门的员工数及最大工资
//select count(sal) ,deptno ,job   from emp group by deptno;
select count(sal) ,deptno , max(sal) , job from emp group by deptno ,job order by deptno;//查不同部门不同工种的员工数及最大工资,按部门号排序

在这里插入图片描述

select count(sal) ,deptno , avg(sal) from emp where mgr is not null group by deptno order by deptno;
//除boss以外的其余员工,不同部门的平均工资和人数,按部门号排序
select count(sal) ,deptno , avg(sal) from emp where mgr is not null group by deptno having avg(sal)<2000 order by deptno;
//除boss以外的其余员工,平均工资小于两千的不同部门的平均工资与人数,按部门号排序

在这里插入图片描述在这里插入图片描述

🐕SQL执行顺序 重要

【面试涉及】

  1. from 表
  2. join
  3. on
  4. where 过滤行
  5. group by(开始使用select中的别名,后面的语句中都可使用)——组函数
  6. having 分组后过滤
  7. select 过滤列
  8. distinct 去重
  9. order by 排序
  10. limit

2. 多表查询

Java程序中的类对应着数据库中的实体表,类与类之间存在关系(5种),实际上表与表之间也存在关系。往往多表操作,需要多表查询。
	子查询与表连接通常混合使用,子查询都是同一个表中的结果 ,表连接时多个表中的

(1) 表连接——查询结果集重点列是多个表中的记录

① 内连接(最常用) 没有主从inner join on,可以省略
等值 = and 自连接
/* 查询雇员和所在部门的信息 → 等值内连接*/
select ename,dname from emp  inner join dept  on emp.depno = dept.deptno;//基本写法
select ename ,dname from emp e inner join dept d on e.depno = d.deptno;//别名 简化
select ename ,dname from emp e ,dept d where e.depno = d.deptno;//简化
select ename ,dname ,e.deptno from emp e ,dept d where e.depno = d.deptno;//deptno出现在两个表中,不可知查询哪个需要表明

//当主键与外键名相同时on可以替换为using
select ename ,dname from emp e inner join dept d using(deptno);//on 简化
/*  查询雇员和他的leader的名字 → 自连接*/
select ename as employee ,ename as leader from emp e,emp l where e.mgr = l.empno;//少一个员工如何解决?
非等值 < >
/* 查询雇员的名字和他的工资级别 → 非等值内连接 */
select ename ,grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal; 

select ename ,grade from emp e ,salgrade s where e.sal between s.losal and s.hisal; //简化
② 外连接 有主从 left/right outer join on ,outer可以省略

以所有形容的关键字为主表
Oracle中可以用(+)指定主表,但是MySQL不支持

左外连

主表在左,左外连

右外连

主表在右,右外连

全连接→ MySQL不支持full join,Oracle支持

支持时,会出现15条记录(包括没有部门的雇员、没有雇员的部门)

/*  查询雇员和他的leader的名字 */
select ename as employee ,ename as leader from emp e,emp l where e.mgr = l.empno;//少一个员工如何解决?没有无部门的雇员信息———— 解决方法如下
/* 查询所有的部门和该部门的员工信息 → 左外连 */
select ename ,dname ,d.deptno from dept d left outer join emp e on e.deptno =d.deptno;

/* 查询所有的雇员和该雇员所在部门的信息 → 右外连 */
select ename ,dname ,d.deptno from dept d right outer join emp e on e.deptno =d.deptno;//无雇员的部门同样显示

外连接选择方法:

在这里插入图片描述

③ 自然连接

(2)子查询——查询结果集中的列是一个表中的记录

子查询的本质:多个select语句的嵌套 ,先执行括号内的select, 后执行括号外的

① 单行子查询 = < >(最常用)

记录条数单行

/* 查询和SMITH相同部门的雇员信息
select * from emp where//外
select deptno from emp where ename = 'SMITH'//内
 */
select * from emp where deptno=select deptno from emp where ename = 'SMITH';


/* 查询工资高于scott的雇员信息 */
select * from emp where sal > (select sal from emp where ename = 'scott');
② 多行子查询 in any> all<

记录条数多行

/* 大于销售部所有员工工资的雇员信息 
select sal from emp where deptno=30
select * from emp where sal > all(select sal from emp where deptno=30)
*/
select * from emp where sal > all(select sal from emp where deptno=30)//让每个员工与销售部的每个员工工资进行比较【多行】
select * from emp where sal > (select max(sal) from emp where deptno=30)//让每个员工与销售部中员工工资最大的人比较,员工越多性能更高【单行】
/* 查询与20号部门员工工资相同的其他部门员工的信息 */
select * from emp where sal in(select sal from emp where deptno=20and deptno <> 20;
③ 子查询作为查询表

子查询可以放在where后,可以放在from后面,也可以放在select后面。
放在select后面相当于表连接。(for() 等价于where(true))

三. ⭐ DML ⭐

数据操纵语言

1.插入 insert into values / select

  • 单行插入:insert into tableName [(columeName)] valuesvalue1, value2);
    关键字
    斜体即可输入内容
    表名,非关键字
    [ ]可选,列名,如果省略columeName后面的值需要按表依次填入,必须与表中列数一致 ,为空则填入null,列数少时可以省略,一般不要省略
  • 多行插入:insert into tableName [(columeName)] select
    把一个表中的记录查出,加入到另一个表

2.修改 update set where

  • update tableName set columeName1 = value1 ,columeName2= value2…[where…]
    1. 可修改任意值用‘,’隔开
    2.where子句可选可不选,但在实际中应该都有

3.删除 delete from where

  • delete from tableName [where…];
    where子句可选可不选,但在实际中应该都有

四、🌼 DDL + DCL了解 🌼

不用语句实现

(一)DDL —— CREAT、DROP、ALTER

数据定义语言,对数据库的对象进行增删改等操作
CREAT 创建 —— create table 注意列类型不同数据库是不一样的
DROP 删除 —— drop table
ALTER 修改 —— i. 修改 表 ii. 修改 列----列的增删改

操作语句
创建表create table 表名(列名 列类型,列名 列类型,列名 列类型,…,列名 列类型);
删除表drop table 表名
修改表之添加列alter table 表名 add(列名 列类型,列名 列类型,列名 列类型,…,列名 列类型);
修改表之修改列类型alter table 表名 modify 列名 修改的列类型;
修改表之改列名alter table 表名 change 原列名 新列名 列类型;
修改表之删除列alter table 表名 drop 列名;
修改表之修改表名称alter table 原表名 rename to 新表名;

(二)DCL 权限、事物 —— create、grant、revoke

数据控制语言,用来授予或回收访问数据库的某种特权(权限)+并控制数据库操纵事务发生的时间及效果,对数据库实行监视等【TCL】 。

  1. 权限控制
    ① 首先使用DDL新建用户
**create user** "cy1212" @ "localhost";

② DCL赋予权限(grant)和取消权限(revoke

//将CY1212中的查看权限授予(to)“cy1212”,*代表所有权限
grant select on CY1212 .* to "cy1212";
//从CY1212中回收cy1212的查询权限(在root下进行)
revoke select on CY1212 .* from "cy1212"; 
  1. 事务操作
    事务操作,现在很少在数据库中写过程函数,多将过程函数中的业务放在程序中,在代码中实现。
  • COMMIT 提交
  • SAVEPOINT 保存点
  • ROLLBACK 回滚
  • SET TRANSACTION 设置当前事务的特性,它对后面的事务没有影响

四. 参考
https://blog.csdn.net/m0_50546016/article/details/120070003
https://blog.csdn.net/weixin_45630258/article/details/121571385

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值