高斯数据库日常命令
一.高斯数据库部署
docker run --name OpenGauss --privileged=true --restart=always -u root -p 15432:5432 -e GS_PASSWORD=QYuY482wasErOP1Q@ -v /etc/localtime:/etc/localtime -v /data/OpenGauss:/var/lib/opengauss registry.cn-hangzhou.aliyuncs.com/qiluo-images/opengauss:latest
首先安装docker环境
进入容器,切换omm用户 ,创建用户:
INSERT INTO "gaussdb"."emp" ("empno", "ename", "job", "sal") VALUES (1003, '王五', '项目经理', '12000.00');
带条件查询
带条件的查询
select 内容 from 数据来源 where 条件表达式;
说明:
只有满足 where 后面条件的内容才会显示出来
比较运算符
操作符
描述
<
小于
>
大于
<=
小于或等于
>=
大于或等于
=
等于
<> 或 !=或^=
不等于
案例1:查询工资大于1500的员工信息
select * from emp where sal>1500;

案例2:查询名字叫SMITH的员工的信息
select * from emp where ename = 'SMITH';
说明:SQL语言中,数值类型直接写就可以,字符串类型的数据要用单引号括起来
案例3:查询不是10号部门的员工的信息
##新增字段
-- 新增整型字段 deptno,允许为空
ALTER TABLE emp ADD COLUMN deptno INT;
#插入语句
-- 示例:按员工编号/岗位更新 deptno
UPDATE emp SET deptno = 10 WHERE empno IN (1001,1002,1004,1006,1007,1011); -- 技术部
UPDATE emp SET deptno = 20 WHERE empno = 1003; -- 管理部
UPDATE emp SET deptno = 30 WHERE empno = 1005; -- 产品部
UPDATE emp SET deptno = 40 WHERE empno IN (1008,1009,1010); -- 行政财务部
select * from emp where deptno != 10;
select * from emp where deptno <> 10;
select * from emp where deptno ^= 10;
逻辑运算符
常用的逻辑运算符有,and、or和not,一般用来做为多个条件的连接符。运算结果有三个值,分别为TRUE、FALSE和NULL,其中NULL代表未知。
and:表示并且,当and连接的两个条件同时成立时,总条件才算成立,只要有一个条件不成立,整体不成立。
or:表示或者,当or连接的两个条件有一个条件成立,整体条件成立,只有两个条件都不成立时,整体才不成立。
not:表示非,取反值。

案例1:查询10号部门,工资大于1000的员工信息
select * from emp where deptno=10 and sal>1000;
案例2:查询工资在1000到3000之间的员工信息
select * from emp where sal>=1000 and sal<=3000;
案例3:查询10号部门,或者工资小于2000的员工信息
select * from emp where deptno=10 or sal<2000;
案例4:查询工资不大于2000的员工信息
SELECT * FROM EMP WHERE NOT(SAL>2000);
NULL值判断
IS NULL:筛选某个字段为NULL值的信息
IS NOT NULL:筛选某个字段不为NULL值的信息
案例:查询没有经理的员工信息
SELECT *
FROM EMP
WHERE MGR IS NULL;
范围查询
-
BETWEEN ... AND ....:用于在一个范围内查询满足条件的数据,格式:between 小值 and 大值; -
-
案例1:查询工资在2450到3000之间的员工信息
BETWEEN ... AND ....:用于在一个范围内查询满足条件的数据,格式:between 小值 and 大值; 案例1:查询工资在8000到10000之间的员工信息 SELECT * FROM EMP WHERE SAL BETWEEN 8000 AND 10000; 案例2:查询1981年上半年入职的员工信息 select * from emp WHERE HIREDATE BETWEEN DATE'1981-1-1' AND DATE'1981-6-30'; 注意:GaussDB中日期格式的字符串在与日期类型的字段比较时,会进行隐式转换 IN关键字用于查询一个列的值是否在指定的一组离散值之中,格式:IN(1000,2000,3000); 案例1:查询员工编号时7788/7654/7369的员工信息 SELECT * FROM EMP WHERE EMPNO=7788 OR EMPNO=7654 OR EMPNO=7369; 以上where条件可用in代替,如下: SELECT * FROM EMP WHERE EMPNO IN(7788,7654,7369); 注意:也可以在IN集合前面添加NOT关键字,表示取反值; ALL:只有大于等于all,等价于大于集合中最大值,小于集合中最小值; ANY:大于any等价于大于集合中最小值,小于any等价于小于集合中最大值; 模糊查询: like:表示对字符串进行模糊匹配,有两个占位符: %:表示在这个%出现的地方可以有0个或者多个字符; _:表示在_出现的地方有且只能有一个任意字符; 案例1:查询员工姓名是S结尾的员工信息 select * from emp where ename like '%S'; 案例2:查询emp表中员工姓名的第二个字符是L的员工信息 select * from emp where ename like '_L%'; not like:和like相反 排序操作 order by关键字,用于对查询结果集进行排序。它允许用户按照一个或者多个列的值进行升序(asc)或者降序(desc)的方式重新排列结果。 语法结构: select 内容 from 数据来源 [ where ] order by 字段1 [asc] | desc [, 字段2 [asc] | desc, 字段2 [asc] | desc,....] 案例1:查询emp表中所有的员工信息,查询结果以工资进行升序 select * from emp order by sal; 案例2:查询emp表中所有的员工信息,要求以部门编号升序,工资降序 select * from emp order by deptno , sal desc
-
聚合函数
- count(列名|*|常数):返回数据条数
- max(列):返回该列中的最大值
- min(列):返回该列中的最小值
- avg(列):返回该列中的平均值
- sum(列):返回该列中的和
案例1:统计emp表中的员工数量
select count(*) from emp;
select count(empno) from emp;
案例2:统计emp表中的部门数量
select count(distinct deptno) from emp;
说明: distinct 表示去重,写在 select from 列表中的第一位,如果 distinct 后面跟随多个列时,则会进行复合去重;
案例3:查询工资总和
select sum(sal) from emp;
select count(*) from emp;
select count(empno) from emp;
select sum(sal) from emp;
select avg(sal) from emp;
select max(sal) from emp;
select min(sal) from emp;
案例3:查询工资总和
select sum(sal) from emp;
案列4:查询10部门中的最高工资
select max(sal) from emp where deptno = 10;
案例5:查询所有员工中的最低工资
select min(sal) from emp;
案例6:查询所有员工的平均工资
select avg(sal) from emp;
分组查询
关键字:group by,后面跟分组字段名,可以是一个列,也可以是多个列
语法结构:
select 内容 from 数据来源 [where] group by .. [order by]
案例1:查询各个部门的部门编号和部门的平均工资
select deptno,avg(sal) from emp group by deptno;
案例2:查询各个部门的员工人数
select deptno,count(empno) from emp group by deptno;
案例3:查询每个部门中每个职位有多少人
select deptno,count(empno) from emp group by deptno;
注意:group by 后面跟多个列时,只有当多个列的值同时相等时,它才会分为同一个组;
过滤组后信息
关键字:having,是对分组后的数据进行筛选,条件表达式中可以使用聚合函数
语法结构:
select 内容 from 数据来源 [where] group by .. having ... [order by];
注意:having只能跟group by一起使用,不能单独出现使用
举例说明:
CREATE TABLE student (
id INT,
class VARCHAR(20), -- 班级
score INT -- 分数
);
INSERT INTO student VALUES
(1, '一班', 80),
(2, '一班', 90),
(3, '二班', 70),
(4, '二班', 60),
(5, '三班', 85),
(6, '三班', 95),
(7, '三班', 78);
需求:筛选分数大于 70的学生,按班级分组,统计每班平均分,只保留平均分≥80的班级,最终按平均分降序排列。
sql
SELECT class, AVG(score) AS avg_score
FROM student
WHERE score > 70 -- 分组前:过滤单行数据
GROUP BY class -- 按班级分组
HAVING AVG(score) >= 80 -- 分组后:过滤分组结果
ORDER BY avg_score DESC; -- 结果排序
集合操作符
集合:每一个SQL查询的结果就是一个集合
并集:取两个集合中所有的元素
union all:不删除重复元素
union:删除重复元素
交集:取两个集合重叠部分的元素
intersect
差集:第一个集合的所有元素减去两个集合重叠部分的元素
minus
联合查询
交叉连接(笛卡尔积连接):将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积; 语法结构:
SELECT * FROM A CROSS JOIN B;
内连接:把两个表中符合条件的数据连接为一条数据,如果哪个表中存在不符合连接条件的数据,那么这些数据就会被过滤掉(不显示); 语法结构:
SELECT * FROM A [INNER] JOIN B ON 连接条件;
案例:查询员工信息及他的部门信息
select * from emp e inner join dept d on e.deptno=d.deptno;
自连接:是一个特殊的内连接,内连接一般是两个表的连接,自连接将一个表和它自已进行连接; 案例:查询员工信息,并显示它的上级姓名
select e1.*,e2.ename 上级姓名 from emp e1 join emp e2 on e1.mgr=e2.empno;
不等连接:连接条件是不等条件 案列:查询员工信息,并显示员工的工资等级
select e.*,s.grade,s.losal,s.hisal from emp e join salgrade s on e.sal between s.losal and s.hisal;
全连接:它会查出两个表中的所有数据
语法结构:
select 列名,列名,列名,....
from 表A full [outer] join 表B on 连接条件;
案例:查询所有部门和员工信息
select e.*,d.* from emp e full outer join dept d on e.deptno=d.deptno;
如果两个表中的数据都符合连接条件,那么它会和内连接一样,将符合条件的数据连接为一条记录
如果第一表中的一条数据,在第二张表中没有找到和它对应的记录(第二张表没有和第一张表这条数据符合连接条件),那么它同样会显示第一张表的这条记录,同时它对应的第二张表数据的位置会显示为空
同理,如果第二张的一条记录,在第一张表中没有找到符合连接条件的数据,那么同样会显示,在显示第一张表数据的位置显示为空
左外连接:查出左表(left outer join关键字前面的表)的所有数据,根据连接条件去右表中找对应的数据,如果找到变显示出来,如果找不到就显示空
语法结构:
select 列名,列名,...
from 表A left [outer] join 表B on 连接条件;
案例:查询所有部门下的员工信息
select d.*,e.* from dept d left join emp e on d.deptno=e.deptno;
右外连接:它会查出右表的所有数据,根据连接条件去左表查找对应的数据,如果找到就显示,如果找不到就显示为空
语法结构:
select 列名,列名,列名,...
from 左表 right [outer] join 右表 on 连接条件;
案例:显示所有员工信息以及所在的部门信息
select * from dept d right join emp e on d.deptno=e.deptno;
注意:用(+)表示的左连接或者右连接,如果是左连接,那么符号加在右表的关系列上,如果是右连接,那么符号加在左表的关系列上
--左连接
select d.*,e.* from dept d,emp e where e.deptno(+)=d.deptno;
--右连接
select d.*,e.* from dept d,emp e where d.deptno(+)=e.deptno;
自然连接:自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。 语法结构:
select * from a natural join b;
案例:
select * from emp natural join dept;
子查询
from 后面的子查询 案例:查询员工的姓名和他上级的姓名
select ename, mname
from (select e.*, d.empno, d.ename mname, d.job, d.sal, d.deptno
from emp e, emp d
where e.mgr = d.empno(+));
where 后面的子查询
单行子查询:子查询的sql语句只查出一条记录 案例:查询工资大于10号部门平均工资的员工信息
select * from emp where sal>(select avg(sal) from emp where deptno=10);
多行子查询:子查询的sql语句查出若干条记录 案例:查询工资比20号部门所有人工资都高的员工信息
-- 1)用单选子查询来完
--查询20号部门的最高工资
select * from emp where sal>( select max(sal) from emp where deptno=20);
-- 2) >all
--20号部门的员工工资是一个集合
select * from emp where sal>all(select sal from emp where deptno=20);
having 后面的子查询 案例:查询各个部门的部门编号和员工人数,要求部门的平均工资大于30号部门的平均工资
select deptno,count(*) from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=30);
exists、not exists:exists后面跟子查询,如果子查询能查出数据,那么条件是真的,如果子查询查不出结果,条件不成立;not exists 则相反;
非相关性子查询:子查询可以单独执行
select * from emp where exists (select * from dept where deptno = 10);
select * from emp where not exists (select * from dept where deptno = 10);
相关性子查询:子查询不能直接执行
select * from emp e where exists (select * from dept d where e.deptno = d.deptno);
SELECT 和 FROM 之间的子查询:子查询的结果只能是单行单列 案例:
select emp.*,(select dname from dept where deptno = 10) from emp;
;
非相关性子查询:子查询可以单独执行
select * from emp where exists (select * from dept where deptno = 10);
select * from emp where not exists (select * from dept where deptno = 10);
相关性子查询:子查询不能直接执行
select * from emp e where exists (select * from dept d where e.deptno = d.deptno);
SELECT 和 FROM 之间的子查询:子查询的结果只能是单行单列 案例:
select emp.*,(select dname from dept where deptno = 10) from emp;