SQL语句分类
1.DDL数据定义语言;数据库,表,列。关键词:create ,drop,alter等
2.DML数据操作语言;数据库中的表增删改。关键词:insert,delete,update等
3.DQL数据查询语言;查询数据库中表的记录。关键词:select,where等
4.DCL数据控制语言;数据库的访问权限和安全级别,创建用户。关键词:GRANT,REVOKE等
postgresql语法DDL
数据库相关
1.创建数据库
CREATE DATABASE 数据库名称
2. 查询当前使用的数据库
SELECT current_database();

3.查看所有数据库
\l

4.切换使用数据库
\c 数据库名称

数据库表相关
SQL数据类型
创建表
CREATE TABLE 表名(参数 类型,参数 类型);
查看所有表
\dt

查看表结构
\d 表名字

复制相同结构的新表(复制表结构)
CREATE TABLE 新表名 (LIKE 老表名 INCLUDING ALL);

删除表
DROP TABLE 表名;

判断是否存在并删除表
DROP TABLE IF EXISTS 表名;

修改表结构
增加数据库表列
ALTER TABLE 表名 ADD 列名 类型;


修改表列类型
ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 类型;

修改表列名
ALTER TABLE ONLY 表名 RENAME COLUMN 原来的列名字 TO 新列名;

删除列名字
ALTER TABLE 表名 DROP 列名;

修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;

postgresql语法DML
表插入数据
顺序不能变
1. INSERT INTO 表名(列名1,列名2,列名3)VALUES(列表变量参数1,列表变量参数2,列表变量参数3);
2. INSERT INTO 表名 VALUES(列表变量参数1,列表变量参数2,列表变量参数);
3. INSERT INTO 表名(列名1,列名2,列名3)VALUES(列表变量参数1,列表变量参数2,NULL);

查询表数据
SELECT * FROM 表名;

蠕虫复制(包括复制表内容)
重复复制会让新表上面累加
与like 不同它可以一同连表的数据直接复制
2

复制可选项(单指复制)
INSERT INTO 新表名(name,age) SELECT name,id FROM 老表名;

修改(更新)表数据
列名全部改变
UPDATE 表名 SET 列名 = 值;

修改(更新)表数据按照条件更新
UPDATE 表名 SET 列名 = '更改后的参数' WHERE 列名 = 值;
删除表所有数据
DELETE FROM 表名
*(为一行一行删除)区别

TRUNCATE TABLE student1;
*(表删掉重新创建新表)区别

删除表数据(按照条件)
DELETE FROM 表名 WHERE 列名 = 值;

postgresql语法DQL
查询表所有数据
SELECT * FROM student;

查询每列的名称
这样效率高 因为只查询单表
SELECT 列名1,列名2 FROM 表名;

别名查询
给列名加个注释查询
SELECT 列名 AS 备注名, 列名 AS 备注名 FROM 表名;

查询清除重复值
按照列名去重
SELECT DISTINCT 列名1, 列名2 FROM 表名;

查询结果参与运算
类似于react的useMemo计算属性
SELECT 列名1 + 列名2 FROM 表名;

上面显示的时候看着别扭可以按照下面这样写
SELECT *, 列名1 + 列名2 结果别名 FROM 表名;

也可以这样加别名显示
SELECT 列名1 别名1, 列名2 别名2, 列名3 别名3,想要运算的列名1+想要运算的列名2||想要运算的值 结果别名 FROM 表名;

查询比较运算符
*示例 用以下数据做实验

大于
<小于
<=小于等于
=大于等于
=等于
<>、!=不等于
查询条件大于350的数据
SELECT * FROM 表名 where 列名> 列名参数;

逻辑运算符
and 多个条件同时满足
or 多个条件其中一个满足
not 不满足
SELECT * FROM 表名 WHERE 列名 比较运算符 值 逻辑运算符 列名 比较运算符 值 ;

查询查询id是1或3或5的数据
SELECT * FROM hero WHERE id=值1 OR id=值2 OR id=值3;
SELECT * FROM hero WHERE id in(值1,值2,值3);

查询查询id不为1或3或5的数据
SELECT * FROM hero WHERE id NOT in(值1,值2,值3);

范围
SELECT * FROM 表名 WHERE 列名 BETWEEN '2013-01-01' AND '2017-01-01';
SELECT * FROM 表名 WHERE 列名 比较运算符 值 AND 列名 比较运算符 值;
效果相同

模糊查询
关键字like
MySQL通配符有两个:
%: 表示0个或多个字符(任意个字符)
_: 表示一个字符
SELECT * FROM 表名 WHERE 列名 LIKE '通配符字符串';
%匹配

因为%是0个到任何字符所以可以这么写

_匹配

查询结果排序
*通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)
SELECT * FROM 表名 WHERE 列名1 比较运算符 值 ORDER BY 列名1 ASC;
不加ASC默认升序
ASC是升序
DESC是降序


组合排序
组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
上面的例子中,年龄是有相同的。当年龄相同再使用其他字段进行排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
查询年龄小于等于35岁的英雄,按照年龄升序排列,如果年龄相同按照生命的降序排列
此例子为视频截图 上面的年龄亚瑟年龄和视频不符合 体现不上来

聚合函数
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值。另外聚合函数会忽略空值
五个聚合函数:
count: 统计指定列记录数,记录为NULL的不统计
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值
min: 计算指定列的最小值
avg: 计算指定列的平均值,如果不是数值类型,那么计算结果为0
count 统计
SELECT COUNT(列名) FROM 表名
因为count会忽略NULL的数据所以列名里应该填写 * 号
下面例子中函数意思为一共有13条有age数据
按照条件查询

sum 求和
单个列相加求和
SELECT SUM(列名) FROM 表名

avg 平均值
SELECT AVG(列名) FROM 表名

max 最大值
SELECT MAX(列名) FROM 表
例子中最大的max_score值为17.7

min 最小值
SELECT MIN(列名) FROM 表

分组查询
postgresql 直接GROUP BY 会报错需要和聚合函数搭配使用
缺点:不能显示分组的列名 不知道是按照什么分组的
SELECT SUM(列名) FROM 表名 GROUP BY 按照分组的列名;

SELECT SUM(列名),按照分组的列名 表名 GROUP BY 按照分组的列名;
优点:这样会出现查询按照分组的列名

再次过滤
- 因为WHERE是分组前的操作 所有得使用 ****HAVING 关键字
- HAVING 关键字是分组后的再次过滤
SELECT 聚合函数(*),按照分组的列名 FROM 表名 WHERE 列名 比较运算符 值 GROUP BY 按照分组的列名 HAVING 聚合函数(*) 比较运算符 值;

- having是在分组后对数据进行过滤.
- where是在分组前对数据进行过滤
- having后面可以使用聚合函数
- where后面不可以使用聚合函数
limit 语句(分页)
SELECT * FROM 表名 LIMIT 显示的条数 OFFSET 跳过的条数;
例子中:跳过2条数据 显示2条数据后的6条数据

这是全部数据
数据库限制
- PRIMARY KEY:主键
- UNIQUE:唯一
- NOT NULL:非空
- DEFAULT:默认
- FOREIGN KEY:外键
一个表得有一个唯一值
增加主键
设置id为PRIMARY Key主键
如果没有表创建主键
sql
CREATE TABLE hero1(
id int PRIMARY Key,
name varchar(20),
age int
);

如果有表创建
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY (唯一列名 id);
重复的id添加时候报错 因为有主键了
删除主键
ALTER TABLE 表名 DROP CONSTRAINT 主键名称;

约束没有

主键自增
设置id为PRIMARY Key主键
SERIAL为自增
sql
CREATE TABLE hero2(
id SERIAL PRIMARY KEY,
name varchar(20),
age int
);
有了自增 就可以添加数据的时候不用额外加id

扩展
删除数据
DELETE FROM 表名
重新使用
INSERT INTO 表名 (列名1, 列名2) VALUES (值1,值2);
主键的id会从删除的最结尾开始计数
解决方法:
TRUNCATE TABLE 表名; 或者 DELETE FROM 表名
ALTER SEQUENCE 表名_id_seq RESTART WITH 1;
意思是重置主键id为1

唯一
关键词:UNIQUE
设置这张表这个字段值不能重复
比如身份证号,英雄名
注意NULL值是可以重复插入
sql
CREATE TABLE 表名(
id SERIAL PRIMARY KEY,
列名1 varchar(20) UNIQUE,
列名2 int
);

非空
关键词:NOT NULL
sql
CREATE TABLE 表名(
id SERIAL PRIMARY KEY,
name varchar(20) UNIQUE NOT NULL,
age int
);
如果重复添加数据:

默认值
关键词 :DEFAULT
sql
CREATE TABLE 表名(
id SERIAL PRIMARY KEY,
name varchar(20) UNIQUE NOT NULL,
location VARCHAR(50) DEFAULT '射手'
);
外键
注:外键创建 sql语句我没找到我用的是 可视化工具创建的
通过连接外键可以查询同一个数据相关联
SELECT * FROM 包含外键的表名
JOIN 外键的表名 ON 包含外键的表名.id = 外键的表名.id
WHERE 外键的表名.id = 1;
