(数据库定义语言)用来创建或删除存储数据用的数据库以及数据库中的表对象。
CREATE:创建数据库和表等对象
DROp:删除数据库和表等对象
ALTER:修改数据库备表等对象的结构
(数据操纵语言)用来查询或者变更表中的记录
SELECT:查询表中的数据
INSERT:向表中插入新的数据
UPDATE:更新表中的数据
DELETE:删除表中的数据
(数据控制语言)用来确认和取消对数据库中的数据进行的变更,对RDBMS的用户是否有权限操作数据库中的对象进行设定
COMMIT:确认对数据库中的数据进行的变更
ROLLBACK:取消对数据库中的数据进行的变更
GRANT:赋予用户操作权限
REVOKE:取消用户的操作权限
CREATE TABLE product ( id char(4) not null, name VARCHAr(100) not null, type VARCHAr(32) not null, sale_price INTEGER , purchase_price INTEGER , regist_date INTEGER , PRIMARY KEY (id) );
CREATE DATAbase shop
删除表
DROP TABLE <表名>
添加列
ALTER TABLE <表名> ADD COLUMN <列的定义>
删除列
ALTER TABLE <表名> DROP COLUMN<列名>
修改表名
RENAME TABLE <变更前的名称> to <变更后的名称>
查询所有的列
SELECT * FROM <表名>
为列设置别名
SELECt product_id AS id,
prorduct_name AS name
from product
为列设置中文别名
SELECt product_id AS "商品编号",
prorduct_name AS "商品名称"
from product
从结果中删除重复行(distinct 只能用在第一个列名之前)
select distinct product_id from product
where查询
select product_name from product where product_type = ‘衣服’
注意:
与null有关的计算结果全部是null
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆
不能对null使用比较运算符
SQL语句使用算术表达式(将价格*2并列出来)
select product_name,sale_price,sale_price *2 AS “sale_price_*2” from product
比较运算符(<>不等于,=等于,>=大于等于)
select product_name ,product_type from product where sale_price <> 500
专门用来取出为null的SQL语句(非null用IS NOT NULL)
select product_name ,purchase_price from product where purchase_price IS NULL
NOT运算符(无法单独使用,必须和其他查询条件组合使用)
select product_name,product_type,sale_price from product where NOT sale_price >= 1000
AND运算符(两侧的查询条件都成立时才成立)
OR运算符(两侧的查询条件有一个成立时整个查询条件都成立)
通过括号强化处理(查询日期为28号或者29号的办公用品)
select product_name,product_type,regist_data
from product
where product_type = '办公用品'
AND ( regist_date = '2021 -06-28'
OR redist_date='2021-06-29');
常用函数
COUNT:计算表中的记录数(行数)
SUM:计算表中数值列中数据的合计值
AVG:计算表中数值列中数据的平均值
MAX:求出表中任意列中数据的最大值
MIN:求出表中任意列中数据的最小值
计算表中数据的行数
select count(*)from product
计算null之外的数据的行数(返回的结果不包含null)
select count(purchase_price)from product
计算合计值
select sum(sale_price),sum(purchase_price)from product
计算平均值
select avg(sale_price),avg(purchase_price)from product
计算最大值和最小值
select max(sale_price),min(purchase_price)from product
使用聚合函数删除重复值(关键字DISTINCT)
计算去除重复后的数据行数(关键字在里面)
select count(distinct product_type)from product
先清楚重复行再计算数据行数(关键字在外面)
select distinct count(product_type)from product
注意:
聚合键中包含null的情况
执行顺序:
from->where->group by->select
GROUP BY子句(按照商品种类统计数据行数)
select product_type,count(*) from product group by product
使用WHERe子句时的GROUP BY
select purchase_price,count(*)
from product
where product_type='衣服'
group by purchase_price
注意:
WHERe子句只能指定记录(行)的条件,不能用来指定组的条件
HAVINg子句可以对集合指定条件
执行顺序:
select->from->where->group by->having
HAVINg子句 (将商品类型的行数为2的商品类型查询出来(对聚合行数进行运算符比较))
select product_type,count(*)
from product
group by product_type
having count(*)=2;
注意:
ORDER BY 子句必须写在SELECt语句的末尾
使用含有null的列作为排序键时,null会在开头或者末尾进行汇总
在排序键
子句的书写顺序:
select->from->where->group by->having->oorder by
子句的执行顺序:
from->where->group by->having->select->order by
ORDER BY子句(按照销售价格升序排列)
select product_id,product_name,sale_price,purchase_price
from product
order by sale_price
指定升序或降序(ASC升序,DESC降序)
select product_id,product_name,sale_price,purchase_price
from product
order by sale_price DESC
指定多个排序键(但价格相同时,按照id进行升序排序)
select product_id,product_name,sale_price,purchase_price
from product
order by sale_price,product_id
OERDER BY子句中可以使用SELECt子句中未使用的列和聚合函数
select product_name,sale_price,purchase_price
from product
order by product_id
select product_type,count(*)
from product
group by product_type
order by count(*)
对表进行全列INSERT时,可以省略表明后的列清单
insert into product values ('0005','高压锅','厨房用具',6800,5000,'2021-06-28')
插入默认值
1.使用DEFAULT关键字
2.省略需要插入默认值的列,即不向列插入值
从其他表中复制全部数据
insert into <复制到哪个表> (列名)select (现有表的列名,两个格式需要一致) from product
从其他表中复制部分数据(可复制修改过的数据)
insert into <复制到哪个表>(列名)select (列名(与前面格式一致,可使用聚合函数))
from product group by product_type
注意:
DROp TABLE:可以将表完全删除
DELETE:会留下容器,删除表中的全部数据
保留数据表,仅删除全部数据行
delete from <表名>
指定删除对象的delete语句(搜索型DELETE)
delete from<表名>where<条件>
对某一列进行全部修改
UPDATe <表名> SET<列名> = <修改的值>
指定条件的UPDATE语句(搜索型UPDATE)
update <表名>
set<列名> = <修改的值>
where <条件>
多列更新
1.使用都好逗号对列进行分隔排列
update product
set sale_price=sale_price*10,
purchase_price=purchase_price/2
where produce_type='厨房用具'
2.将列用()括起来
update product
set(sale_price=sale_price*10,purchase_price=purchase_price/2)
where produce_type='厨房用具'
原子性:是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行。
一致性:是指事务中包含的处理要满足数据库提前设置好的约束,如:主键约束或者NOT
null约束。
隔离性:是指保证不用事务之间互不干扰的特性。
持久性:是指在事务结束后,能够保存到本地,即永久保存起来。
START TRANSACTION;(开启事务)
需要执行的任务
CONMMIT;(提交事务)
注意:
从SQL的角度来看,视图和表是相同的,两者的区别在于表中保存的是实际的数据,而视图中保存的是select语句(视图本身并不存储数据)
避免在视图的基础上创建视图,多重视图会降低SQL的性能
定义视图时不能使用OEDER BY 子句
视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新
创建视图
create view 视图名称(<视图列名1>,<视图列名2>,<视图列名3>...)
as
<select 语句>
使用视图
select * from 视图名称
删除视图
drop view 视图名称
通俗的理解子查询就是在一个select语句里面查询的是另一个select语句返回的结果(可以多重嵌套)
子查询就是一次性视图(select语句),与视图不同,子查询在select语句执行完毕后就会消失
标量子查询就是只能返回一行一列的子查询
随着子查询的嵌套层数的增加,SQL语句会变得越来越难读懂,性能也会越来越差
子查询(首先执行内层的select语句,然后执行外层的select查询语句)
select product_type,cnt_product
from (
select product_type,count(*) AS cnt_product
from product
group by product_type
)AS productSum
标量子查询的书写位置
1.在select子句中使用标量子查询
select product_id,
product_name,
sale_price,
(select avg(sale_price)from product AS avg_price)--------(标量子查询)
from product
2.在having子句中使用标量子查询
select product_type,avg(sale_price)
from product
group by product_type
having avg(sale_price) >(
select avg(sale_price) from product
)--------(标量子查询)
关联子查询和GROUP BY子句一样,可以对表中的数据进行切分
关联子查询的结合条件一定要写在子查询中
通过关联子查询按照商品种类对平均销售单价进行比较
( 获得的结果是在各自的商品种类里售价高于平均售价的商品)
select product_type,product_name,sale_price
from product AS p1
where sale_price > (select avg(sale_price)
from product AS p2
where p1.product_type = p2.product_type--------(当type相等时,才将当前商品的单价与当前type的平均价格进行比较)
group by product_type)
函数大值分为以下几种
算术函数:用来进行数值计算的函数
字符串函数:用来进行字符串操作的函数
日期函数:用来进行日期操作的函数
转换函数:用来转换数据类型和值的函数
聚合函数:用来进行数据聚合的函数
算术函数
加减乘除
绝对值 ABS(将n列里面的值全部进行绝对值运算,并展示到新一列(别名表示))
select <n>,
ABS(n) AS 别名
from 表名
求余 MOD (计算除法(n/p)的余数)
select n,p,
mod(n,p) AS 别名
from 表名
四舍五入 ROUND (对m列的数值进行n列位数的四舍五入处理)
select m,n,
round(m,n) AS 别名
from 表名
字符串函数
拼接 || (将两个列的字符进行拼接)(可拼接多个,且后面可以跟where子句)
select str1,str2
str1 || str2 AS 别名
from 表名
字符串长度 LENGTH(计算某列的字符串长度)
select str1,
length(str1) AS 别名
from 表名
小写转换 LOWER
select str1,
lower(str1) AS 别名
from 表名
大写转换 UPPER
select str1,
upper(str1) AS 别名
from 表名
字符串替换 REPLACe(对象字符串,替换前的字符串,替换后的字符串) (有可能出现的情况是对象字符串里没有替换前的字符串,这样就不要替换)
select str1,str2,str3,
replace(str1,str2,str3) AS 别名
from 表名
字符串的截取 SUBSTRING (对象字符串 FROM 截取的起始位置 FOR 截取的字符数)
select str1,
substring(str1, FROM 3 FOR 2)AS 别名
from 表名
日期函数
返回当前日期 CURRENT_DATE
select current_date
返回当前时间 CYRRENT_TIME
select current_time
返回当前时间和日期 CURRENT_TIMESTAMP
select current_timestamp
类型转换
类型转换CAST(转换前的值 AS 想要转换的数据类型)
将null转换为其他值 COALESCE(数据1,数据2,数据3...)
谓词就是返回值为真值的函数
LIKE谓词---字符串的部分一致查询
前方一致查询 (查询在某列中前面是ddd的内容)
select * from 表名 where 列名 LIKE 'ddd%'
后方一致查询(查询在某列中后面是ddd的内容)
select * from 表名 where 列名 LIKE '%ddd'
中间一致查询(查询在某列中含有ddd的内容,可以是前面,也可以是后面)
select * from 表名 where 列名 LIKE '%ddd%'
BETWEEN谓词---范围查询(包含范围)
select product_name,sale_price
from product
where sale_price BETWEEN 100 AND 1000
IS NULL,IS NOT NULL ---判断是否为空
select product_name,purchase_price
from product
where purchase_price IS NULL(IS NOT NULL)
IN 谓词
简单使用(查询价格是320,500,1000的商品)
select product_name,purchase_price
from product
where purchase_price IN (320,500,1000)
使用子查询作为IN的参数
select product_name, sale_price
from product
where product_id (NOT)IN (select product_id
from shopproduct
where shop_id = '000C')
EXIST谓词
理解:实际上不使用exist也可以用in代替
作用:判断是否存在满足某种条件的记录,使用关联子查询作为参数
select product_name, sale_price
from product AS P1
where exist (select *
from shopproduct AS P2
where P2.shop_id = '000A'
AND P2.product_id = P1.product_id)
注意:
ELSE可以省略,END不能省略
表达式:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
...
ELSE <表达式>
END
集合运算注意事项:
1.作为运算对象的记录的列数必须相同
2.作为运算对象的记录的列的类型必须一致
3.可以使用任何SELECt语句,但ORDER BY子句只能在最后使用一次
UNIOn ---表的加法(将两张表里面的数据合并到一张表;且自动消除重复数据;在NUION后面加上ALL就不会消除重复的数据;将UNIOn替换成INTERSECT,则会将重复的数据显示出来;EXCEPT则将一张表中有关另一张表单数据减去,显示剩下的数据,减数和被减数的位置不同,得到的结果也不同)
select product_id,product_name
from product
UNIOn
select product_id,product_name
from product2
进行联结时需要在FROM子句中使用多张表
SELECt子句中的列需要按照"<表的别名>"."<列名>"的格式进行书写
外联结指定主表的关键字是LEFT和RIGHT.使用LEFT时FROM子句中写在左侧的是主表,使用RIGHT时右侧的是主表
进行内联结是必须使用ON子句,并且要书写在FROM和WHERe之间
外联结取出的是表单所有数据,根据主表来排列,主表里面没有的数据用null表示.与内联结不同,内联结取出的是我们想要获得的数据
内联结(INNER JOIN ... ON)
select SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price
from ShopProduct AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id
WHERe SP.Product_id = '000A'
三表内联结
select SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price,IP.inventory_quantity
from shopproduct AS SP INNER JOIN product AS P
ON SP.product_id = P.product_id
INNER JOIN inventoryproduct AS IP
ON SP.product_id = IP.product_id
where IP.inventory_id = 'P001'
外联结 (RIGHT/LEFT OUTER JOIN ... ON)
select SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price
from ShopProduct AS SP RIGHT OUTER JOIN Product AS P
ON SP.product_id = P.product_id
交叉联结(CROSS JOIN 笛卡尔积形式联结)
select SP.shop_id,SP.shop_name,SP.product_id,P.product_name
fromshopproduct AS SP CROSS JOIN product AS P
传送门