《GreenPlum系列》GreenPlum初级教程-05GreenPlum语言DDLDMLDQL

文章目录

  • 第五章 DDL&DML&DQL
    • 1.DDL(Data Definition Language)数据定义语言
      • 1.1 创建数据库
      • 1.2 查询数据库
      • 1.3 删除数据库
      • 1.4 创建表
      • 1.5 修改表
      • 1.6 清除表
      • 1.7 删除表
    • 2.DML(Data Manipulation Language)数据操作语言
      • 2.1 数据导入
      • 2.2 数据更新和删除
      • 2.3 数据导出
    • 3.DQL(Data Query Language)数据查询语言
      • 3.1 基础语法及执行顺序
      • 3.2 基本查询
      • 3.3 分组查询
      • 3.4 联合查询
      • 3.5 排序

第五章 DDL&DML&DQL

1.DDL(Data Definition Language)数据定义语言

1.1 创建数据库

1)语法

CREATE DATABASE name [ [WITH] [OWNER [=] dbowner]
[TEMPLATE [=] template]
[ENCODING [=] encoding]
[TABLESPAC [=] tablespace]
[CONNECTIONE LIMIT [=] connlimit ] ]
  • CREATE DATABASE name;

    CREATE DATABASE是SQL命令,用于创建一个新的数据库。

    name是自定义的数据库名称。这个名称是必须要填写的,而且在当前数据库服务器上必须是唯一的。

  • [WITH] [OWNER [=] dbowner]

    这是一个可选项。OWNER指定了新数据库的所有者。如果未指定,新数据库的所有者默认是执行该命令的用户。

    dbowner是数据库所有者的用户名。

  • [TEMPLATE [=] template]

    这是一个可选项。TEMPLATE指定了用户创建新数据库的模板。在PostgreSQL和GreenPlum中,通常有一个名为template1的默认模板。如果不指定,就会使用这个默认模板。

    template是模板数据库的名称。

  • [ENCODING [=] encoding]

    ENCODING指定了新数据库的字符编码。这个设置决定了数据库可以存储哪些字符。

    encoding是字符编码的名称,例如UTF8

  • [TABLESPAC [=] tablespace]

    这是可选项。TABLSPACE指定了新数据库的存储位置。表空间是数据库中存储文件的物理位置。

    tablespace是表空间名称。

  • [CONNECTIONE LIMIT [=] connlimit ]

    这是可选项。

    CONNECTON LIMIT限制了可以同时连接到数据库的最大客户端数量。

    connlimit是允许的最大连接数。如果设置为-1,则表示没有限制。

2)创建一个数据库

create database gpdb
with owner gpadmin
encoding 'utf-8'
tablespace pg_default
connection limit 10;

postgres=# create database gpdb
postgres-# with owner gpadmin
postgres-# encoding 'utf-8'
postgres-# tablespace pg_default
postgres-# connection limit 10;
CREATE DATABASE

3)创建schema

schema本质上就是一个分组管理工具,它允许您将相关性质或类型的多个表和其他数据库对象(如试图、索引、存储过程等)组织在一起。也可以把schema看作是数据库内部一个"文件夹"或"命名空间",用于逻辑上组织和隔离数据,以实现更好数据管理和安全控制。

一个database下可以有多个schema。schema在gp中也叫做namespace。

  • 1.连接创建完成的数据库
    \c gpdb
  • 2.创建schema
    create schema ods;
postgres=# \c gpdb
You are now connected to database "gpdb" as user "gpadmin".
gpdb=# create schema ods;
CREATE SCHEMA

1.2 查询数据库

1)切换当前数据库

  • 数据库服务器命令行操作

    \c gpdb

    postgres=# \c gpdb
    You are now connected to database "gpdb" as user "gpadmin".
    
    

2)显示数据库

  • 数据库服务器命令行操作

    查看所有数据库:\l
    查看所有schema:\dn

    gpdb=# \l
                                   List of databases
       Name    |  Owner  | Encoding |  Collate   |   Ctype    |  Access privileges
    -----------+---------+----------+------------+------------+---------------------
     gpdb      | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
     gpperfmon | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
     postgres  | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
     template0 | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 | =c/gpadmin         +
               |         |          |            |            | gpadmin=CTc/gpadmin
     template1 | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 | =c/gpadmin         +
               |         |          |            |            | gpadmin=CTc/gpadmin
     zxy       | gpadmin | UTF8     | en_US.utf8 | en_US.utf8 |
    (6 rows)
    
    gpdb=# \dn
       List of schemas
        Name    |  Owner
    ------------+---------
     gp_toolkit | gpadmin
     ods        | gpadmin
     public     | gpadmin
    (3 rows)
    
  • SQL查询操作

    查看所有数据库:select datname from pg_database;
    查看所有schema:select schema_name from information_schema.schemata;

    gpdb=# select datname from pg_database;
      datname
    -----------
     template1
     template0
     postgres
     gpperfmon
     zxy
     gpdb
    (6 rows)
    
    gpdb=# select schema_name from information_schema.schemata;
        schema_name
    --------------------
     pg_toast
     pg_aoseg
     pg_bitmapindex
     pg_catalog
     public
     information_schema
     gp_toolkit
     ods
    (8 rows)
    

1.3 删除数据库

drop database会删除数据库的系统的目录并且删除包含数据的文件目录。可以使用if exists判断数据库是否存在,存在则删除;

drop database if exists yyds

1.4 创建表

1)创建语法说明

CREATE [EXTERNAL] TABLE table_name(
 column1 datatype [NOT NULL] [DEFAULT] [CHECK] [UNIQUE],
 column2 datatype,
 .....
 columnN datatype,
 [PRIMARY KEY()]
)[ WITH ()]
 [LOCATION()]
 [FORMAT]
 [COMMENT]
 [PARTITION BY]
 [DISTRIBUTE BY ()];

  • create table

    创建一个指定名字的表,如果相同名字的表已经存在,则抛出异常。

  • external

    external关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(location)

  • not null

    非空约束

  • default

    默认值

  • check

    为表字段添加检查约束

  • unique

    唯一约束,一个表中唯一和主键只能存在一个

  • primary key

    主键设置,可以是一个或多个列

  • with

    可以添加数据追加方式,压缩格式,压缩级别,行列压缩等

  • location

    指定外部表数据存储位置

  • format

    存储数据的文本类型

  • partition by

    支持两种分区方式,范围分区(range)和列表分区(list)

  • distributed by

    为表添加分布键,其必须为主键的子键

  • comment

    为表或列添加注释。

2)内部表和外部表介绍

内部表和外部表是两种不同类型的表,它们在数据存储和处理方式上有明细的区别。了解这些区别对于合理的设计和优化GP数据库非常重要。

内部表和外部表在操作和用途上的主要区别。内部表适合存储和管理数据库内的数据,而外部表适用于从外部数据源临时读取数据。

  • 内部表

    • 数据存储:内部表的数据直接存储在GP数据库的数据文件中,这意味着数据被物理存储在数据库服务器上。
    • 事务管理:内部表完全支持事务管理,这包括ACID属性(原子性、一致性、隔离性和持久性),确保数据完整性和可靠性。
    • 索引和约束:可以在内部表上创建索引和约束,这有助于提高查询性能和维护数据完整性。
    • 管理和维护:内部表可以使用数据库的全部管理和维护功能,如备份和恢复。
    • 适用性:适用于需要高性能查询和事务完整性的数据。
    1) 创建内部表
    gpdb=# CREATE TABLE ods.test ( id SERIAL PRIMARY KEY, name VARCHAR(100));
    CREATE TABLE
    2) 插入数据
    gpdb=# INSERT INTO ods.test (name) VALUES ('zxy');
    INSERT 0 1
    gpdb=# INSERT INTO ods.test (name) VALUES ('zxy2');
    INSERT 0 1
    3) 查询结果
    gpdb=# select * from ods.test;
     id | name
    ----+------
      2 | zxy2
      1 | zxy
    (2 rows)
    
    
  • 外部表

    • 数据存储:外部表的数据存储在数据库外部,如在文件系统、HDFS或任何可以通过SQL/MED(SQL Management of External Data)访问的数据源。外部表仅存储数据的元数据和位置信息。
    • 事务管理:外部表不支持事务管理,它们主要用于读取和加载操作,不保证ACID属性。
    • 索引和约束:由于数据实际存储在外部,,不能在外部表上创建索引或强制指向数据库级别的约束。
    • 管理和维护:外部表的管理相对简单,因为只是对外部数据源的引用。备份和恢复不适用于外部表本身,而是应用于数据源。
    • 适用性:适用于ETL操作,即从外部数据源提取数据,然后可能将其转换和加载到内部表中进一步处理。
    1)启动gpfdist
    [gpadmin@sdw1 ~]$ gpfdist -d /home/gpadmin/ -p 8081 -l /home/gpadmin/gpAdminLogs/gpfdist.log &
    [1] 3232
    
    2)/home/gpadmin/目录下,创建txt目录
    1,zxy,18
    2,zxy2,20
    
    3)mdw创建外部表
    create external table ods.test2 (
    id int,
    name varchar(100),
    age int
    )
    location ('gpfdist://sdw1:8081/test.txt')
    format 'text' (delimiter ',');
    
    4)查询外部表
    zxy=# select * from ods.test2;
     id | name | age
    ----+------+-----
      1 | zxy  |  18
      2 | zxy2 |  20
    (2 rows)
    
    

1.5 修改表

1)重命名表

alter table table_name rename to new_table_name;

zxy=# alter table ods.test rename to test3;
ALTER TABLE

2)增加列

alter table table_name add column col_name column_type;

zxy=# alter table ods.test3 add column age int;
ALTER TABLE

3)修改列类型

alter table table_name alter column column_name type column_type [using column::column_type]

zxy=# alter table ods.test3 alter column age type varchar(20);
ALTER TABLE

4)删除列

alter table table_name drop column col_name;

zxy=# alter table ods.test3 drop column age;
ALTER TABLE

1.6 清除表

truncate table table_name;

zxy=# truncate table ods.test3;
TRUNCATE TABLE

1.7 删除表

drop table table_name;

zxy=# drop table ods.test3;
DROP TABLE

2.DML(Data Manipulation Language)数据操作语言

2.1 数据导入

1)向表中装在数据(copy)

copy tablename from file_path delimiter '分隔符';

copy:表示加载数据,仅追加;

delimiter:表示读取的数据字段之间的分隔符;

1)创建表
create table ods.test4 (
id int null,
name varchar(10),
age int null
);

2)准备数据
1,zxy,18
2,zxy2,20

3)导入数据
copy ods.test4 from '/home/gpadmin/test.txt' delimiter ',';

4)查询数据
zxy=# select * from ods.test4;
 id | name | age
----+------+-----
  1 | zxy  |  18
  2 | zxy2 |  20
(2 rows)

2)向表中插入数据(insert)

insert into tablename(column1,column2...) values(....);

insert into tablename select * from tablename2;

1)insert into tablename(column1,column2...) values(....);
zxy=# insert into ods.test4 values(3,'zxy3',20);
INSERT 0 1

2)insert into tablename select * from tablename2;
zxy=# insert into ods.test4 select * from ods.test2;
INSERT 0 2

3)查询数据
zxy=# select * from ods.test4;
 id | name | age
----+------+-----
  3 | zxy3 |  20
  2 | zxy2 |  20
  2 | zxy2 |  20
  1 | zxy  |  18
  1 | zxy  |  18
(5 rows)

2.2 数据更新和删除

1)数据更新

update tablename set column1=value1,column2=value2... where [condition];

1)准备数据
zxy=# select * from ods.test4 where id = 1;
 id | name | age
----+------+-----
  1 | zxy  |  18
  1 | zxy  |  18
(2 rows)

2)修改数据
zxy=# update ods.test4 set name='aaa' where id = 1;
UPDATE 2

3)查询数据
zxy=# select * from ods.test4 where id = 1;
 id | name | age
----+------+-----
  1 | aaa  |  18
  1 | aaa  |  18
(2 rows)

2)数据删除

delete from tablename where [condition];

1)删除id为1的数据
zxy=# delete from ods.test4 where id = 1;
DELETE 2

2)查询数据
zxy=# select * from ods.test4 where id = 1;
 id | name | age
----+------+-----
(0 rows)

2.3 数据导出

外部表数据无法导出。

copy tablename to filepath;

3.DQL(Data Query Language)数据查询语言

3.1 基础语法及执行顺序

SELECT [DISTINCT] colum1, column2, ...
FROM table_name               -- 从什么表查
[WHERE condition]             -- 过滤
[GROUP BY column_list]        -- 分组查询
[HAVING column_list]          -- 分组后过滤
[ORDER BY column_list]        -- 排序
[LIMIT number]                -- 限制输出的行数

3.2 基本查询

1)准备数据
[gpadmin@mdw ~]$ cat dept.txt
10,行政部,1700
20,财务部,1800
30,教学部,1900
40,销售部,1700
50,后勤部,1800

[gpadmin@mdw ~]$ cat emp.txt
7369,张三,研发,800.00,30
7499,李四,财务,1600.00,20
7521,王五,行政,1250.00,10
7566,赵六,销售,2975.00,40
7654,侯七,研发,1250.00,30
7698,马八,研发,2850.00,30
7782,金九,,2450.0,30
7788,银十,行政,3000.00,10
7839,小芳,销售,5000.00,40
7844,小明,销售,1500.00,40
7876,小李,行政,1100.00,10
7900,小元,讲师,950.00,30
7902,小海,行政,3000.00,10
7934,小红明,讲师,1300.00,30
7999,小八,行政,4000.00,10

2)准备表
create table ods.dept (
deptno int,   --部门编号
dname text,   --部门名称
loc int       --部门位置id
) ;
create table ods.emp (
empno int,             -- 员工编号
ename text,            -- 员工姓名
job text,              -- 员工岗位(大数据工程师、前端工程师、java工程师)
sal double precision,  -- 员工薪资
deptno int             -- 部门编号
) ;

3)导入数据
copy ods.dept from '/home/gpadmin/dept.txt' delimiter ',';
copy ods.emp from '/home/gpadmin/emp.txt' delimiter ',';

1)直接查询

# 使用*,查询所有数据
zxy=# select * from ods.dept;
 deptno | dname  | loc
--------+--------+------
     30 | 教学部 | 1900
     20 | 财务部 | 1800
     40 | 销售部 | 1700
     10 | 行政部 | 1700
(4 rows)

# 查询指定列
zxy=# select deptno,dname from ods.dept;
 deptno | dname
--------+--------
     20 | 财务部
     40 | 销售部
     10 | 行政部
     30 | 教学部
(4 rows)

2)查询取别名

# 可以使用as,可以不使用
zxy=# select deptno as no1,deptno no2 from ods.dept;
 no1 | no2
-----+-----
  20 |  20
  40 |  40
  30 |  30
  10 |  10
(4 rows)

3)limit查询

# 1.查询并取三条数据
zxy=# select * from ods.emp limit 3;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7654 | 侯七  | 研发 | 1250 |     30
  7876 | 小李  | 行政 | 1100 |     10
  7521 | 王五  | 行政 | 1250 |     10
(3 rows)

# 2.根据empno升序排序,并取三条记录
zxy=# select * from ods.emp order by empno limit 3;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7369 | 张三  | 研发 |  800 |     30
  7499 | 李四  | 财务 | 1600 |     20
  7521 | 王五  | 行政 | 1250 |     10
(3 rows)

# 3.根据empno升序排序,从第3行开始取3条数据
zxy=# select * from ods.emp order by empno limit 3 offset 2;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7521 | 王五  | 行政 | 1250 |     10
  7566 | 赵六  | 销售 | 2975 |     40
  7654 | 侯七  | 研发 | 1250 |     30
(3 rows)

4)条件查询

zxy=# select * from ods.emp where ename = '王五';
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7521 | 王五  | 行政 | 1250 |     10
(1 row)

5)关系运算符

操作符支持的数据类型描述
A=B基本数据类型如果A等于B则返回true,反之返回false
A<=>B基本数据类型如果A和B都为null,则返回true,如果一边为null,返回false
A<>B, A!=B基本数据类型A或者B为null则返回null;如果A不等于B,则返回true,反之返回false
A <B基本数据类型A或者B为null,则返回null;如果A小于B,则返回true,反之返回false
A<=B基本数据类型A或者B为null,则返回null;如果A小于等于B,则返回true,反之返回false
A>B基本数据类型A或者B为null,则返回null;如果A大于B,则返回true,反之返回false
A>=B基本数据类型A或者B为null,则返回null;如果A大于等于B,则返回true,反之返回false
A [not] between B and C基本数据类型如果A,B或者C任一为null,则结果为null。如果A的值大于等于B而且小于或等于C,则结果为true,反之为false。如果使用not关键字则可达到相反的效果。
A is null所有数据类型如果A等于null,则返回true,反之返回false
A is not null所有数据类型如果A不等于null,则返回true,反之返回false
in(数值1,数值2)所有数据类型使用 in运算显示列表中的值
A [not] like Bstring 类型B是一个SQL下的简单正则表达式,也叫通配符模式,如果A与其匹配的话,则返回true;反之返回false。B的表达式说明如下:‘x%’表示A必须以字母‘x’开头,‘%x’表示A必须以字母‘x’结尾,而‘%x%’表示A包含有字母‘x’,可以位于开头,结尾或者字符串中间。如果使用not关键字则可达到相反的效果。
A rlike B, A regexp Bstring 类型B是基于java的正则表达式,如果A与其匹配,则返回true;反之返回false。匹配使用的是JDK中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串A相匹配,而不是只需与其字符串匹配。
# 1.查询sal等于1500
zxy=# select * from ods.emp where sal = 1500;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7844 | 小明  | 销售 | 1500 |     40
(1 row)

# 2.查询sal大于等于1500
zxy=# select * from ods.emp where sal >= 1500;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7566 | 赵六  | 销售 | 2975 |     40
  7844 | 小明  | 销售 | 1500 |     40
  7788 | 银十  | 行政 | 3000 |     10
  7839 | 小芳  | 销售 | 5000 |     40
  7499 | 李四  | 财务 | 1600 |     20
  7698 | 马八  | 研发 | 2850 |     30
  7782 | 金九  |      | 2450 |     30
  7902 | 小海  | 行政 | 3000 |     10
  7999 | 小八   | 行政 | 4000 |     10

(8 rows)

# 3.查询sql小于1500
zxy=# select * from ods.emp where sal < 1500;
 empno | ename  | job  | sal  | deptno
-------+--------+------+------+--------
  7521 | 王五   | 行政 | 1250 |     10
  7900 | 小元   | 讲师 |  950 |     30
  7369 | 张三   | 研发 |  800 |     30
  7934 | 小红明 | 讲师 | 1300 |     30
  7654 | 侯七   | 研发 | 1250 |     30
  7876 | 小李   | 行政 | 1100 |     10
(6 rows)

# 4.查询sal在1000和1500之间的
zxy=# select * from ods.emp where sal between 1000 and 1500;
 empno | ename  | job  | sal  | deptno
-------+--------+------+------+--------
  7654 | 侯七   | 研发 | 1250 |     30
  7876 | 小李   | 行政 | 1100 |     10
  7521 | 王五   | 行政 | 1250 |     10
  7844 | 小明   | 销售 | 1500 |     40
  7934 | 小红明 | 讲师 | 1300 |     30
(5 rows)

# 5.查询job为null的
zxy=# select * from ods.emp where job is null;
 empno | ename | job | sal  | deptno
-------+-------+-----+------+--------
  7782 | 金九  |     | 2450 |     30
(1 row)

# 6.通配符"_"查询明结尾
zxy=# select * from ods.emp where ename like '_明';
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7844 | 小明  | 销售 | 1500 |     40
(1 row)

# 7.通配符"%"查询明结尾
zxy=# select * from ods.emp where ename like '%明';
 empno | ename  | job  | sal  | deptno
-------+--------+------+------+--------
  7844 | 小明   | 销售 | 1500 |     40
  7934 | 小红明 | 讲师 | 1300 |     30
(2 rows)

6)逻辑运算符

操作符含义
and逻辑并
or逻辑或
not逻辑否
# 1.查询研发岗位,工资大于1000
zxy=# select * from ods.emp where job = '研发' and sal > 1000;
 empno | ename | job  | sal  | deptno
-------+-------+------+------+--------
  7654 | 侯七  | 研发 | 1250 |     30
  7698 | 马八  | 研发 | 2850 |     30
(2 rows)

# 2.查询研发岗位,或者工资大于1000
zxy=# select * from ods.emp where job = '研发' or sal > 1000;
 empno | ename  | job  | sal  | deptno
-------+--------+------+------+--------
  7654 | 侯七   | 研发 | 1250 |     30
  7876 | 小李   | 行政 | 1100 |     10
  7521 | 王五   | 行政 | 1250 |     10
  7566 | 赵六   | 销售 | 2975 |     40
  7844 | 小明   | 销售 | 1500 |     40
  7788 | 银十   | 行政 | 3000 |     10
  7839 | 小芳   | 销售 | 5000 |     40
  7369 | 张三   | 研发 |  800 |     30
  7499 | 李四   | 财务 | 1600 |     20
  7698 | 马八   | 研发 | 2850 |     30
  7902 | 小海   | 行政 | 3000 |     10
  7934 | 小红明 | 讲师 | 1300 |     30
  7782 | 金九   |      | 2450 |     30
  7999 | 小八   | 行政 | 4000 |     10
(13 rows)

# 3.查询岗位不是研发,行政的
zxy=# select * from ods.emp where job not in ('研发','行政');
 empno | ename  | job  | sal  | deptno
-------+--------+------+------+--------
  7839 | 小芳   | 销售 | 5000 |     40
  7566 | 赵六   | 销售 | 2975 |     40
  7844 | 小明   | 销售 | 1500 |     40
  7900 | 小元   | 讲师 |  950 |     30
  7499 | 李四   | 财务 | 1600 |     20
  7934 | 小红明 | 讲师 | 1300 |     30
(6 rows)

7)聚合函数

聚合函数含义
count()表示统计行数
max()求最大值,不含null,除非所有值都是null
min()求最小值,不包含null,除非所有值都是null
sum()求和,不包含null
avg()求平均值,不包含null
# 统计emp表有多少条数据,最大sal、最小sal、sal合计、sal平均值
zxy=# select count(*),max(sal) max_sal,min(sal) min_sal,sum(sal) sum_sal,avg(sal) avg_sal from ods.emp;
 count | max_sal | min_sal | sum_sal |     avg_sal
-------+---------+---------+---------+------------------
    14 |    5000 |     800 |   29025 | 2073.21428571429
(1 row)


3.3 分组查询

1)Group By语句

Group By语句通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后执行对应的聚合操作。查询时如果使用Group BY,那么Select查询的字段只能包括Group By后的字段。

# 1.查看各岗位总工资多少
zxy=# select job,sum(sal) sal from ods.emp group by job;
 job  | sal
------+------
 行政 | 8350
 讲师 | 2250
      | 2450
 销售 | 9475
 研发 | 4900
 财务 | 1600
(6 rows)

# 2.查看各岗位最大工资、最小工资、平均工资
zxy=# select job,max(sal),min(sal),avg(sal) from ods.emp group by job;
 job  | max  | min  |       avg
------+------+------+------------------
 销售 | 5000 | 1500 | 3158.33333333333
 研发 | 2850 |  800 | 1633.33333333333
 财务 | 1600 | 1600 |             1600
 行政 | 3000 | 1100 |           2087.5
 讲师 | 1300 |  950 |             1125
      | 2450 | 2450 |             2450
(6 rows)

2)Having语句

where后面不能跟分组聚合函数,而having后面可以且只能使用分组聚合函数,不可以使用聚合函数的别名。

having只用于group by分组统计语句。

# 1.查询岗位人数大于3的岗位
zxy=# select job,count(*) from ods.emp group by job having count(*) > 3;
 job  | count
------+-------
 行政 |     4
(1 row)

3.4 联合查询

1)等值JSON

只有两个表中都符合条件的数据才能保留下来;

查询行政部有哪些人?

select *
from ods.dept
join ods.emp on dept.deptno = emp.deptno
where dept.dname = '行政部';


zxy=# select *
zxy-# from ods.dept
zxy-# join ods.emp on dept.deptno = emp.deptno
zxy-# where dept.dname = '行政部';
 deptno | dname  | loc  | empno | ename | job  | sal  | deptno
--------+--------+------+-------+-------+------+------+--------
     10 | 行政部 | 1700 |  7521 | 王五  | 行政 | 1250 |     10
     10 | 行政部 | 1700 |  7788 | 银十  | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7902 | 小海  | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7876 | 小李  | 行政 | 1100 |     10
(4 rows)

2)内连接

只有两个表中都符合条件的数据才能保留下来,默认的join即为inner join内连接。

查询行政部有哪些人?

select *
from ods.dept
join ods.emp on dept.deptno = emp.deptno
where dept.dname = '行政部';


zxy=# select *
zxy-# from ods.dept
zxy-# join ods.emp on dept.deptno = emp.deptno
zxy-# where dept.dname = '行政部';
 deptno | dname  | loc  | empno | ename | job  | sal  | deptno
--------+--------+------+-------+-------+------+------+--------
     10 | 行政部 | 1700 |  7521 | 王五  | 行政 | 1250 |     10
     10 | 行政部 | 1700 |  7788 | 银十  | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7902 | 小海  | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7876 | 小李  | 行政 | 1100 |     10
     10 | 行政部 | 1700 |  7999 | 小八   | 行政 | 4000 |     10

(4 rows)

3)左外连接

左外连接:left join操作符,左边的所有记录将会返回,右表匹配不到的返回空。

select *
from ods.dept
left join ods.emp on dept.deptno = emp.deptno
where dept.dname = '后勤部';


zxy=# select *
zxy-# from ods.dept
zxy-# left join ods.emp on dept.deptno = emp.deptno
zxy-# where dept.dname = '后勤部';
 deptno | dname  | loc  | empno | ename | job | sal | deptno
--------+--------+------+-------+-------+-----+-----+--------
     50 | 后勤部 | 1800 |       |       |     |     |
(1 row)

4)右外连接

右外连接:right join操作符,右边的所有记录返回,左边匹配不到的为空。

select *
from ods.emp
right join ods.dept on emp.deptno = dept.deptno
where dept.dname = '后勤部';


zxy=# select *
zxy-# from ods.emp
zxy-# right join ods.dept on emp.deptno = dept.deptno
zxy-# where dept.dname = '后勤部';
 empno | ename | job | sal | deptno | deptno | dname  | loc
-------+-------+-----+-----+--------+--------+--------+------
       |       |     |     |        |     50 | 后勤部 | 1800
(1 row)

5)全连接

全连接:full join操作符,返回两个表中所有数据,如果有不符合条件的返回空。

select *
from ods.dept
full join ods.emp on dept.deptno = emp.deptno;


zxy=# select *
zxy-# from ods.dept
zxy-# full join ods.emp on dept.deptno = emp.deptno;
 deptno | dname  | loc  | empno | ename  | job  | sal  | deptno
--------+--------+------+-------+--------+------+------+--------
     10 | 行政部 | 1700 |  7788 | 银十   | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7902 | 小海   | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7521 | 王五   | 行政 | 1250 |     10
     10 | 行政部 | 1700 |  7876 | 小李   | 行政 | 1100 |     10
     10 | 行政部 | 1700 |  7999 | 小八   | 行政 | 4000 |     10
     30 | 教学部 | 1900 |  7369 | 张三   | 研发 |  800 |     30
     30 | 教学部 | 1900 |  7698 | 马八   | 研发 | 2850 |     30
     30 | 教学部 | 1900 |  7934 | 小红明 | 讲师 | 1300 |     30
     30 | 教学部 | 1900 |  7782 | 金九   |      | 2450 |     30
     30 | 教学部 | 1900 |  7900 | 小元   | 讲师 |  950 |     30
     30 | 教学部 | 1900 |  7654 | 侯七   | 研发 | 1250 |     30
     20 | 财务部 | 1800 |  7499 | 李四   | 财务 | 1600 |     20
     40 | 销售部 | 1700 |  7844 | 小明   | 销售 | 1500 |     40
     40 | 销售部 | 1700 |  7839 | 小芳   | 销售 | 5000 |     40
     40 | 销售部 | 1700 |  7566 | 赵六   | 销售 | 2975 |     40
     50 | 后勤部 | 1800 |       |        |      |      |
(15 rows)

6)笛卡尔积

无条件关联两个表,会产生笛卡尔积,两边数据互相连接。

例如查询行政部,笛卡尔积可以匹配到所有的员工名单

zxy=# select *
zxy-# from ods.dept,ods.emp
zxy-# where dname = '行政部';
 deptno | dname  | loc  | empno | ename  | job  | sal  | deptno
--------+--------+------+-------+--------+------+------+--------
     10 | 行政部 | 1700 |  7521 | 王五   | 行政 | 1250 |     10
     10 | 行政部 | 1700 |  7566 | 赵六   | 销售 | 2975 |     40
     10 | 行政部 | 1700 |  7844 | 小明   | 销售 | 1500 |     40
     10 | 行政部 | 1700 |  7900 | 小元   | 讲师 |  950 |     30
     10 | 行政部 | 1700 |  7788 | 银十   | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7839 | 小芳   | 销售 | 5000 |     40
     10 | 行政部 | 1700 |  7654 | 侯七   | 研发 | 1250 |     30
     10 | 行政部 | 1700 |  7876 | 小李   | 行政 | 1100 |     10
     10 | 行政部 | 1700 |  7369 | 张三   | 研发 |  800 |     30
     10 | 行政部 | 1700 |  7499 | 李四   | 财务 | 1600 |     20
     10 | 行政部 | 1700 |  7698 | 马八   | 研发 | 2850 |     30
     10 | 行政部 | 1700 |  7902 | 小海   | 行政 | 3000 |     10
     10 | 行政部 | 1700 |  7934 | 小红明 | 讲师 | 1300 |     30
     10 | 行政部 | 1700 |  7782 | 金九   |      | 2450 |     30
     10 | 行政部 | 1700 |  7999 | 小八   | 行政 | 4000 |     10
(14 rows)

7)联合查询

union 和 union all都是上下拼接SQL的结果,union会去重,union all不去重。

# 1.union all不去重
zxy=# select empno,ename from ods.emp where ename = '王五'
zxy-# union all select empno,ename from ods.emp where ename = '王五';
 empno | ename
-------+-------
  7521 | 王五
  7521 | 王五
(2 rows)

# 2.union去重
zxy=# select empno,ename from ods.emp where ename = '王五'
zxy-# union select empno,ename from ods.emp where ename = '王五';
 empno | ename
-------+-------
  7521 | 王五
(1 row)

3.5 排序

Order By全局排序,默认是asc升序排序,可以指定desc降序排序。

# 1.默认根据deptno升序查询表
zxy=# select deptno,dname,loc from ods.dept order by deptno;
 deptno | dname  | loc
--------+--------+------
     10 | 行政部 | 1700
     20 | 财务部 | 1800
     30 | 教学部 | 1900
     40 | 销售部 | 1700
     50 | 后勤部 | 1800
(5 rows)

# 2.根据deptno升序查询表
zxy=# select deptno,dname,loc from ods.dept order by deptno asc;
 deptno | dname  | loc
--------+--------+------
     10 | 行政部 | 1700
     20 | 财务部 | 1800
     30 | 教学部 | 1900
     40 | 销售部 | 1700
     50 | 后勤部 | 1800
(5 rows)

# 3.根据deptno降序查询表
zxy=# select deptno,dname,loc from ods.dept order by deptno desc;
 deptno | dname  | loc
--------+--------+------
     50 | 后勤部 | 1800
     40 | 销售部 | 1700
     30 | 教学部 | 1900
     20 | 财务部 | 1800
     10 | 行政部 | 1700
(5 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/339017.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.上传图片到Minio服务中

上传图片 界面原型 第一步: 用户在课程信息编辑界面可以上传课程图片或者修改上传的课程图片 第二步: 请求媒资管理服务将课程图片上传至分布式文件系统同时在媒资管理数据库保存文件信息,上传成功后返回图片在MinIO中的地址 第三步: 请求内容管理服务保存课程信息含课程封…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Linux系统编程】进程优先级

文章目录 1. 优先级的基本概念2. 为什么存在优先级3. 查看系统进程4. PRI and NI5. top命令修改已存在进程的nice值6. 其他概念 1. 优先级的基本概念 本篇文章讲解进程优先级&#xff0c;首先我们来了解一下进程优先级的概念&#xff1a; cpu资源分配的先后顺序&#xff0c;就…

burp靶场--访问控制【越权】

【Burp系列】超全越权漏洞实验总结 https://portswigger.net/web-security/access-control/lab-unprotected-admin-functionality 1. 访问控制【越权】 https://portswigger.net/web-security/access-control#what-is-access-control ### 什么是访问控制&#xff1a; 访问控…

php基础学习之常量

php常量的基本概念 常量是在程序运行中的一种不可改变的量&#xff08;数据&#xff09;&#xff0c;常量一旦定义&#xff0c;通常不可改变&#xff08;用户级别&#xff09;。 php常量的定义形式 使用define函数&#xff1a;define("常量名字", 常量值);使用cons…

Mac NTFS 磁盘读写工具选哪个好?Tuxera 还是 Paragon?

在使用 Mac 电脑时&#xff0c;我们经常需要读写 NTFS 格式的硬盘或 U 盘。然而&#xff0c;由于 Mac 系统不支持 NTFS 格式的读写&#xff0c;因此我们需要借助第三方工具来实现这个功能。而在市场上&#xff0c;Tuxera 和 Paragon 是两款备受推崇的 Mac NTFS 磁盘读写工具。那…

GSP专版软件系统(医疗器械进销存)

产品概述 软件完全符合药监局GSP认证要求&#xff0c;可订制其它平台的数据对接; 业务流程清晰&#xff0c;操作简单合理&#xff0c;软件速度非常快; 完善的序列号(UDI)管理,并与整个系统融合在一起; 财务账和业务账完美结合; 可自定义的界面、布局管理;灵活的打印样式设计; 可…

有关软件测试的,任何时间都可以,软件测试主要服务项目:测试用例 报告 计划

有关软件测试的&#xff0c;任何时间都可以&#xff0c;软件测试主要服务项目&#xff1a; 1. 测试用例 2. 测试报告 3. 测试计划 4. 白盒测试 5. 黑盒测试 6. 接口测试 7.自动…

Vuex的基础使用

在使用之前要先了解Vuex的组成结构&#xff0c;跟对应的使用关系。 在上图的结构图中可以看到四个组成部分&#xff0c;首先是Components&#xff08;组件&#xff09;、Actions&#xff08;行动&#xff09;、Mutations&#xff08;变化&#xff09;、state&#xff08;状态/数…

Mysql运维篇(三) MySQL数据库分库分表方案

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、前言 关系型数据库本身比较容易成为系统瓶颈&#xff0c;单机存储容量、连接数、处理能力都有限。当单表的数…

【MySQL进阶】SQL优化

文章目录 SQL 优化主键优化数据组织方式页分裂页合并主键设计原则 insert优化order by优化group by优化limit优化count优化 SQL 优化 主键优化 数据组织方式 在InnoDB存储引擎中&#xff0c;表数据都是根据主键顺序组织存放的&#xff0c;这种存储方式的表称为索引组织表 在In…

【5G 接口协议】N2接口协议NGAP(NG Application Protocol)介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

PIG框架学习3——Redisson 实现业务接口幂等

零、前言 ​ 业务接口幂等问题是在开发中遇到的&#xff0c;如果对业务接口代码不进行幂等控制&#xff0c;并且在前端没有对请求进行限制的情况下&#xff0c;可能会出现多次对接口调用&#xff0c;导致错误异常的发生。就上述情况&#xff0c;对PIGX自带的业务接口幂等实现进…

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件

在日常使用电脑时&#xff0c;我们可能会碰到一些系统错误提示&#xff0c;比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题&#xff0c;本文将深入探讨其成因&#xff0c;并提供几种不同的mfc100.dll解决方案。…

lv14 内核定时器 11

一、时钟中断 硬件有一个时钟装置&#xff0c;该装置每隔一定时间发出一个时钟中断&#xff08;称为一次时钟嘀嗒-tick&#xff09;&#xff0c;对应的中断处理程序就将全局变量jiffies_64加1 jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量&#xff0…

三.Winform使用Webview2加载本地HTML页面

Winform使用Webview2加载本地HTML页面 往期目录创建Demo2界面创建HTML页面在Demo2窗体上添加WebView2和按钮加载HTML查看效果 往期目录 往期相关文章目录 专栏目录 创建Demo2界面 经过前面两小节 一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定…

用立创EDA(专业版)设计原理图

简介 立创EDA&#xff0c;国产的EDA工具。 下载 官方下载链接 下载后&#xff0c;直接一直下一步&#xff0c;最后安装提示免费激活即可。 注意 嘉立创EDA专业版的数据和立创EDA标准版的数据不互通&#xff0c; 常用原理图绘制设置 开发流程 新建工程绘制PCB 文件->新…

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、sqlite3介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&…

【数据结构】 双链表的基本操作 (C语言版)

目录 一、双链表 1、双链表的定义&#xff1a; 2、双链表表的优缺点&#xff1a; 二、双链表的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、双链表的初始化 4、双链表表插入 5、双链表的查找 6、双链表的取值 7、求双链表长度 8、双链表…

2023年12月 Scratch 图形化(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( ) A:9 B:17 C:21 D:5 答案:C 左上角的数=下面两个数的和+右上角的数