zoukankan      html  css  js  c++  java
  • 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记

    第二十三章:使用数据库

     

    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 连接到数据库和服务器
    delimiter d 设置SQL语句分隔符
    edit e 用命令行编辑器编辑命令
    ego G 将命令发送到MySQL服务器并垂直显示结果
    exit q 退出mysql程序
    go g 将命令发送到MySQL服务器
    help h 显示帮助信息
    nopaper 禁用输出分页并将输出发送到STDOUT
    note 不要将输出发送到输出文件
    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/

  • 相关阅读:
    OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】(二)——网络节点的安装
    OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】(一)——控制节点的安装
    OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】——序
    在Openstack H版部署Nova Cell 时 ,终端输入nova service-list 和 nova host-list 命令将报错
    OpenStack G版以后的Availability Zone与Aggregate Hosts
    ubuntu设置WPA2-PSK的wifi热点(AP)——hostapd+dhcpd
    公有云开启全面竞争时代——青云QingCloud
    ethtool的基本设置
    OpenStack网络的前世今生
    Nova 无法向虚机注入密钥
  • 原文地址:https://www.cnblogs.com/james1207/p/3400355.html
Copyright © 2011-2022 走看看