思维导图:
必要说明:
- 需知SQL对大小写不敏感:SELECT 与 select 是相同的。
- 本文使用postgreSQL,代码可能也可能不在其他数据库中适用。
目录
1.查
1.1普通查询
关键字【select】【from】【where】【and】【or】
最最基础操作:
//查找表中某几列的数据
select 列1,列2 from 表1
//查找表中全部数据
select * from 表1
如果查询中要符合某些条件:
//若查找的数据要符合全部条件用and
select 列1,列2 from 表1 where 条件1 and 条件2
//若查找的数据只需符合几个条件中的某一个用or
select 列1,列2 from 表1 where 条件1 or 条件2
1.2列中不显示重复条件
在表中,一个列可能会包含多个重复值,有时您只希望仅仅列出不同的值。
关键词【distinct】
值得注意的是,distinct关键词只在查询单独一列时有效,若是查询多列则无效。
//有效
select distinct 列1 from 表1 where 条件1
//无效
select distinct 列1,列2 from 表1 where 条件1
验证如下:
①先看看表数据
②查询单列数据
③查询多列数据
1.3要求按升/降序排列
关键词【(升序排序)order by】【(降序排序)order by desc】
//升序
select 列1,列2 from 表1 where 条件1 order by 列1
//降序
select 列1,列2 from 表1 where 条件1 order by 列1 desc
例:
①先看表数据
②升序排列
③降序排列
1.4只取前面几项
关键词【limit】
//只取表中的前n项数据
select * from 表1 limit n;
//那么假设取表前50%的数据呢?
select top 50 percent * from 表1
//但top % percent是Microsoft SQL Server中才能使用的语句
//在postgreSQL中我们可以巧妙地利用limit与count()构建出来,count()后面会讲
select * from 表1 limit 0.5*(select count(*) from 表1)
验证如下:
1.5查找某些样式的数据
关键字【like】【_(下划线,用来代替一个字符)】【%(可以代替多个字符)】
//注意:where中的条件式一定要配合like使用,不能使用“=”号
select * from 表1 where 列1 like '_oo%'
//错误示范:
select * from 表1 where 列1 = '_oo%'
例:
①查看表中数据
②查找列2数据为?oo????的样式的数据
1.6多表结合查询
这个知识点是个有趣的点也是个小难点,在学习多表结合查询之前,我们得先了解一下什么是内连接,左连接,右连接和全连接。
①内连接:假设两表A、B。内连接之后只剩下A、B表共有的部分。
图中只有一个共有列name,而name中只有a、c是共有的属性。
②左连接:假设A是左表,B是右表。以A表为基础,将B表中与A表匹配上的数据贴上去。
③右连接:假设A是左表,B是右表。以B表为基础,将A表中与B表匹配上的数据贴上去。
④全连接:将两表共有列所有的数据都并在一起。
注意:旧的postgreSQL没有数据都显示为空,新版本则显示NULL。
那么表连接的代码样式与作用是什么呢?
代码样式:
//内连接
select * from 表1 join 表2 on 表1.某列名 = 表2.某列名 where 条件1 //默认就为内连接
select * from 表1 inner join 表2 on 表1.某列名 = 表2.某列名 where 条件1
//左连接
select * from 表1 left join 表2 on 表1.某列名 = 表2.某列名 where 条件1
//右连接
select * from 表1 right join 表2 on 表1.某列名 = 表2.某列名 where 条件1
//全连接
select * from 表1
full outer join 表2
on 表1.某列名 = 表2.某列名
where 条件1
使用范例:
//存在两张表:
//学生表:student(sNo,sName)
//选课信息表:sc(sNo,cNo)
//题目:查询所有学生及其选课信息(包括没有选课的学生)
select student.sno,sc.cno
from student
left join sc
on student.sno = sc.sno;
//分析:
//并不是所有的学生都选课,所以选课信息表中没有全部的学生
//而学生表中有所有的学生,但没有选课信息
//所以学生表与选课信息表左外连接
//结果既显示所有的学生又显示学生对应的选课信息
1.7以视图方式展示
视图是建立在基本表之上的表,是一张虚拟的表,随着基本表的数据变化而变化。
视图的作用:
- 提高了SQL语句的重用性。(视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。)
- 提高了安全性。(可以像查询基本表一样查询视图)
- 提高了用户的可读性。
关键词【create view as】【drop view】
//创建视图
create view 视图名1 as
select 列1,列2
from 表1
where 条件1
//更新视图:增加列3。注意视图名不变
create view 视图名1 as
select 列1,列2,列3
from 表1
where 条件1
//删除视图
drop view 视图名1
1.8在查询中使用函数求最小值,平均值等
关键词【max、min、avg等具体看下表】【group by】【having】
①SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
AVG() | 返回平均值 |
COUNT() | 返回行数 |
FIRST() | 返回第一个记录的值 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
SUM() | 返回总和 |
LAST() | 返回最后一个记录的值 |
②SQL Scalar 函数基于输入值,返回一个单一的值。
UCASE() | 将某个字段转换为大写 |
LCASE() | 将某个字段转换为小写 |
MID() | 从某个文本字段提取字符,MySql 中使用 |
SubString(字段,1,end) | 从某个文本字段提取字符 |
LEN() | 返回某个文本字段的长度 |
ROUND() | 对某个数值字段进行指定小数位数的四舍五入 |
NOW() | 返回当前的系统日期和时间 |
FORMAT() | 格式化某个字段的显示方式 |
使用范例:
//直接查询表中某列的平均值
select avg(列1) from 表1
//分组查询某列的平均值。值得注意的是按列2分类,那么select中也要加上列2
select avg(列1),列2
from 表1
group by 列2
//where与having的区别:使用having的原因是where关键字无法与聚合函数一起使用。
select avg(列1),列2
from 表1
where 条件1
group by 列2
having avg(列1) > 200
2.改
2.1改变表中某行数据
关键词【update set】
update 表1
set 列1 = 某值
where 列2 = 某值;
//若没有where条件则会将所有列1改成那个值
update 表1
set 列1 = 某值;
例:
①查看所有表数据:
②修改lie1为4的行的lie3为'okokok'
③查看修改后的表
2.2改变表中某列的数据类型
关键词【alter】【table】【column】【type】【using】
alter table 表1
alter column 列1 type 数据类型
//注意:可能存在数据类型转换失败的可能,可以使用强制类型转换
//慎用!强制类型转换可能会破坏原本表中的数据
alter table 表1 alter column 列1 type 数据类型 using (列1::数据类型);
例:
①查看表数据,注意lie1的数据类型
②修改lie1的数据类型
③查看修改后的表
3.增
3.1增加表中的列
关键词【alter】【add】
alter table 表1
add 列1 数据类型
示例:
3.2增加表中的记录(行)
//第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
insert into 表1
values(列1值,列2值,列3值,...);
//第二种形式需要指定列名及被插入的值:
insert into 表1(列1,列2,列3,...)
values(列1值,列2值,列3值,...);
示例:
3.3新表中增加旧表的数据
关键词【INSERT INTO】
//选择旧表中的列数据插入新表
insert into 表1(列1,列2)
select 列1,列2
from 表2;
示例:
①先来看看表test与表test1的内容:
②将在表test中插入表test1的内容:
③查看test表中的数据:
4.删
4.1删除索引/表/数据库
关键词【drop】
//删除索引
drop index 索引1;
//删除表
drop table 表1;
//删除数据库
drop database 数据库名1;
顺便附上索引的创建、查看:postgresql 查看索引、创建、删除索引
4.2删除表中的列
关键词【alter】【drop】【column】
alter table 表1 drop column 列1;
示例:
①查看test1表:
②删除test1表中的lie5:
③查看是否删除lie5成功:
4.3删除表中的行(即数据)
关键词【delete】
delete from 表1
where 列1 = 某值;
示例:
①查看test1表数据:
②删除test1表中lie2数据为'z'的数据:
③查看是否删除数据成功:
4.4一次删除表中的所有数据
关键词【truncate】
truncate table 表1;
示例:
①查看test1表中的所有数据:
②一次删除test1表中的所有数据:
③查看是否删除成功: