第二十三章:使用数据库

MySQL数据库

MySQL客户端界面

mysql命令行参数

参数 描述
-A 禁用自动重新生成哈希表
-b 禁用 出错后的beep声
-B 不使用历史文件
-C 压缩客户端和服务器之间发送的所有消息
-D 指定要用的数据库
-e 执行指定语句并退出
-E 竖直方向显示查询输出,每行一个数据字段
-f 如果有SQL错误产生,继续执行
-G 使能命名命令的使用
-h 指定MySQL服务器主机名(默认为localhost)
-H 用HTML代码显示查询输出
-i 忽略函数名后的空格
-N 结果中不显示列名
-o 忽略语句,除了在命令行上命名的默认数据库的语句
-p 为用户账户提示输入命令
-P 指定网络连接用的TCP端口号 
-q 不缓存每条查询结果
-r 显示列输出,不转义
-s 使用安静模式
-S 为本地(localhost)连接指定一个套接字
-t 以表的形式显示输出
-T 在程序退出时显示调试信息、内存以及CPU统计信息
-u 指定登录用户名
-U 只允许指定了键值的UPDATE和DELETE语句
-v 使用详细模式
-w 如果连接没有完成,等待并重试 
-X 用XHTML代码显示查询输出 

mysql命令不加任何参数,则会使用Linux登录名连接本地的MySQL服务器。

使用-u指定用户名,-p则告诉mysql提示输出相应的密码

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.1.72-0ubuntu0.10.04.1 (Ubuntu) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

mysql使用两种不同类型的命令:

1.特殊的mysql命令

2.标准SQL语句

mysql命令

命令 简写命令 描述
? \? 帮助信息
clear \c 清空命令
connect \r 连接到数据库和服务器
delimiter \d 设置SQL语句分隔符
edit \e 用命令行编辑器编辑命令
ego \G 将命令发送到MySQL服务器并垂直显示结果
exit \q 退出mysql程序
go \g 将命令发送到MySQL服务器
help \h 显示帮助信息
nopaper \n 禁用输出分页并将输出发送到STDOUT
note \t 不要将输出发送到输出文件
paper \P 将分页命令设为指定的程序(默认是more)
print \p 打印当前命令
prompt \R 修改mysql命令提示符
quit \q 退出mysql程序(同exit)
rehash \# 重新构建命令补全哈希表
source \. 执行指定文件中的SQL脚本
status \s 从MySQL服务器提取状态信息
system \! 在系统上执行shell命令
tee \T 将所有输出附加到指定文件中
use \u 使用另外一个数据库
charset \C 切换到另一个字符集
warnings \W 在每条语句之后显示警告消息
nowarnings \w 不要在每条语句之后显示警告消息

SHOW可以查看数据库信息,比如:

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
+--------------------+
2 rows in set (0.00 sec)

也可以查看数据库中的表信息

mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
23 rows in set (0.00 sec)

mysql里面的数据库命令是不区分大小写的,但是习惯是使用大写字母

创建MySQL数据库对象

创建数据库:

CREATE DATABASES +库名

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)

创建用户账户

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO test_user IDENTIFIED by 'pwd';

GRANT SELECT,INSERT,UPDATE,DELETE说明了可以对数据库进行增删改查

ON test.*指定了作用在test数据库上面的所有表(格式为database.table)

TO test_user IDENTIFIED by 'pwd'指定了账户为test_user,如果test_user账户不存在,则自动创建,IDENTIFIED by允许设置默认密码,此处密码为pwd

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO test_user IDENTIFIED by 'pwd';
Query OK, 0 rows affected (0.00 sec)

之后就可以使用新账户登录了

$ mysql test -u test_user -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 59
Server version: 5.1.72-0ubuntu0.10.04.1 (Ubuntu) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

PostgreSQL数据库

PostgreSQL命令行界面

psql命令行参数

简写名称 完整名称 描述
-a --echo-all 在输出中显示脚本文件中执行的所有SQL行
-A --no-align 将输出格式设为非对齐模式,数据不显示或格式化的表
-c --command 执行指定的SQL语句并退出
-d --dbname 指定要连接的数据库
-e --echo-queries 将所有的查询输出到屏幕上
-E --echo-hidden 将隐藏的psql元命令输出到屏幕上
-f --file 执行指定文件中的SQL命令并退出
-F --field-separator 指定在非对齐模式中分开列表数据的字符。默认是逗号
-h --host 指定远程PostgreSQL服务器的IP地址或主机名
-l --list 显示服务器上已有的数据库列表并退出
-o --output 将查询输出重定向到指定文件中
-p --post 指定要连接的PostgreSQL服务器的TCP端口
-P --pset 将表打印选项设为指定的值
-q --quiet 安静模式,不会显示输出消息
-R --record-separator 将指定字符做为数据行分隔符。默认为换行符
-s --single-step 在每个SQL查询后 提示继续还是退出
-S --single-line 指定回车键而不是分号为一个SQL查询的结束
-t --tuples-only 在表输出中禁用列的头部和尾部
-T --table-attr 在HTML模式时使用指定的HTML表标签
-U --username 使用指定的用户名连接PostgreSQL服务器
-v --variable 将指定变量设成指定值
-V --version 显示psql版本号并退出
-W --password 强制命令提示符
-x --expanded 使能扩展表输出以显示数据行的额外信息
-X --nopsqlrc 不要运行psql启动文件
-? --help 显示psql命令行帮助信息并退出

PostgreSQL管理员账户为postgres,而不是root

如果当前Linux登录账户不是postgres,那么需要使用sudo来以postgres账户运行psql

$ sudo -u postgres psql
[sudo] password for su1216:
psql (8.4.17)
Type "help" for help. postgres=#

提示符#表示已经做为管理员登录psql。

psql使用两种不同类型的命令:

1.Postgre元命令

2.标准SQL语句

Postgre元命令可以方便的获取数据库环境确切信息,还具有psql会话的set功能。

元命令用反斜线标示。

常用的元命令:

\l:列出已有数据库

\c:连接到数据库

\dt:列出数据库中的表

\du列出Postgre的用户

\z:列出表的权限
\?:列出所有可用元命令

\h:列出所有可用SQL命令

\q:退出数据库

postgres=# \l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-----------+-------------+-----------------------
postgres | postgres | UTF8 | C | zh_CN.UTF-8 |
template0 | postgres | UTF8 | C | zh_CN.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | C | zh_CN.UTF-8 | =c/postgres
: postgres=CTc/postgres
(3 rows)

创建PostgreSQL数据库对象

CREATE DATABASE +库名

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-----------+-------------+-----------------------
postgres | postgres | UTF8 | C | zh_CN.UTF-8 |
template0 | postgres | UTF8 | C | zh_CN.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | C | zh_CN.UTF-8 | =c/postgres
: postgres=CTc/postgres
test | postgres | UTF8 | C | zh_CN.UTF-8 |
(4 rows) postgres=# \c test
psql (8.4.17)
You are now connected to database "test".
test=#

连接到test数据库上的时候,psql的提示符变了,显示的是连接的数据库名称

说明:PostgreSQL在数据库增加了一个控制层,称为模式(schema)。

数据库可以有多个模式,每个模式包含多个表。

默认情况下,每个数据库都有一个称为public的模式。上面的例子中使用的就是public模式。

PostgreSQL中用户账户称为登录角色(Login Role)。PostgreSQL会将登录角色和Linux系统用户账户匹配。

所以有两种常用方法来创建登录角色来运行访问PostgreSQL数据库的shell脚本:

1.创建一个和PostgreSQL登录角色对应的特殊Linux账户来运行所有的shell脚本

2.为每个需要运行shell脚本来访问数据库的Linux用户账户创建PostgreSQL账户

CREATE ROLE +名称

test=# CREATE ROLE su login;
CREATE ROLE
test=#

这样就建立了一个角色,如果不使用login参数的话,则不允许登录到PostgreSQL服务器,但可以被授予一些权限。这种角色类型称为组角色(group role)。

PostgreSQL不允许将所有权限赋给匹配到表一级的所有数据库对象,需要为每一个新建的表授予权限。

使用数据表

创建数据表

在创建新表前确保用管理员用户账户(MySQL中的root用户,PostgreSQL中的postgres用户)登录来创建表

MySQL和PostgreSQL的数据类型

数据类型 描述
char 定长字符串值
varchar 变长字符串值
int 整数值
float 浮点值
Boolean 布尔类型true/false值
Date YYYY-MM-DD格式的日期值
Time HH:mm:ss格式的时间值
Timestamp 日期和时间值的组合
Text 长字符串值
BLOB 大的二进制值

使用CREATE TABLE建立表

test=# CREATE TABLE employees (
test(# empid int not null,
test(# lastname varchar(30),
test(# firstname varchar(30),
test(# salary float,
test(# primary key (empid));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "employees_pkey" for table "employees"
CREATE TABLE test=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+----------
public | employees | table | postgres
(1 row)

在psql中还需要在表一级分配权限。

test=# GRANT SELECT,INSERT,DELETE,UPDATE ON public.employees TO su;
GRANT

以postgres登录角色来执行,并连接到test数据库,且必须指定模式名。

插入和删除数据

关于SQL部分,这里不做详细笔记。

mysql> CREATE TABLE employees (
-> empid int not null,
-> lastname varchar(30),
-> firstname varchar(30),
-> salary float,
-> primary key (empid));
Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO employees VALUES (1,'Blum', 'Rich', 1234.5);
Query OK, 1 row affected (0.03 sec)

查询数据

mysql> SELECT * FROM employees;
+-------+----------+-----------+--------+
| empid | lastname | firstname | salary |
+-------+----------+-----------+--------+
| 1 | Blum | Rich | 1234.5 |
+-------+----------+-----------+--------+
1 row in set (0.00 sec)

在脚本中使用数据库

连接到数据库

对于psql:

$ cat psql_connection
#!/bin/bash
psql=`which psql`
sudo -u postgres $psql
$ psql_connection
could not change directory to "/home/su1216/android/source/linux_learned"
psql (8.4.17)
Type "help" for help. postgres=#

对于mysql:

$ cat mysql_connection
#!/bin/bash
mysql=`which mysql`
$mysql "test" -u "test" -p
$ mysql_connection
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.1.72-0ubuntu0.10.04.1 (Ubuntu) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

执行脚本时,mysql会停下来要求用户输入密码,这个问题可以避免。

下面是一种糟糕的方式,直接将密码放在脚本中明文显示:

$ cat mysql_connection
#!/bin/bash
mysql=`which mysql`
$mysql "test" -u "test" -ptest

-p与密码紧密相连。

另一种解决方案:

mysql使用$HOME/.my.cnf文件来读取特殊的启动命令和设置。

如果没有这个文件,我们自己建立一个即可

$ touch /home/su1216/.my.cnf
$ gedit /home/su1216/.my.cnf
$ chmod 400 /home/su1216/.my.cnf

.my.cnf内容如下

$ cat /home/su1216/.my.cnf
[client]
password = test

现在再执行mysql_connection就不会要求输入密码了

向服务器发送命令

1.发送一个命令并退出

2.发送多个命令

对于mysql,可以使用-e选项

$ cat mysql_test
#!/bin/bash
mysql=`which mysql`
$mysql "test" -u "test" -ptest -e "select * from employees"

输出结果为:

$ mysql_test
+-------+----------+-----------+--------+
| empid | lastname | firstname | salary |
+-------+----------+-----------+--------+
| 1 | Blum | Rich | 1234.5 |
+-------+----------+-----------+--------+

对于psql,可以使用-c选项

发送多条命令可以使用重定向,注意:最后的EOF所在行不能有其他字符串。

$ cat mysql_test
#!/bin/bash
mysql=`which mysql`
$mysql "test" -u "test" -ptest << EOF
show tables;
select * from employees;
EOF

返回的结果是原始数据,没有之前的边框。

多条命令的结果之间没有分隔符

$ mysql_test
Tables_in_test
employees
empid lastname firstname salary
1 Blum Rich 1234.5

对于psql也适用,但是返回的结果是有边框的。

$ cat psql_test
#!/bin/bash
psql=`which psql`
sudo -u postgres $psql << EOF
\c test;
select * from employees;
EOF

输出结果:

$ psql_test
could not change directory to "/home/su1216/android/source/linux_learned"
You are now connected to database "test".
empid | lastname | firstname | salary
-------+----------+-----------+--------
1 | Blum | Rich | 1234.5
(1 row)

格式化数据

将结果集赋给变量:

#!/bin/bash
mysql=`which mysql`
results=`$mysql "test" -u "test" -Bse 'show databases'`
for result in $results
do
echo "$result"
done

其中-B指明了mysql使用批处理模式(禁止了格式化符号)

-s(silent)使得列标题被禁止掉

使用格式化标签

psql和mysql都使用-H来以HTML格式显示结果

$ mysql "test" -u "test" -He 'select * from employees'
<TABLE BORDER=1><TR><TH>empid</TH><TH>lastname</TH><TH>firstname</TH><TH>salary</TH></TR><TR><TD>1</TD><TD>Blum</TD><TD>Rich</TD><TD>1234.5</TD></TR><TR><TD>2</TD><TD>Blum</TD><TD>Poor</TD><TD>321.099</TD></TR></TABLE>

mysql还可以以XML格式显示结果

$ mysql "test" -u "test" -Xe 'select * from employees'
<?xml version="1.0"?> <resultset statement="select * from employees
" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="empid">1</field>
<field name="lastname">Blum</field>
<field name="firstname">Rich</field>
<field name="salary">1234.5</field>
</row> <row>
<field name="empid">2</field>
<field name="lastname">Blum</field>
<field name="firstname">Poor</field>
<field name="salary">321.099</field>
</row>
</resultset>

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...

  2. 《Linux命令行与shell脚本编程大全》第九章 安装软件程序

    包管理系统(PMS):用来进行软件安装.管理和删除的命令行工具 9.1包管理基础 1.主流的Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装 2.PMS用一个数据库来记录:系统上安装了 ...

  3. Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分、免登录]

    此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Linux命令行与shell脚本编程大全.第3版 (大小:约22M)

  4. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---11

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  5. 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  8. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---56

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  9. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---55

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---54

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

随机推荐

  1. 在CentOS6.5上安装Tomcat7

    Tomcat大本营地址:http://tomcat.apache.org/ 本文使用到的Tomcat7下载地址:http://apache.opencas.org/tomcat/tomcat-7/v7 ...

  2. ByteBuffer

    1.堆内:HeapByteBuffer,在java的堆内创建. 缺点:可能引起堆的不断gc 写文件的时候需要先将堆的buffer写进直接buffer里,然后再写入文件 2.堆外:DirectByteB ...

  3. iOS: 悬浮的条件筛选框使用二

    一.介绍: 在前面已经介绍了一种条件悬浮框,使用的是tableView的Plain分组样式实现的,因为这是tableView本身就具备的功能,分组悬浮效果.这次我来介绍第二种更加简单的方法,采用两个S ...

  4. 腾讯企鹅智酷100多张PPT:移动时代创业黄金法则

    移动时代创业黄金法则 http://tech.qq.com/a/20141223/008325.htm#p=8

  5. shell 判断字符串是否为数字

    本篇文章主要介绍了"shell 判断字符串是否为数字",主要涉及到shell 判断字符串是否为数字方面的内容,对于shell 判断字符串是否为数字感兴趣的同学可以参考一下. #!/ ...

  6. 敏捷BI——岂止于快

    信息爆炸的时代,唯有分析快,才可以把握住可能分分钟流失的数据信息,唯有钻取深,才可以挖掘出海量信息中蕴藏的财富.是时候为您的企业上一套敏捷BI了. [敏捷BI的产生背景] 传统BI由IT人员做报表,业 ...

  7. 第七篇 SQL Server代理作业活动监视器

    本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...

  8. javaEE开发案例——购物车

    一.页面 流程:登录页面(login.jsp)——>购物大厅页面(hall.jsp)——>购物车页面(showMyCart.jsp)——>订单页面(myorder.jsp)——> ...

  9. php 调用 java 接口

    php 需要开启 curl模块 /** HTTP 请求函数封装*/function http_request_cloudzone($url, $data){ //var_dump($url." ...

  10. G面经prepare: Reorder String to make duplicates not consecutive

    字符串重新排列,让里面不能有相同字母在一起.比如aaabbb非法的,要让它变成ababab.给一种即可 Greedy: 跟FB面经Prepare task Schedule II很像,记录每个char ...