[toc]

本篇是 ORACLE、MySQL、PostgreSQL 客户端 sqlplus,mysql,psql 常用命令对比 系列文章的第三篇。第一篇是在 1/16日发布,第二篇是1/20日发布,现在是第三篇,就这样鸽了半年。

ORACLE、MySQL、PostgreSQL 客户端 sqlplus,mysql,psql 常用命令对比(一) 客户的安装以及连接数据库

ORACLE、MySQL、PostgreSQL 客户端 sqlplus,mysql,psql 常用命令对比(二)提示符的配置

刚接触PG的时候有个事情最疑惑,就是有时候输入exit会提醒我 Use \q to quit. 有时候不会,而有些时候呢,他不提醒我,就可以直接退出。

1
2
3
4
abc=# select * from
abc-# exit
Use \q to quit.
abc-# \q

后来才搞明白,原来是上一个查询没结束的时候,会提醒\q 退出。虽然这个提醒很友好,但是对我来说很困惑,主要是你在书写换行的输入(也就是未完成的一个完整的sql)提示符是跟重新输入的提示符是完全一样的(就在写这篇文章的时候发现是不一样的,稍微有点区别。。。)。

mysql的提示如下:

1
2
3
mysql> select * from
-> liups
-> where

这个提示符跟重新输入一个完整查询的提示符是有区别的,可以知道这是未完成的输入。

sqlplus 的提示符,这也很明显是一个查询没有完成。

1
2
3
SQL> select * from
2 liups
3 where

psql 的提醒就完全不一样了,未完成的语句, 就在刚才,也就我写这篇文章的时候,才发现,是有区别的,是有区别的,是有区别的,之前是我眼神不济,是我眼神不济,是我眼神不济,是由 =# 变成了 -# ,普通用户是由 => 变成了 -> ,其中唯一的变化是有 = 变成了 - ,而且还是在中间夹杂着变化了。
其实你仔细观察 MySQL 也是变成了 -,但是这个 - (减号我通常叫横线) 不是主要的,主要的是 前面的 mysql 标识没了,同时他是又 > 变成了 -> ,也就是新增了长度,同时前面的 mysql 标识去掉了,很容易分辨,但是 psql,就是由 = 变成了 - ,辨识度有一点点低。

1
2
3
4
5
psql abc
abc=# select *
abc-# from
abc-# liups
abc-# where

其实我觉得 PROMPT2 设置成带行号跟 sqlpus 那样更好,跟 mysql 那样也可以。

这是带行号,前后带空格的,跟 ORACLE 的 sqlplus 类似

psqlsqlplus 类似的提示符:

1
2
3
4
abc=# \set PROMPT2 '    %l  '
abc=# select *
2 from
3 liups;

psqlmysql 类似的提示符:

1
2
3
4
5
abc=# \set PROMPT2 '  %[%033[1;31m%]%R%[%033[0m%]%# '
abc=# select *
-# from
-# liups
-# ;

命令行结束符

三种数据库都主要以 分号(;) 为结束符。

mysql 命令行结束符

但是 mysql 还可以以\g 和\G 作为结束符。

ego (\G) Send command to mysql server, display result vertically.
go (\g) Send command to mysql server.

其中 \G 可以竖直的形式展示,\g 等价于 ; ,如同如下演示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql> select * from cards limit 3\g
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 1 | 10 | 1 | 10 | 1 |
| 2 | 9 | 1 | 10 | 1 |
| 3 | 8 | 1 | 10 | 1 |
+----+----+----+----+----+
3 rows in set (0.00 sec)

mysql> select * from cards limit 3;
+----+----+----+----+----+
| id | c1 | c2 | c3 | c4 |
+----+----+----+----+----+
| 1 | 10 | 1 | 10 | 1 |
| 2 | 9 | 1 | 10 | 1 |
| 3 | 8 | 1 | 10 | 1 |
+----+----+----+----+----+
3 rows in set (0.00 sec)

mysql> select * from cards limit 3\G
*************************** 1. row ***************************
id: 1
c1: 10
c2: 1
c3: 10
c4: 1
*************************** 2. row ***************************
id: 2
c1: 9
c2: 1
c3: 10
c4: 1
*************************** 3. row ***************************
id: 3
c1: 8
c2: 1
c3: 10
c4: 1
3 rows in set (0.00 sec)

psql 命令行结束符

psql 呢,\g 也等价于分号; (可以通过help 查看到 \g or terminate with semicolon to execute query)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abc=# help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
abc=# select * from liups\g
id | data_column
----+-------------
1 | Data 1
2 | Data 2
3 | Data 3
(3 rows)

abc=# select * from liups;
id | data_column
----+-------------
1 | Data 1
2 | Data 2
3 | Data 3
(3 rows)

abc=#

sqlplus 命令行结束符

sqlplus 呢,他就有点复杂了,

sqlplus 联机文档地址:http://download.oracle.com/docs/cd/E11882_01/server.112/e16604/ch_four.htm#i1039255

[原文]

Ending a SQL Command
You can end a SQL command in one of three ways:

  • with a semicolon (;)
  • with a slash (/) on a line by itself
  • with a blank line

可以通过下面三种方式来结束SQL命令:

  • 使用一个分号(;);
  • 在单独一行使用一个斜划线(/);
  • 使用一个空行;

键入分号就是告诉 sqlplus 你将要执行命令,通常在命令最后一行的末尾;

像例子中表示的那样:sqlplus 进程将 SQL 命令存储在 SQL 缓冲中,可以查看 SQL 细节。如果你在输入分号之前错误的按了回车键,sqlplus将会提示你在下一行继续输入命令,直到你键入分号然后按回车键执行命令为止。

斜划线独自占一行的意思就是告诉 sqlplus 你将要执行命令了。在命令的最后 一行按回车,sqlplus提示你下一个行号,然后可以键入斜划线,然后按回车,则执行命令。sqlplus将执行的命令存储在缓冲里。

空行在SQL语句或脚本中表示你想结束键入命令,但不执行。当你在命令的最后一行按回车键,sqlplus提示你下一行号。

总结:记住都是以分号(;)结束就好了,再记住 mysql 的\G 是以竖直的方式显示就好了。

显示当前用户

sqlplus mysql psql
show user select current_user;
select user();
select * from current_user;
select user;

注意⚠️:MySQL 中的 select current_user;和 select user();的区别:

1
SELECT current_user;
  • 返回当前会话正在使用的用户账户。
  • 这个账户可能是通过 GRANT 语句赋予权限的账户。
  • 反映的是当前连接的实际权限。
1
SELECT user();
  • 返回客户端最初连接到 MySQL 服务器时使用的用户账户。
  • 这个值在整个连接期间保持不变。
  • 不受 GRANT 语句或 DEFINER 权限的影响。

显示当前数据库

sqlplus mysql psql
show parameter db_name select database(); select current_database();

显示所有用户

sqlplus mysql psql
select username from dba_users select user,host from mysql.user; \du;
SELECT usename FROM pg_user;

显示所有数据库

sqlplus mysql psql
- show databases; \l;
\l+;

创建数据库(database)

sqlplus mysql psql
dbca 命令 create database; create database

注意:数据库(database)和 schema的区别:

MySQL 中 databaseschema 是相同的,可以通过help create database; 来看到。

1
2
3
4
5
6
7
8
9
10
11
12
13
help create database;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...

create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}

PostgreSQL 中 schemadatabase 是不同的。这里我问了下AI,给我提供了以下区别:

在 PostgreSQL 中,数据库(database)和模式(schema)是两个不同层级的组织结构,它们有着明显的区别。让我们详细比较一下:

  1. 层级
  • Database:是最高层级的容器。
  • Schema:是数据库内的一个命名空间。
  1. 包含关系
  • 一个 PostgreSQL 实例可以包含多个数据库。
  • 一个数据库可以包含多个模式。
  1. 隔离性
  • Database:完全隔离,不同数据库的对象不能直接互相访问。
  • Schema:同一数据库内的不同模式可以互相访问(如果有权限)。
  1. 连接
  • 连接到 PostgreSQL 时,你必须指定一个数据库。
  • 连接后,可以在不同的模式间切换。
  1. 默认情况
  • 每个新建的数据库都会自动创建一个名为 “public” 的默认模式。
  • 数据库没有默认名称,必须明确创建。
  1. 用途
  • Database:通常用于分隔不同的应用或项目。
  • Schema:用于在同一数据库内组织对象,如表、视图、函数等。
  1. 权限管理
  • Database:可以控制谁可以连接到数据库。
  • Schema:可以更细粒度地控制对特定对象组的访问。
  1. 命名空间
  • 不同数据库中的对象名称可以重复。
  • 同一数据库不同模式中的对象名称可以重复。
  1. 资源隔离
  • Database:提供更强的资源隔离,可以有独立的配置。
  • Schema:主要提供逻辑隔离,共享数据库资源。
  1. 备份和恢复
  • 通常以数据库为单位进行备份和恢复。
  • 模式级别的备份需要特殊处理。
  1. 创建语法
  • Database: CREATE DATABASE dbname;
  • Schema: CREATE SCHEMA schemaname;
  1. 使用场景
  • Database:不同的客户、完全独立的应用。
  • Schema:同一应用的不同模块、多租户系统中的租户隔离。
  1. 切换
  • Database:需要重新连接。
  • Schema:可以在同一连接中切换(SET search_path TO myschema;)。

总结:

  • 数据库提供了更高层次的隔离和组织,适合完全独立的应用或项目。
  • 模式提供了数据库内部的逻辑分组,适合同一应用内的模块化组织或多租户隔离。

ORACLE 中 databaseschema 的区别

通过 ORACLE 的 database 是整个 Oracle 实例,通常一个实例管理一个数据库,包含所有的数据文件、控制文件、重做日志文件等。

schema 在 oracle 中 基本上等同于用户账户,每个用户账户自动拥有一个与其用户名同名的schema,schema是数据库对象(如表、视图、存储过程等)的集合。

ORACLE 中 database 是通过 dbca 复杂的命令来创建的,而 schema 是通过 create user 来创建。

进入数据库

进入数据库 abc

sqlplus mysql psql
- use abc; \c abc

退出数据库

sqlplus mysql psql
exit/quit exit/quit exit/quit/\q

查看表结构

sqlplus mysql psql
desc tablename desc tablename \d tablename

显示 sql 运行时间

sqlplus mysql psql
set timing on
set timing off
默认显示 \timing on
\timing off

sqlplus 是通过 set timing on/set timing off 来显示或者取消sql 运行时间,其中ofoff 是必填项。psql 是 执行一次 \timing 是显示,再执行一次就是取消,或者使用 on/off 来显示或者取消,on/off 不是必填项。

编辑 SQL

sqlplus mysql psql
edit edit \e

清空屏幕或者其他操作系统命令

sqlplus mysql psql
!clear system clear \! clear

注意:sqlplus 和 psql 都是!调用os 命令,但是 sqlplus 的 和 命令之间可以有空格也可以没有空格,但是 psql 的 ! 前面需要加\ ,同时 !和 命令之间必须要有个空格,不光clear 命令可以使用,其他的操作系统命令也都可以使用,比如 hostnameifconfig

执行 sql 文件

sqlplus mysql psql
@c.sql source c.sql \i c.sql

原文作者: liups.com

原文链接: http://liups.cn/posts/159adffb/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议