暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《SQL基础教程》学习笔记

SQL数据库开发 2019-11-22
1547

点击上方SQL数据库开发,关注获取SQL视频教程


SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

1.数据库和SQL

RDBMS:关系数据库管理系统

比较代表性的有:Oracle(甲骨文)、SQL Server(微软)、DB2(IBM),Postgres(开源)、MySQL(开源)

数据库由表示数据项目的列(字段)和表示行的(记录)所组成,行和列的交汇的方格是单元格,关系数据库以行为单位读取数据

SQL概要

sql通过一条语句来描述想要进行的操作,发送给RDBMS,原则上使用分号结尾

根据目的可以分为:DDL、DML、DCL

SQL语句及其种类

SQL用关键字、表名、列名等组合一条语句(SQL语句)来描述内容

DDL:数据定义语言(用来创建或者删除存储数据用的数据库以及数据库中的表等对象)

以下指令:create、drop、alter

DML数据操纵语言(用来查询或者变更表中的记录)

用户操作增删改查(insert、delete、update、select)

DCL:数据控制语言(用来确认或取消数据库中的数据进行变更以及对RDBMS的用户是否有权限操作数据库进行设定)

commit:确认对数据库中的数据进行变更

rollback:取消对数据库中的数据进行变更

grant:赋予用户权限

revoke:取消用户的操作权限

SQL的基本书写规则

以";"结尾,关键字不区分大小写,字符串和日期需要用单引号括起来,数字常数不用


1.1 表的创建

通过create table语句创建而成
指定列的数据类型(整数型,字符型,日期型)
可以在表中设置约束
在同一数据库中不能创建两个相同名称的表
数据类型表示数据的种类,每一列不能存储与该列数据类型不符的数据(INTERGER:数字型,CHAR:定长字符型(未达到最大长度时空格补足),VARCHAR:可变长字符串,DATE:日期型)
约束设置:约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能 NOT NULL(非空),PRIMARY KEY(主键)


1.2表的删除和更新

用DROP TABLE语句来删除

drop table <表名> -- 删除表是无法恢复的

用ALTER TABLE 语句向表中添加列或者删除列

alter table <表名> add column <列的定义>;  --添加
alter table <表名> drop column <列名>; --删除


2 查询基础

列的查询,从表查询使用的是SELECT语句;select列举了想查询表的名称,from制定了选取数据表的名称;用as指定别名,中文用双引号包括;
-- 删除重复的数据行用distinct,只能写在第一个列名前
select distinct 列名 from 表名;


-- where语句来选择记录过滤条件
select <列名> from <表名> where <条件表达式>;

-- 注释有两种一种是单行的"--",第二个是多行的"/*""*/"之间,可以跨多行,并且可以写在select语句中

/* 比较运算符 四则运算(可以在select语句中使用) null(所有包含null的运算都是null) 比较运算符
"1","2","3","10","11","222",按照大小顺序,分别是:
"1","10","11","2","222","3",因为是字符串,类比章节1-1,2,3-10,4-1 */


逻辑运算符
AND运算符 优于 OR运算符 A AND B OR C --先执行AB再执行C 如果想执行AB或者C的结果,需要加一个括号,即 A AND (B OR C)
-- 逻辑积(x)和逻辑和(+),将真变为1,假变为0

--SQL中存在既不是真也不是假的第三值就是----不确定(三值逻辑)


3 聚合与排序

3.1聚合查询

-- 使用聚合函数对表中列进行计算合计值、平均值等的汇总操作;
-- 除了count函数外的聚合函数可以进行对NULL以外的对象进行汇总;count可以查出包括null在内的所有的行;
count:计算表中的行数
SUM列中数据的合计值
AVG列中数据的平均值
MAX列中数据的最大值
MIN列中数据的最小值
-- 用于汇总的函数称为聚合函数,聚合就是多行汇聚成一行,所有的聚合函数都是输入一行输出一行
-- maxmin函数几乎适用于所有数据类型的列,sumavg只适用与数值型的列

-- 使用聚合函数删除重复值(distinct)

select count(distinct product_type) from Product;


3.2 对表进行分组

使用group by 进行分组

select <列名><列名2><列名3>....

from <表名>

where 条件

group by <列名>,<列名2>,<列名3>

-- group by写在from语句之后(如果有where子句写在where子句后),先根据where子句指定条件过滤再汇总
select from where group by 书写顺序
from where group by select 执行顺序

使用group by子句时,select子句中不能出现聚合函数之外的列名
group by子句中不能使用select子句定义的别名
group by子句显示的是无序的
只有select子句和having子句(以及order by)能够使用聚合函数
与聚合函数Group by子句有关的常见错误
只能写在字句中
group by子句中不能使用select子句中列的别名,因为select执行在group by之后,所以select中定义的别名无法识别
结果是无序的
where子句中不能使用聚合函数


3.3为聚合结果指定条件

where 子句用来指定数据行的条件,having子句用来指定分组的条件

select  from where  group by  having  -- 书写顺序


having子句能够使用的3种要素

  • 常数

  • 聚合函数

  • group by 子句中指定的列名(聚合键)

where子句 = 指定行所对应的条件

having子句 = 指定组所对应的条件

聚合键所对应的条件应该写在where中,而不是having


3.4 对查询结果进行排序

select <列名1>,<列名2>,<列名3>...

from <表名>

order by <排序基准1>,<排序基准2>....

select from where group by having order by --书写顺序
from where group by having select order by --执行顺序

本来select结果是无序的,用order by子句对结果进行排序,用asc进行升序,desc进行降序,默认升序;
order by可用select子句定义列的别名,因为select执行顺序在order by之前,select中别名可以被识别
可以使用select子句中未使用的列或者聚合函数
在order by子句中不要使用编号
指定多个排序键,并且可以同时指定不同的排序顺序,排序的列中含有NULL值时,不能对null使用比较运算符,null值会在结果的开头或者结尾显示.


4 数据更新

4.1 数据的插入

使用insert向表中插入数据,原则上,每次执行一次数据的插入
(列名,值)这种形式称为清单
可以为表中的列设置默认值,可以在create时设置default约束设定
插入值默认值可以通过两种是方式,在insert语句的values子句中指定default关键字(显示方法),或省略列清单(隐式方法)

insert into <表名> (1,列2,列3...)

values (1,值1,值3...)

insert into Product (product_id,product_name,product_type,sale_price,purchase_price,regist_date)

values ('0001','T恤衫','衣服',1000,500,'2009-09-20');

多行插入需要将多条values子句通过逗号进行分隔排列

向表中某一列赋予null值,可以直接在值清单中对应位置,但是该列不能设置not null约束

插入默认值有两种方式,显式和隐式

-- 显式  建议使用显式,可以清楚知道该列是使用了默认值

insert into Product (product_id,product_name,product_type,sale_price,purchase_price,regist_date)

values ('0001','T恤衫','衣服',default,500,'2009-09-20');

-- 隐式 将设置了默认值的列清单和值清单中该列省略即可

insert into Product (product_id,product_name,product_type,purchase_price,regist_date)

values ('0001','T恤衫','衣服',500,'2009-09-20');

如果在清单中省略了没有设置默认值的列,该列的值就会被设定为null,因此如果省略的是设置了not null的列,insert就会出错,

从其他地方复制数据

除了使用value子句指定具体的数据,还可以从其他表中复制数据,首先建立一个和Product表结构相同的表ProductCopy

insert into ProductCopy (product_id,product_name,product_type,sale_price,purchase_price,regist_date)

select product_id,product_name,product_type,sale_price,purchase_price,regist_date

from Product --不会对原结构有影响,相当于进行了备份


4.2 数据的删除

如果想删除整个表,使用drop table语句,如果想删除表中数据,用delete,

drop table语句和delete语句

删除数据可以将表完全删除、

delete语句会留下表(容器),而删除表中全部数据

delete from <表名>;  --保留数据表,仅仅删除全部数据,delete删除对象并不是表或者列,而是记录(行)

指定删除对象的delete语句(搜索型delete)

delete from <表名> where <条件>;  --delete中只用where,不用group byhavingorder by
delete from Product where sale_price >=4000; --通过where子句指定对象条件来删除部分数据
select * from Product; --使用该句进行确认

删除和舍弃

标准sql中从表中删除数据的只有delete,还有数据库产品还存在truncate的语句,truncate是舍弃的意思

truncate <表名>; --delete不同的是,truncate只能删除表中的全部数据,不能删除部分数据,处理速度比delete


4.3 数据的更新

使用update语句个亿更改表中数据

update <表名> set <列名> = <表达式>;
update Product set registe_date = '2009-10-10';

搜索型update

update <表名> set <列名> = <表达式> where <条件>;

update Product set sale_price = sale_price *10

where product_type = '厨房用具'

使用update语句可以将值清空为null(仅限于未设置not null约束的列)

--多列更新
1
update Product
set sale_price = sale_price *10
purchase_price = purchase_price/2
where product_type = '厨房用具'

2
update Product
set (sale_price,purchase_price) = (sale_price *10purchase_price/2)
where product_type = '厨房用具'
-- 需要注意点但是第一种方法在所有的DBMS中是通用的,第二种将列清单化在某些DBMS中是不通用的


4.4 事务

事务需要在同一个处理单元中执行的一系列更新处理的集合,通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理

事务处理的终止指令包括commit(提交处理)和rollback(取消处理)

事务的四大特性:原子性、一致性、隔离性、持久性

-- 事务开始语句
--SQL ServerPostgreSQL
begin transaction
-- MySQL
start transaction
--OracleDB2


--结束事务只有commit rollback两种
-- MySQL
start transaction;
update Product
purchase_price = purchase_price/2
where product_type = '客厅用具'
update Product
set sale_price = sale_price *10
where product_type = '厨房用具'
commit;

结束事务的指令:
commit是提交事务包含的全部更新处理的结束指令,相当于文件处理的覆盖保存,一旦提交,无法恢复到处理事务开始的前的状态,commit = 直线进行,万一误操作,只能重新建表,重新插入数据
rollback取消处理是取消事务包含的全部更新处理的结束指令,相当于放弃保存,一旦回滚,数据库就会恢复到事务开始前的状态,rollback = 掉头回到起点
ACID特性
原子性(Atomicity)
指事务结束的时候,其中包含的更新处理要么全部执行,要么完全不执行
一致性(Consistency)
是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者not null约束,也称为完整性
隔离性(Isolation)
保证各个事务间互不干扰的特性。该特性保证了了事务之间不会互相嵌套,另外在某个事务中进行的更改,在该事务 结束之前,对其他事务而言是不可见的。
持久性(Durability)
指的是事务结束之后DBMS能够保证该时间点的数据状态会被保存的特性,即使由于数据故障导致数据丢失,数据库也一定能通过某种手段进行恢复,最常见的是通过日志恢复到故障发生前的状态。

——End——

关注SQL数据库开发公众号,在后台回复关键字:资料领取,可以获取一份精心整理的技术干货。

推荐阅读

点击「阅读原文」了解SQL训练营

最后修改时间:2019-11-22 09:30:45
文章转载自SQL数据库开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论