RHEL5中配置MySQL 收藏


                                  MySQL数据库的配置与管理
一.MySQL服务的安装与启动
   Linux几乎所有的发行版本都内置了MySQL数据库。RHEL5也自带了MySQL服务。对于已经安装了MySQL的RHEL5可以执行以下命令查看:
  #rpm -qa | grep mysql
 与MySQL相关的软件包                          
mysql-5.0.22-2.1.i386.rpm(第二盘光张)�D�D�D�D�D�D�D�D�D�D�DMySQL客户端程序和共享库
mysql-connector-odbc-3.51.12-2.2.i386.rpm(第二盘光张)�D�DMySQL的ODBC驱动程序
MySQL-python-1.2.1-1.i386.rpm (第二盘光张)�D�D�D�D�D�D�D一个到MySQL的界面
mysql-server-5.0.22-2.1.i386.rpm (第二盘光张) �D�D�D�D�D�DMySQL服务器和相关文件
libdbi-dbd-mysql-0.8.1a-1.2.2.i386.rpm (第二盘光张)
perl-DBD-MySQL-3.0007-1.fc6.i386.rpm(第二盘光张)
freeradius-mysql-1.1.3-1.1.el5.i386.rpm (第三张光盘)                 
mysql-devel-5.0.22-2.1.i386.rpm(第三张光盘)�D�D�D�D�D�D�D�D库和包含文件,若需要编译其他MySQL客户端,如Perl模块,则需安装
mod_auth_mysql-3.0.0-3.1.i386.rpm  (第三张光盘)
mysql-test-5.0.22-2.1.i386.rpm(第三张光盘)
mysql-bench-5.0.22-2.1.i386.rpm (第三张光盘)�D�D�D�D�D�D�D性能测试工具和基准,需要Perl和DBD::mysql模块 
php-mysql-5.1.6-5.el5.i386.rpm(第三张光盘)------------------一个用于使用MySQL数据库的PHP程序的模块
qt-MySQL-3.3.6-20.el5.i386.rpm(第三张光盘)
  1.手工安装MySQL软件包:
    在 www.mysql.com上下载需要的mysql版本的软件包,也可以在RHEL5的光盘中找到需要安装的rpm软件包,然后进行安装
    若用光盘安装,需依次安装以下软件包
#rpm -ivh perl-DBI-1.52-1.fc6.i386.rpm(第二张光盘)
#rpm -ivh perl-DBD-MySQL-3.0007-1.fc6.i386.rpm(第二张光盘)
#rpm -ivh mysql-5.0.22-2.1.i386.rpm(第二张光盘)
#rpm -ivh mysql-server-5.0.22-2.1.i386.rpm (第二张光盘)    
安装完成后,在Linux下的安装布局如下表:
                 linux rpm包安装布局
目录
 目录内容
 
/usr/bin
 客户端程序和脚本
 
/usr/sbin
 mysqld服务器
 
/var/lib/mysql
 日志文件,数据库
 
/usr/share/doc/packages
 文档
 
/usr/include/mysql
 包含(头)文件
 
/usr/lib/mysql
 库
 
/usr/share/mysql
 错误消息和字符集文件
 
/usr/share/sql-bench
 基准程序
 
2.根据源代码编译安装:
  如果需要变更MySQL的某些功能或进行定制安装,则可以下载源代码,通过编译完成安装。
  以下载MySQL-community-5.0.45-0.rhel5.src.rpm为例:
    检查是否存在mysql用户可用如下命令:
       #grep "^mysql: " /etc/passwd  -i
    如果没有,则需要创建该用户:
       #useradd  mysql  /opt/mysql
    安装源文件:
       #rpm -ivh MySQL-community-5.0.45-0.rhel5.src.rpm
    在/usr/src/redhat/SOURCES/目录中,找到mysql-5.0.45a.tar.gz,然后解包:
       #tar -zxvf mysql-5.0.45.tar.gz
    解开该压缩包,生成mysql-5.0.45目录,在该目录下能够看到bin和scripts子目录。bin目录包含客户程序和服务器,scripts目录
    包含mysql_install_db脚本,用于初始化服务器的存取权限。
        在进行编译前,需要注意几个重要的配置参数:
        ・--prefix=PREFIX该参数是与目录结构无关的文件的安装前缀,一般指根据搜索路径或绝对路径引用文件,不必与执行文件放在
                          一起,默认为/usr/local。
        ・--exec-prefix=EPREFIX该参数是与执行文件目录相关文件的安装前缀,文件执行时,根据相对目录进行引用,这些文件要与
                                  执行文件放在一起。默认与PREFIX放在一起。
    将MySQL安装到/opt/mysql目录下:
        #./configure  --prefix  /opt/mysql
    需要注意的是,编译参数可以设置多次,以最后一次设置为准。
    最后,执行以下命令编译并安装MySQL:
        #make
        #make  check
        #su  mysql
        #make  install
        #cd  scripts
        #./mysql_install_db
     测试安装是否成功可以用以下命令,看到mysql>提示符后,则表明MySQLP安装成功。
        #/opt/mysql/bin/mysql_safe  &
        #/opt/mysql/bin/mysql  -u  root
 
  3.用命令行方式启动停止MySQL服务
    在RHEL5中,MySQL可能是系统自带的,也可能是用户根据需要编译安装的,因此,在通过命令行方式启动和停止MySQL服务时,
    使用的命令也有所不同。
    1如果是RHEL5自带的MySQL,则使用如下命令:
        #service mysqld start     =#/etc/init.d/mysqld start     //启动MySQL服务;
        #service mysqld stop     =#/etc/init.d/mysqld stop     //停止MySQL服务;
        #service mysqld restart   =/etc/init.d/mysqld restart   //重新启动MySQL服务;
        #mysqladmin status                                    //检查MySQL服务状态;
   2如果不是系统自带的MySQL服务,则使用如下方法:
     在默认的情况下,没有设置为系统服务的形式,需要通过以下方式启动,&表示后台运行:
        #/opt/mysql/bin/mysqld_safe  &
     类似地,停止MySQL服务时应使用如下命令:
        #/opt/mysql  /bin/mysqladmin  shutdown
  4.自动启动MySQL服务
    1对于系统自带的MySQL服务:
        #ntsysv
    2对于手工安装的MySQL服务
        通过在/etc/rc.local文件的尾部追加启动MySQL的命令来实现自动启动。
    3图形界面下-系统-管理-服务器设置-服务-服务配置-mysqld-选中复选框,同样可以实现系统启动自运行mysqld。
二.MySQL数据库的管理
   MySQL数据库的管理和使用包括客户端的启动,客户端操作,修改管理员口令,通过配置文件管理MySQL服务器等。
 1.启动MySQL客户端
   当第一次安装MySQL时,访问数据库服务器的用户只能是MySQL管理员,即root用户。但该root用户与Linux系统的root用户不
   同。默认情况下,root用户的初始密码为空。通过“mysql”命令可以启动MySQLP客户端:
        #mysql
         mysql>
   当成功连接后,则可以在mysql>提示符下键入“quit”或“\q”断开客户端与服务器的连接:
         mysql>quit
         Bye
   也可以输入Ctrl+d断开连接。
 2.修改管理员口令
   上面提到,由于MySQL默认root用户的密码为空,因此,应该尽快地修改MySQL管理员的密码。要修改root用户的密码,则需要先
   退出连接状态,然后使用以下格式的“mysqladmin”命令:
        #mysqladmin  -u  root  password  密码字符串
   命令执行后,root用户的密码就改为密码字符串的内容了。
       例如:要将root用户密码改为123456:#mysqladmin  -u  root  password  123456
   修改root用户密码后,如若再次连接服务器,则需要使用以下格式的命令:
        #mysql  -h  主机名或IP地址  -u  用户名 -p
       例如:#mysql  -h  localhost  -root  -p 在Enter passsword:后输入正确的密码则可正常连接。
   若root用户已经重新设置了密码,如若需要再次修改其密码时,则应使用以下格式的语句:
        #mysqladmin  -u  root  -p  password 密码字符串
       例如:将MySQL的root用户密码由原来设置的123456改为654321:
            #mysqladmin -u root -p password 654321
             Enter password:(123456)。
            需要注意:在Enter password:后先输入的是原密码123456,这样root用户的密码才会变更为654321。
 3.MySQL的配置文件
   在RHEL5中,MySQL的应用程序将其配置信息存放到my.cnf文件中,MySQL的各应用程序在执行时,都会试图从my.cnf文件中读
   取配置文件,其搜索的顺序为:
      首先试图读取/etc/my.cnf,如果存在,则采用/etc/my.cnf中的配置信息;
      若没有发现/etc/my.cnf文件,则试图查找MySQL的var安装路径/my.cnf,即/var/lib/mysql/,如果存在,则采用其配置信息;
      若没有发现MySQL的var安装路径/my.cnf,则试图读取(用户主目录)/my.cnf,如果读取到,则采用其配置信息; 
   在Linux中,MySQL的参数是区分大小写的。多数MySQL的应用程序,都支持以下共同的参数,示例如下:
      --no-defaults:不读取任何配置文件。
      --defaults-file=#:读取指定的配置文件#。
      --defaults-extra-file=#:读取系统默认的配置文件后,再读取指定的配置文件#。
      -h host_name,--host=host_name:连接给定主机上的MySQL服务器。
      -u user_name,--user=user_name:与服务器连接时,MySQL使用的用户名。默认是登录名。
      -p you_pass,--password[=your_pass]:与服务器连接时使用的口令。
      -P port_num,--port=port_num:与另一台主机连接时使用的TCP/IP端口号。
      -S /path/to/socket,--socket=/path/to/socket:与localhost连接时(默认主机)使用的套接字文件。
 4.管理MySQL服务器
   Mysqladmin可以用来执行MySQL数据库中的管理操作。语法是:                                           
        #mysqladmin [OPTIONS] command [command-option] command ...
   如果执行mysqladmin -help ,可以得到mysqladmin所支持的一个选项列表。mysqladmin支持下列命令,如下表:
  (以下所有的命令可以被缩短为其唯一前缀。例如“status”可以缩为“stat”,以此类推。)
 
 
                                mysqladmin支持的命令
命令
 功能
 
create databasename
 创建新数据库
 
debug
 将debug信息写入日志
 
drop databasename
 删除数据库及数据库中的所有表
 
extended-status
 服务器扩展状态信息
 
flush-hosts
 刷新所有主机
 
flush-logs
 刷新日志
 
flush-status
 清除状态变量
 
flush-tables
 刷新表
 
flush-threads
 消除缓冲线程
 
flush-privileges
 重载授权表
 
kill id,id,....
 按进程id杀掉mysql的进程
 
password new-password
 设置为4.1格式的口令
 
old-password new-password
 设置为4.1之前旧格式的口令
 
ping
 检查mysqld是否运行
 
processlist
 显示服务器中活跃进程列表
 
reload
 重载授权表
 
refresh
 更新所有表,关闭日志后再次打开
 
shutdown
 关闭服务器
 
status
 显示服务器状态信息
 
start-slave
 启动从属服务
 
stop-slave
 停止从属服务
 
variables
 打印可用变量
 
version
 输出服务器版本
 
5.MySQL客户端操作
   用户登录后,可以在MySQL命令提示符(mysql>)后使用SQL语言,进行MySQL客户端操作。
   每个SQL语句都应以“;”或“\g”结束,并且是不区分大小写的。
 (1)数据库操作
 【查看数据库】
  使用以下命令可以查看MySQL当前所有可用的数据库:
         mysql>show databases;
  从执行的结果可见,MySQL已经创建了三个数据库,information_schema,mysql,test。这三个数据库是MySQL安装程序自
  动创建的。其中,mysql库中包含的是5个MySQL授权表,information_schema库中是相关信息,而test库是供用户练习使用的。
 【创建数据库】
  在MySQL中创建数据库的语名格式为:
         mysql>create  database  数据库名;  
  例如:要创建一个名为e_learning的在线学习数据库,可以输入以下命令:
         mysql>create  database  e_learning;
  默认情况下,所创建的数据库将以目录的形式保存在/var/lib/mysql中,例如,上面创建的e_learning数据库将保存在目录
  /var/lib/mysql/e_learning中。系统不允许有同名的数据库存在。
 【选择数据库】
  所谓选择数据库,就是选定某个数据库成为当前处理所有事务的数据库,可以使用以下SQL语句:
          mysql>use  数据库名;  
  例如:选择e_learning数据库的命令为:
          mysql>use  e_learning;
 【删除数据库】
  当执行删除数据库的命令时,数据库及其所有的表和表中的数据都将被删除,所使用的SQL命令为:
          mysql>drop  database  数据库名;
  例如:若要删除e_learning数据库,则使用以下命令: mysql>drop  database  e_learning;
(2)数据表操作
    在关系型数据库中,数据库由多个数据表有机构成。每个数据表由行和列组成,每一行是一条记录,每个记录可以包含多个列(字段)。
    常见的数据表操作包手创建,删除,复制,修改等。
 【创建表】
   MySQL使用以下格式的SQL语句创建表:
         mysql>create  table  表名  (字段1,字段2,...字段n, [表级约束])  [Type|Engine =表类型|存储引擎];
   其中,字段的格式为:字段名  字段类型  [字段约束]
          ・字段类型:又称列类型,规定了某个字段所允许输入的数据类型,常用的字段类型如下:
                    INT,INTEGER--------整型,4个字节
                    FLOAT------------------浮点型,4个字节
                    DOUBLE----------------双精度浮点型,8个字节
                    DATE-------------------日期型,3个字节
                    CHAR(M)---------------字符型,M个字节,0<=M<=255
                    VARCHAR(M)----------字符串型,L+1个字节,其中L<=M且0<=M<=65535
                    BINARY(M)------------二进制型,M个字节,0<=M<=255
                    BLOB,TEXT-------------可变二进制型,L+2个字节,其中L<216
                    ENUM('value1','value2',....)-------枚举型,1或2个字节,取决于枚举值的个数(最多65535个值)
          ・字段约束:进一步对某个字段允许输入的数据进行约束,常用的字段约束如下:
                    Null(或Not Null)--------允许字段为空(或不允许字段为空),默认为Null
                    Default------------------指定字段的默认值
                    Auto_Increment--------设置Int型字段能够自动生成递增1的整数 
           ・表级约束:表级约束用于确定表的主键,外键,索引等,常用表级约束如下:
                    Primary Key----------设置主键
                    Foreign Key....References----设置外键
                    Index-----------------设置索引
                    Unique----------------设置唯一索引
                    Fulltext--------------- 设置全文索引
          ・表类型:指明了表中数据的存储格式,MySQL支持数个存储引擎作为对不同类型的处理器。默认的表类型是“MyISAM”,相
                    应的存储引擎为“MyISAM”。下面是常见的表存储引擎:
                    ARCHIVE--------------档案存储引擎
                    BDB-------------------带页面锁定的事务安全表。也称为BerkeleyDB
                    CSV-------------------值之间用逗号隔开的表
                    EXAMPLE--------------示例引擎
                    FEDERATED-----------可以访问远程表的存储引擎
                    InnoDB----------------带行锁定和外键的事务安全表
                    MERGE----------------MyISAM表的集合,作为一个表使用。也称为MRG_MyISAM
                    MyISAM---------------二进制轻便式存储引擎,此引擎是MySQL所用的默认存储引擎
                    NDBCLUSTER---------成簇表,容错表,以存储器为基础的表。也称为NDB
       需要注意的是,表名可被指定为dabase.table的形式。不论是否有当前数据库,都可以通过这种方式创建表。如果使用引号识别名,
    则应对数据库名和表名分别加引号。例如:'dabase'.'table'是合法的表名,而'database.table'则不合法。
       MySQL中,表一旦被创建就会在/var/lib/mysql目录下创建一个以表名为名称的目录,通过该目录中的.frm表格式/定义文件表示
    每个表。表的存储引擎也可能会创建其他文件。对于MyISAMG表,存储引擎可以创建数据和索引文件。因此,对于每个MyISAM表
    tbl_name,有三个文件,如下表:
                                         MyISAM表文件
文件
 作用
 
tbl_name.frm
 表格式(定义)文件
 
tbl_name.MYD
 数据文件
 
tbl_name.MYI
 索引文件
 
 

   例如:创建teacher教师表,存放教师有关信息,可输入如下命令:
            mysql>create  table  teacher (
                    teacherID  varchar(10)  not  null ,
                    name  varchar(20)  not  null ,
                    sex  char(1)  default  'm' ,
                    birthday  date ,
                    department  char(20) ,
                    primary  key  (teacherID)
                    );
          创建完成后,可以使用describe命令查看所创建表的结构:
             mysql>describe  teacher;
 【复制表】
   在MySQL中,可以使用以下语句复制表结构:
         mysql>create  table  新表名 like  源表名
   该语句对表的复制,不仅包含表结构,还包含表中的数据和键。
   例如:将表teacher复制为另一个表teacher_table,可以输入如下命令:
         mysql>create  table  teacher_table  like  teacher;
 【删除表】
   在MySQL中,可以使用以下语句删除一个或多个已创建的表:
         mysql>drop  table  表名1[,表名2,....];
   一旦drop table语句执行后,表结构和表中的数据都将被删除。
   例如:删除上例复制的teacher_table表,可以使用以下命令:
         mysql>drop  table  teacher_table;
         mysql>show  tables;      
 【修改表】
   修改表是指对表结构的改动,包括添加,删除,修改字段,更改表名或类型等。使用“Alter”语句,基本语法格式为:
         mysql>alter  table  表名  操作1[,操作2,....];
   这些操作包括add,change,modify,drop,rename等。下面通过举例说明
  例如:在teacher表中增加一个字段email,可以使用add命令:
         mysql>alter  table  teacher  add  email  varcher(20);
         mysql>describe  teacher;
  例如:将teacher表中的email字段改名为fax,并把类型设置为text,可以使用change命令:
         mysql>alter  table  teacher  change  email  fax  text;
         mysql>describe  teacher;
  例如:将teacher表中的department字段名称改为dept,同样可以使用change命令:
         mysql>alter  table  teacher  change  department  dept  char(20);
         mysql>describe  teacher;
  例如:将teacher表中的dept字段的类型改为varchar,可以使用modify命令:
         mysql>alter  table  teacher  modify  dept  varchar(20);
         mysql>describe  teacher;
  例如:将teacher表中的fax字段删除,可以使用以下drop命令:
         mysql>alter  table  teacher  drop  fax;
         mysql>describe  teacher;
  例如:将teacher表的表名改为teacher_info,可以使用rename命令:
         mysql>alter  table  teacher  rename  to  teacher_info;
         mysql>show tables;
(3)处理表的数据
   在创建了数据库和表之后,需要对表中存储的数据进行进一步的处理,常见的SQL操作包括插入,删除,修改表中的记录。
 【插入记录】
   在MySQL中,向表中插入/添加记录应使用以下格式的SQL语句:
         mysql>insert  into  表名(字段名1,字段名2,....)  values  (字段1的值,字段2的值,....);
   例如:向teacher表中插入/添加一条记录可以使用如下的命令:
         mysql>insert into teacher(teacherID,name,sex,birthday,dept)
                 values ('1001','Kelly','m',' 1964-11-26','computer');
         mysql>select  * from  teacher;
   在使用insert语句时,应注意以下几个问题:
   ・如果在insert语句中给出了要插入记录的各个字段名,那么字段值的顺序要与所给出的字段名的顺序相同,但可以与表中实际的字段
     顺序不同。但如果insert语句中没有给出各个字段名,则字段值的顺序就应该与表中字段的顺序相同。
   ・对于在insert语句中既没有给出字段名,也没有给出字段值的字段,在插入表时,该字段的值自动设置为默认值。
   ・当在一个独立的insert语句中使用多个values子句时,表示插入多条记录。
   例如:向teacher表中再插入一条记录,但没有给出sex字段名,其字段值将自动设置为默认值:
         mysql>insert into teacher(teacherID,name,birthday,dept)
                 values ('1002','Sullivan','1976-1-18','computer');
         mysql>select  * from  teacher;
   例如:向teacher表中插入多条记录,在insert语句中使用多个values子句,中间用逗号隔开即可:
         mysql>insert into teacher(teacherID,name,sex,birthday,dept)
                 values ('1003','tjj1','m','1981-11-26','computer'),('1004','tjj2','m','1982-10-12','computer'),
                        ('1005','tjj3','m','1983-01-21','computer');
         mysql>select * from  teacher;
 【修改记录】
   修改记录是更新表中数据的手段,MySQL使用update语句修改记录,基本格式为:
         mysql>update  表名  set  字段名1=字段值1 [,字段名2=字段值2,....]
   例如:将teacher表中的name字段值为‘Kelly’的记录,将其sex字段值改为‘f’,可以使用如下SQL语句:
         mysql>update  teacher  set  sex=‘f’ where  name=‘Kelly’;
 【删除记录】
   在MySQL中,用以下格式的SQL语句从表中删除记录:
         mysql>delete  from  表名  where  条件表达式;
   使用where子句的delete语句可以删除与指定条件相匹配的一条或多条记录。
   例如:要删除teacher表中teacherID为‘1002’的记录,SQL语句为:
         mysql>delete  from  teacher  where  teacherID=‘1002’;
   如果要删除表中的所有记录,可使用不带where子句的delete语句,SQL语句为:
         mysql>delete  from  teacher;
   此外,truncate语句也可以完成删除表中所有记录的功能,SQL语句为:
         mysql>truncate  table  teacher;
   注意:delete语句与truncate语句两者的区别在于,delete语句依次删除表中的每条记录,而truncate语句先删除表结构再新建表,
         因此,在删除包含大量数据的表时,truncate语句的处理速度更快。
(4)建立索引
   建立索引的目的是为了加快数据据查询的速度。MySQL允许用户为一个表的特定字段设置索引。可以在创建表时直接建立索引,也可以
   通过create index语句向已存在的表中添加索引。 
 【在创建表时建立索引】
   在创建表时,可以使用index子句或unique子句创建索引。
   例如:创建一个表名为schedule的日程表,并将日程编号sno字段定义为主键,同时为日程名称sname字段创建一个名为
         index_sname的索引。
         mysql>create  table  schedule (
                 sno  varchar(10)  not  null,
                 sname  varchar(20)  not  null,
                 book  varchar(20),
                 primary  key(sno),
                 index  index_sname(sname)
                 );
   若将index语句换为unique语句,则创建的索引类型为unique,此索引要求索引字段中的值必须是唯一的,也就是说,表中各个
   记录中该字段的值不能相同。(可防止某字段有重复的记录出现)
 【向已存在的表中添加索引】
   向已存在的表中添加索引应使用create index语句,其基本格式如下:
         mysql>create  [unique]  index  索引名  on  表名  (字段名1  [(长度),....]);
 
   例如:为teacher表中的name字段创建名为index_name的索引,可以使用以下命令:
         mysql>create  index  index_name  on  teacher  (name);
   如果在创建索引时没有指定索引名,则MySQL会自动使用索引所在字段的字段名作为索引名。
 【删除索引】
   要删除索引,可以使用drop index语句,其基本格式为:
         mysql>drop  index  索引名  on  表名;
   例如:要删除teacher表中索引名为index_name的索引,可以使用以下命令:
         mysql>drop  index  index_name  on  teacher;
 (5)创建用户
   首次安装MySQL时,MySQL自动授予任何用户都可以从本地连接MySQL服务器,但是,只有MySQL管理员(root用户)能够完全访
   问系统中所有数据库,而其他用户只能访问test数据库。这是因为MySQL安装程序在mysql这个数据库中设置了5个授权表,这5
   个授权表决定用户连接服务器及操作的权限。
                                       mysql数据库中5个授权表的功能
表名
 说明
 
user
 定义了能够连接到数据库服务器的用户和主机,以及这些用户的密码和访问权限
 
db
 定义了连接到数据库服务器上的用户可以使用的数据库,以及在这些数据库中能够执行的操作
 
host
 当表db中的Host字段为空时,由表 host定义用户可以从哪些主机连接到数据库服务器,并且不同的主机对指定的数据库可以具有不同的权限
 
tables_priv
 定义了连接到数据库服务器上的用户可以访问的表,以及在这些表中可以执行的操作
 
columns_priv
 定义了连接到数据库服务器上的用户可以访问的字段,以及在这些字段中可以执行的操作
 
   查看user表的内容,可以使用如下命令:
         mysql>use  mysql;
         mysql>select  host ,user,password,select_priv  from  user;
                +-----------------------+------+------------------+-----------------+
                 | host                  | user | password         | select_priv |
                +-----------------------+------+------------------+-----------------+
                 | localhost             | root | 565491d704013245 | Y         |
                 | localhost.localdomain | root |                     | Y          |
                 | localhost.localdomain |      |                     | N         |
                 | localhost             |      |                     | N         |
                 +-----------------------+------+------------------+----------------+
                 4 rows in set (0.00 sec)
    从查询结果可以看到:第1,2条记录表明,MySQL允许用户root可以从本地连接到数据库服务器,并对服务器中的所有数据库都具
    有完全控制权限,从结果记录中第4个字段开始,所有的字段值均为“Y”,表示用户具有完全控制权限;第3,4条记录表明,任何用
    户都可以从本地连接到数据库服务器中,但对所有数据库都没有访问权限,记录中user字段的值为空表示所有用户,而记录中的第4
    个字段开始,所有的字段值均为“N”,表示对所有数据库都没有访问权限。
   查看db表中的内容,可以使用如下命令:
          mysql>select  host,db,user,select_priv  from  mysql.db
                 +------+---------+------+-------------+
                 | host | db      | user | select_priv |
                 +------+---------+------+-------------+
                 | %    | test    |      | Y           |
                 | %    | test\_% |      | Y          |
                 +------+---------+------+-------------+
                 2 rows in set (0.01 sec)
    从查询结果可以看到:db表中定义了任何用户都可以从任何主机访问test数据库,或以test开头的数据库,并且对该数据库拥有完全
    控制权限。因为host字段的值为%通配符,即代表所有主机,db字段的值为test和test\_%表示test数据库或以test开头的数据
    库(“\_”是转义字符,“%”是通配符),而从表中第4个字段开始,所有的字段值均为“Y”,表示具有完全控制权限。
    注意:尽管在db表中定义了任何用户都可以从任何主机访问test数据库,但在user表中已经做了限制,要求任何用户只可以从本地
    连接到数据库服务器,因此,两个表的共同作用使得MySQL最终的设置是对于任何用户只能从本地连接数据库服务器。
  根据以上分析,可以利用mysql数据库中的授权表在MsSQL中进行用户的管理:
  【创建新用户】
    例如:创建一个test用户,并为其设置密码,使其能够从任何一台主机上连接到数据库服务器,可以使用以下SQL语句实现:
          mysql>use  mysql;              //选择mysql数据库//
          mysql>insert  into  user  (host,user,password) values (‘%’,‘test’,password(‘test’)); //添加新记录//
          mysql>flush  privileges;         //对授权表进行重载//
          再让test用户从其他任何主机上连接到数据库服务器后,对e_learning数据库能完全控制,可以使用以下SQL语句:
          mysql>insert  into  db (host,db,user,select_priv)values(‘%’,‘e_learning’,‘test’,‘Y’);
          mysql>flush  privileges;
  【更改用户密码】
    更改用户密码实际就是用update语句对授权表进行更新,例如,将test用户的密码改为123456,可以使用以下语句:
          mysql>update  user  set  password=password(‘123456’);
          mysql>flush  privileges;
  【删除用户】
    删除用户的语句是delete,例如,删除test用户可以使用以下语句:
          mysql>delete  from  user  where  user=‘test’;
          mysql>flush  privileges;
                                                                 
 (6)用户权限设置
    若要进行用户权限的设置,首先需要了解在数据库mysql的以下5个授权表中,具体哪些字段是用来设置权限的:
                            user,db,host表中可设置的权限
字段名
 权限名
 
select_priv
 select查询
 
insert_priv
 insert插入
 
update_priv
 update更新
 
delete_priv
 delete删除
 
create_priv
 create创建
 
drop_priv
 drop删除
 
reload_priv
 reload重载
 
shutdown_priv
 shutdown关闭
 
process_priv
 process跟踪
 
file_priv
 file文件读写
 
grant_priv
 grant授权
 
references_priv
 references引用
 
index_priv
 index索引
 
alter_priv
 alter修改
 
show_db_priv
 show databases查看数据库
 
super_priv
 super执行管理命令
 
create_tmp_table_priv
 create temporary tables创建临时表
 
lock_tables_priv
 lock tables锁定表
 
execute_priv
 execute执行被保护程序
 
repl_slave_priv
 replication slave 备份slave
 
repl_client_priv
 replication client 备份client
 
                       tables_priv,columns_priv表中的权限字段和可设置的权限
表名
 字段名
 权限集合
 
columns_priv
 column_priv
 Insert,Reference,Select,Update
 
tables_priv
 columv_priv
 Insert,Reference,Select,Update
 
table_priv
 Alter,Create,Delete,Drop,Grant,Index,Insert,Reference,Select,Update
 
    MySQL提供了两种修改授权表中访问权限的方法:一种是使用insert,update等SQL语句直接修改授权表中的信息;另一种是使
    用GRANT和REVOKE语句。相比起来,GRANT和REVOKE语句要比前一种方法更为简单,清晰。
  【Grant语句】
    Grant语句的基本格式:
      mysql>grant 权限列表 [(字段列表)]  on  数据库名.表名  to  用户名@域名或IP地址  [identified  by  '密码值']
              [with  grant  option];
   ・简单的授权
     简单的授权可以设置哪些用户可以从哪些主机连接到数据库服务器。
     例如:可以使用以下命令为用户test设置从任意主机连接到服务器的权限,并能完全访问news数据库。
           mysql>grant  all  on  news.*  to  test@'%'  identified  by  'test';
    需要注意的是:
   ・不同级别的授权
     不同级别的授权可以为同一个用户在对不同数据库操作时授予不同的权限。
     例如:可以使用以下命令创建一个新用户Kelly,使其能够从192.168.10.0子网中任何一台主机连接到服务器,具有读取e_learning
           数据库,并能修改teacher表中name字段的值:
           mysql>grant  select  on  e_learning.*  to  Kelly@'192.168.10.%'  indentified  by  '123456';
           mysql>grant  update  (name)  on  e_learning.teacher  to  Kelly@'192.168.10.%';
   ・管理权限的授权
     管理权限的授权可以为用户设置某个数据库的完全访问权限,能够管理数据库中的所有表。
     例如:授予用户Sullivan能够从本地连接到服务器,并对e_learning数据库具有完全访问权限,并可以将其拥有的权限授予其他用
           户,可以使用以下语句:
           mysql>grant  all  on  e_learning.* to Sullivan@localhost  identified  by  '123456'  with  grant  option;
  【Revoke语句】
    Revoke语句的基本格式:
      mysql>revoke  权限列表  [(字段列表)]  on  数据库.表名  from  用户名@域名或IP地址;
    例如:MySQL管理员撤销用户 Kelly@localhost对数据库e_learning的create,delete数据库和表的权限,并撤销该用户将自己             
          所拥有的权限授予他人的权限,可以使用以下语句:
          mysql>revoke  create,drop  on  e_learning.*  from  Kelly@localhost;
          mysql>revoke  grant  option  on  e_learning.*  from  Kelly@localhost;
 
 
 
 
 
三.MySQL数据库的备份和修复
   数据库的备份和修复是确保数据完整性,安全性的重要功能,MySQL数据库提供了以下备份和修复的工具。
 1.MySQL数据库备份和恢复
   在数据库数据丢失或损坏的情况下,备份数据库是很重要的。当发生系统崩溃时,需要尽可能使损失的数据最少,并且把数据库恢复到
   崩溃前的状态。根据备份时是否停止MySQL数据库服务,备份数据库分为在线备份与离线备份:
  (1)在线备份与恢复的命令与用法
  【select  into  outfile | dumpfile】
      利用select语句的into outfile或dumpfile子句,可以将查询的结果导出到一个文件。其语法格式为:
     mysql>select  ...  into  {outfile | dumpfile}  'file_name'  [fields  [terminated by '\t']  [optionally]
             enclosed  by ''] [lines  terminated  by  '\n'
    【load  data  infile恢复文件】
      其语法格式为:
     mysql>load  data  infile  'file_name.txt'  [replace| ignore]  into  table  tbl_name  [fields  
             [terminated  by '\t'] [optionally] enclosed by ''] [lines  terminated  by  '\n']
    【mysqldump备份】
        由于利用select into语句导出数据时,只能导出数据的值,导出之后,就失去了数据与数据结构之间的关联。再导入数据时,只
      能依据自然序将各数据项(字段)对应起来,如果用户在导出数据之后修改了数据结构或数据项的位置,那么导入的数据就会发生错误。
        使用mysqldump能实现带结构的备份,从而克服了上述问题。mysqldump是一个MySQL自带的标准在线导出工具,导出后的
      数据将以SQL语句的形式存在,可以选择导出数据结构(建表SQL语句)或数据(数据插入SQL语句)。
        利用mysqldump(带-c或-complete_insert选项)可避免使用select-into/load data结构与数据分离所带来的问题
      mysqldump存在于/usr/bin/目录下(通过rpm包安装mysql)。其使用方法有三种:
      1导出指定数据库的表,如果不指定tables,将导出整个数据库的所有表:
         #mysqldump  [options]  database  [tables]           
         例如:导出e_learning数据库的teacher表到文本文件teacher.sql中
             #mysqldump  e_learning  teacher  -h localhost -u root -p >teacher.sql
      2同时导出多个数据库:
         #mysqldump  [options]  --database  [options]  db1  [db2  db3....]
      3导出当前服务器内的所有数据库:
         #mysqldump  [options]  -all-database  [options]
      通过#mysqldump -help可以得到当前mysqldump版本所支持的所有选项。
    【mysqlhotcopy备份】
        对于MyISAM型数据表,mysqlhotcopy是备份数据库或单个表的最快的途径,但只能运行在数据库目录所在的机器上。
      mysqlhotcopy是一个Perl脚本,使用LOCK TABLES,FLUSH TABLES和cp或scp来快速备份数据库。
        mysqlhotcopy可方便地将某个数据库复制为另外一个数据库,而不中止服务。其语法格式为:
         #mysqlhotcopy  db_name
      例如:执行以下命令
             #mysqlhotcopy  e_learning  -h localhost -u root -p 123456
              mysql>show databases;
      可以看到备份后多出了一个mysql_copy数据库,说明mysqlhotcopy命令执行成功。利用这种方法可以很快地进行整个数据库的
      在线备份。
  (2).离线备份    
    除了在线备份以外,还可以通过离线方式备份数据库,就是将MySQL数据库关闭后,直接利用命令行复制数据。这样做的优点在于一
    定会保持备份前的数据的一致性。可用如下命令将/var/lib/mysql目录下的数据库采用gzip方式压缩到/tmp/mysql.tgz文件中进行
    备份:   #tar  cvfz  /tmp/mysql.tgz  /var/lib/mysql
   
 2.MySQL数据库的故障修复
    数据库文件的损坏有很多原因,而且损坏的程度不同,但无论数据库损坏的原因如何,都应当在损坏后进行故障的修复。MySQL提供
    了myisamchk语句用以检查和修复MyISAM表,isamchk语句则用来检查和修复ISAM表。为防止myisamchk恢复数据库时
    产生不一致,在使用myisamchk命令时最好停止mysqld服务。
    Myisamchk基本语法如下:
         #myisamchk  [OPTIONS]  tables[.MYI]
    tables[.MYI]是指数据表所在的文件名,可以采用相对路径或绝对路径和采用通配符指示,例如:
             #myisamchk  f*.MYI
    使用以下命令可以查看myisamchk的选项内容:
             #myisamckh  --help
    使用myisamchk命令还可以查看表的信息。通过以下命令可以以描述模式运行myisamchk,生成表的描述:
         #myisachk  -d  [-v]  表名
    以下是一个myisamchk  -d的输入例子:
             #myisamchk  -d  -v  func.MYI
    而如果只需要显示表的重要信息,则可使用以下命令:
         #myisamchk  -ei[s|v]  表名
     例如:  #myisamchk  -eiv  func.MYI         
    在故障恢复的过程中,myisamchk一行一行地创建一个MYD(数据)文件的副本,通过删除目的MYD文件,并且用原来的文件名重命
    名新文件。
    表文件发生损坏,通常会体现在发生查询意外中断的情况。同时,还可能出现以下错误,如:
        ・.FRM文件被锁定 
        ・无法找到.MYI文件
        ・文件意外结束
        ・记录文件毁坏等
    若遇到以上情况,则需要进行表修复的过程。通过myisamchk命令通常可以修复大多数错误,修复的一般步骤包括:
     ・确保MySQL用户及当前用户有权访问,修改需要修复的数据表文件,并能进入相关的数据库文件目录。
     ・运行myisamchk  *.MYI检查表,并根据检查表的结果作出不同的处理。
    若检查结果错误情况简单,则可以使用-q 快速恢复命令:
          #myisamchk  -r  -q  tbl_name
    若快速恢复命令不能恢复,则采用直接恢复,命令为:
          #myisamchk  -r  tal_name
    若仍然失效,则可采用安全恢复,命令为:
          #myisamchk  --safe-recover  tbl_name
导出表
mysqldump --opt school > school.sql
导入表
mysql
mysql>create database school;
mysql>use school;
mysql>source school.sql;
导出数据库
mysqldump --databases db1 db2 > db1.db2.sql
导入数据库
mysql < db1.db2.sql
四.phpMyAdmin的安装与使用
   phpMyAdmin是一款安装便捷,使用方便,操作简单,功能强大的MySQL图形化配置工具。
 1.phpMyAdmin的安装
   (1)获取phpMyAdmin安装包
      phpMyAdmin是用PHP编制的一种客户端/服务器结构的软件包,事实上是一些放在服务器端的能够通过浏览器界面管理的页
      面程序文件,因此,安装phpMyAdmin的过程实际上就是将其解压到一个允许执行PHP的目录下。
       ・在http://www.phpmyadmin.net/home_page/downloads下载最新的phpMyAdmin版本,将其tar文件复制到/root目
         录下。例如,下载phpMyAdmin-2.11.0-all-languages.tar.gz,并保存其md5校验码。
       ・执行以下命令将tar文件解压缩:
         #tar  xvzf  phpMyAdmin-2.11.0-all-languages.tar.gz
       ・该命令执行后,root目录下将会生成一个子目录php phpMyAdmin-2.11.0-all-languages ,为便于测试,将子目录
         phpMyAdmin-2.11.0-all-languages移动到默认Apache Web站点的主目录/var/www/html下,并更名为phpMyAdmin:
         #mv  phpMyAdmin-2.11.0-all-languages  /var/www/html/phpMyAdmin
   (2)修改主配置文件
      phpMyAdmin的配置主要是通过修改配置文件config.inc.php。而根据上面的修改后该文件应当位于
      /var/www/html/phpMyAdmin中。但刚拷贝而来的phpMyAdmin目录下,可能会并没有config.inc.php文件,而只有一个
      config.sample.inc.php文件。此时,需要将config.sample.inc.php文件复制为config.inc.php文件:
         #cp  config.sample.inc.php  config.inc.php
      以下是config.inc.php中的部分内容,通过修改其中的一些选项,可以完成phpMyAdmin的配置:  
       $cfg['blowfish_secret'] = '';          //设置phpMyAdmin的认证信息。需要在字符串中填写phpMyAdmin的认证信息,实
                                              际是一串 md5的校验码,在下载时获得。当用户验证方式为cookie方式,必须设置 //
       $cfg['Servers'][$i]['host']   = 'localhost';  //设置MySQL数据库服务器的域名或IP地址。此处使用默认值“localhost”,
                                                    表示MySQL数据库服务器就在本地Linux系统中,值得注意的是,现在的
                                                    phpMyAdmin都支持对多个MySQL数据库服务器的管理,所以,增加了
                                                    ['Servers'][$i]数组来存放不同服务器的连接信息。当$i=0时,对应着第一个
                                                    MySQL服务器;当$i=1时,对应着第二个MySQL服务器,以此类推。//
       $cfg['Servers'][$i]['connect_type']  = 'tcp';      
       $cfg['Servers'][$i]['extension']     = 'mysql';    //设置连接数据库类型//
       $cfg['Servers'][$i]['compress']      = FALSE;                                                         
       $cfg['Servers'][$i]['auth_type']     = 'config';  //设置用户验证方式。有config, http ,cookie based几种方式//
       $cfg['Servers'][$i]['password']      = '111';    //设置用户验证方式为config方式时的登录密码//       
       $cfg['UploadDir']             = '';                                                    
       $cfg['SaveDir']               = '';   
    (3)安装测试
       完成了上述设置后,要测试phpMyAdmin能否正常工作,可在本地浏览器的地址栏中输入: http://localhost/phpMyAdmin。如
       果配置无误,则应该看到phpMyAdmin管理界面;若看到“无法载入mysql扩展,请检查PHP配置”,说明系统当前没有安装
       php-mysql模块,则需使用以下命令进行安装:       
          #rpm  -ivh  php-pdo-5.1.6-5.el5.i386.rpm    (RHEL5第二张光盘,被依赖)
          #rpm  -ivh  php-mysql-5.1.6-5.el5.i386.rpm  (RHEL5第三张光盘)
       用户在输入用户名root及设置的相应密码111后,将打开phpMyAdmin访问MySQL服务器的初始网页。注意:如果用其他客户
       机测试,需要在MySQL服务器上为客户机设置访问权限,否则即使密码正确也可能无权访问MySQL服务器。                                                      
 
 
 
 
 
 
T-SQL语法:      
创建数据库
CREATE DATABASE newDB                       
创建表
CREATE TABLE [database_name.[owner].|owner.]table_name
                  ({<column_definition>|column_name  AS  computed_column_expression
                                             |<table_constraint>::=[CONSTRAINT constraint_name]}
                                             |[{PRIMARY  KEY|UNIQUE}][,.....])
                   [ON{filegroup|DEFAUTLT}][TEXTIMAGE_ON{filegroup|DEFAULT}]
例:CREATE TABLE 地址本
                     (姓名胜古迹 nvarchar(10),
                       地址 nvarchar(50),
                       生日 smalldatetime,
                       职位于varchar(20),
                       基本工资 money)
单表查询
SELECT select_list [INTO new_table] FROM table_source [WHERE search_condition]
                                                                 [GROUP BY group_by_expression]
                                                                 [HAVING seagch_condition]
                                                                 [ORDER BY orde_expression [ASC|DESC]]
例:查询Northwind.dbo数据库的employees表
    SELECT * FROM Northwind.dbo.employees
    从Northwind数据库的Customers表中查询出所有的列
    SELECT * FROM customers
    从Customers表中查询出部分列
    SELECT CompanyName,ContactName,Address,Phone FROM customers
    在结果集中给查询的列以别名
    SELECT CompanyName AS 公司名称,
             ContactName AS 联系人姓名,
             Address AS 地址,
             Phone AS 电话
     FROM customers
    从Employee表中查询所有的员工来自于哪几个不同的城市,用DISTINCT关键字从SELECT语句的结果中除去重复的行
    SELECT DISTINCT city FROM Employees
    先创建数据库,然后在数据库中创建表。在查询分析器中运行多个语句,用批处理语句GO来分隔不同的批`
    CREATE DATABASE newDB
    GO
    USE newDB
    GO
    CREATE TABLE 地址本 (姓名 nvarchar(10),
                              地址 nvarchar(50),
                              生日 samlldatetime,
                              职位 varchar(20),
                              基本工资 money)
    查询FirstName列为“Andrew”的记录
    SELECT * FROM Employees WHERE FirstName='Andrew'
    查询国籍不是“USA”的记录
    SELECT * FROM Employees WHERE Country<>'USA'
    查询单价大于等于18小于等于40的产品记录
    SELECT * FROM Products WHERE UnitPrice>=18 AND UnitPrice<=40  或者
    SELECT * FROM Products WHERE UnitPrice BETWEEN 18 AND 40
    查询员工所在的城市为Seattle,London,或者Redmond的记录
    SELECT * FROM Employees WHERE city IN ('Seattle','London','Redmond')
    查询员工表中Region列的值为NULL的记录
    SELECT * FROM Employees WHERE Region IS NULL
    查询员工表中Region列的值为非空值的记录
    SELECT * FROM Employees WHERE Eegion IS NOT NULL
    从Products表中查询所有产品的名称和价格,并按照价格从小到大排列(升序)
    SELECT ProductName,UnitPrice
    FROM Products
    ORDER BY UnitPrice ASC                                                                  
列  从Products表中查询所有产品的名称和价格,并按照价格从大到小排列(降序)
    SELECT ProductName,UnitPrice
    FROM Products
    ORDER BY UnitPrice DESC
 
 
常用的字符串函数:在查询语句中可以使用函数来实现特殊的计算,字符串函数可以用来对字符串进行各种处理。常用的字符串函数如下表
                                             字符串函数
ASCII
 NCHAR
 SOUNDEX
 
CHAR
 PATINDEX
 SPACE
 
CHARINDEX
 REPLACE
 STR
 
DIFFERENCE
 QUOTENAME
 STUFF
 
LEFT
 REPLICATE
 SUBSTRING
 
LEN
 REVERSE
 UNICODE
 
LOWER
 RIGHT
 UPPER
 
LTRIM
 RTRIM
 
 
例:用LEN函数求得city值为London的公司的名称字符串的长度
    SLECT LEN(CompanyName) AS 'Length',CompanyName
    FROM Customers
    WHERE city='London'
    使用UPPER函数和LOWER函数实现字符串的大,小写转换。分别用大写显示FirstName列,用小写显示LastName列
    SELECT UPPER(FirstName) AS FirstName,LOWER(LastName) AS LastName
    FROM Employees
    使用REVERSE函数可以把字符串反转显示
    SELECT REVERSE(FirstName) AS 反转显示的名字
    FROM Employees
    使用LTRIM函数删除字符串中的起始空格                                                                   
    DECLARE @string_to_trim  varchar(60)
    SET  @string_to_trim='    five spaces are at the beginning of this string.'
    SELECT  'Here is the string without the leading spaecs: ' + LTRIM(@string_to_trim)
    GO
    显示:Here is the string without the leading spaecs: five spaces are at the beginning of this string.
    使用RTRIM函数删除字符串尾随的空格
    DECLARE @string_to_trim  varchar(60)
    SET  @string_to_trim='four spaces are after the period in this snetence.    '
    SELECT  'Here is the string without the leading spaecs: ' + CHAR(13)+RTRIM(@string_to_trim)
GO
    显示:Here is the string without the leading spaecs:
          four spaces are after the period in this snetence.
常用的数学函数:数学函数可以进行各种数学运算。SQL Server提供的数学函数如下表
                                          数学函数             
ABS
 DEGREES
 RAND
 
ACOS
 EXP
 ROUND
 
ASIN
 FLOOR
 SIGN
 
ATAN
 LOG
 SIN
 
ATN2
 LOG10
 SQUARE
 
CEILING
 PI
 SQRT
 
COS
 POWER
 TAN
 
COT
 RADIANS
 
 
例:使用ABS函数返回给定数字或者表达式的绝对值
    SELECT ABS(-123.0),ABS(0.0),ABS(7891.05)
    结果:123.0  .0  7891.05
    使用CEILING函数返回大于或等于所给数字表达式的最小整数
    SELECT CEILING(123.45),CEILING(-123.45),CEILING(0.0)
    结果:124  -123  0
    使用FLOOR函数返回小于或等于所给数字表达式的最大整数
    SELECT FLOOR(123.45),FLOOR(-123.45),FLOOR(0.0)
    结果:123  -124  0
    使用PI函数求圆周率,ROUND函数把一个数或者表达式四舍五入到指定的精度,SQUARE函数求平方,SQRT函数求平方根
    SELECT PI(),ROUND(123.4567,4),SQUARE(34),SQRT(361)
    结果:3.1415926535897931  123.4567  1156.0  19.0
常用的日期和时间函数:对日期时间型数据进行处可以使用日期和时间函数,SQL Server提供的日期和时间函数如下表
                                    日期和时间函数
DATEADD
 DATEDIFF
 DATEPART
 
DATENAME
 GETUTCDATE
 GETDATE
 
DAY
 MONTH
 YEAR
 
   从服务器上得到当前的日期和时间可以用GETDATE函数
   SELECT GETDATE()
   结果:2008-10-24 14:35:37.090
   使用嵌套函数,用YEAR,MONTH,DAY函数分别获得当前日前的年份,月份,日期
   SELECT YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE())
   结果:2004  1  9
 
 
 
GROUP BY子句和聚合函数:使用GROUP BY子句可以给结果集分组并为每一组值生成一个聚合值。聚合值可以是求总和,平均值,最大值或最小值等,聚合值用聚合函数生成。常用的聚合函数有AVG求平均值,MAX返回最大值,MIN返回最小值,SUM求和,统计COUNT等
例:在Pubs数据库的titles表中保存了图书及其价格信息
    SELECT title_id,title,type,price FROM titles
    如果要统计每一类图书的平均价格,可以用GROUP BY子句对type列分组,然后用聚合函数AVG()求各组的平均值
    SELECT type AS 图书分类,AVG(price) AS 平均价格
    FROM titles 
    GROUP BY type
    统计表中总的记录数可以使用聚合函数COUNT,例如求Northwind数据库中Orders表的总记录数可以用下面的语句
    SELECT COUNT(*)                                                                                                                 
    FROM orders         
HAVING子句和集合数据排序:用GROUP BY分组聚合的结果集如果要进行排序可以使用ORDER BY子句,ORDER BY子句中可以使用别名或者使用表达式;如果要对分组聚合的结果集限制查询条件,使用HAVING子句而不是WHERE子句。
例:求各类图书的平均价格并按价格从大到小排列
    SELECT type AS 图书分类,AVG(price) AS 平均价格
    FROM titles
    GROUP BY type
    ORDER BY 平均价格格 DESC
    如果要返回平均价格在13到18之间的图书分类
    SELECT type AS 图书分类,AVG(price) AS 平均价格                                                                                          
    FROM titles
    GROUP BY type
    HAVING AVG(price) BETWEEN 13 AND 18
                                    
多表查询
SELECT select_list [INTO new_table] FROM table_source [WHERE search_condition]
                                                                 [GROUP BY group_by_expression]
                                                                 [HAVING search_condition]
                                                                 [ORDER BY orde_expression [ASC|DESC]]
其中,FROM子句中的数据源可以是一个表,也可以是多个表
例:在Northwind数据库中,要从订单表Order Details和产品表Products中得到订单编号Orderid,产吕名称ProdcutName,
    订货数量Quantity和产品库存量Unitsinstock,可以使用如下查询
    SELECT [Order Details].Orderid,Products.Productname,[Order Details].Quantity,Products.Unitsinstock
    FROM [Order Details],Products
    WHERE [Order Details].Productid=Products.Productid
    要获得每笔订单与雇员和客户的关系,就需要对Orders,Employees,Customers三个表进行查询
    SELECT Orderid,LastName,ContactName
    FROM Orders,Employees,Customers
    WHERE Orders.Employeeid=Employees.Employeeid
    And Orders.Customerid=Customers.Customerid
使用别名:SQL Server支持在FROM子句中使用表的别名来简化查询语句,在FROM子句中,用AS关键字可以给表定义一个别名,用
          简单的字母就可以代表这个表。
    从订单表Order Details和产品表Products中得到订单编号Orderid,产品名称ProdcutName,订货数量Quantity和产品
    库存量Unitsinstock的查询语句,用表的别名可以让查询语句简短清晰,查询结果和使用表的全名时一样,语句可以写为:
    SELECT OD.Orderid,P.Productname,OD.Quantity,P.Unitsinstock
    FROM [order Details] AS OD,Products AS P
    WHERE OD.Productid=P.Productid
    在对三个表进行查询的例子中,用别名的语句可以改写为
    SELECT Orderid,LastName,ContactName
    FROM Orders AS o,Employees AS e,Customers AS c
    WHERE o.Employeeid=e.Employeeid And o.Customerid=c.Customerid
使用UNION运算符合并结果集:UNION运算符将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部
                               行,可以认为,UNION是对集合做“合并”运算。使用UNION合并起来的SELECT查询结果集应该满
                               足如下条件:每个SELECT查询返回的列数和列顺序必须一致;
                                           每列的数据类型必须一一对应,并且是兼容的;
例:在customers表中进行如下查询
    SELECT ContactName,city,postalcode
    FROM customers
    假如这个查询会返回的行数为91行
    在emplyees表中进行如下查询
    SELECT lastname + ‘’+ firstname,city,postalcode
    FROM employees
    假如这个查询返回的行数为9行
    现在用UNION操作符把这两个查询联起来成为一条查询,就可以得到合并的结果集,总共就有100行记录
    SELECT ContactName,city,postalcode
    FROM customers
    UNION
    SELECT lastname + ‘’+ firstname,city,postalcode
    FROM employees
联接查询
内联接:内联接是用比较运算符比较要联接列的值的联接。内联接是最常用的多表查询,当数据来自于两个有关系的表时,常常用内联接查
        询。内联接的语法是在FROM子句中使用INNER JOIN把两个或者两个以上的表联接起来,用关键字ON来指定联接的条件。
例:用INNER JOIN改写两个表的查询,从订单表Order Details和产品表Products中得到订单编号Orderid,
    产品名称ProdcutName,订货数量Quantity和产品库存量Unitsinstock
    SELECT OD.Orderid,P.Productname,OD.Quantity,P.Unitsinstock
    FROM [Order Details] AS OD INNER JOIN Products AS P
    ON OD.Productid=P.Productid                                                                                
    同样将三个表的查询用INNER JOIN语句改写
    SELECT Orderid,LastName,ContactName
    FROM Orders AS o INNER JOIN Employees AS e ON o.Employeeid=e.Employeeid
    INNER JOIN Customers AS c ON o.Customerid=c.Customerid
外联接:外联接有左外联接,右外联接,完全外联接三种
        左外联接(LEFT OUTER JOIN或LEFT JOIN):左外联接在结果集中返回所有LEFT JOIN操作符左侧表中的行。
        右外联接(RIGHT OUTER JOIN或RIGHT JOIN):右外联接在结果集中返回所有LEFT JOIN操作符右侧表中的行。
        完全外联接(FULL OUTER JOIN或FULL JOIN):完全外联接在结果集中返回两个表中的所有行
例:假设在city列上联接authors表和publishers表。结果只显示在出版商所在城市居住的作者。若要在结果中包括所有的作者,而
    不管也版商是否和作者在同一个城市,使用左外联接。
    USE  pubs
    SELECT  a.au_fname,a.au_lname,p.pub_name
    FROM  authors  a  LEFT  OUTER  JOIN  publishers  p  ON  a.city=p.city
    ORDER  BY  p.pub_name  ASC,a.au_lname  ASC,a.au_fname  ASC
    若要在结果中包括所有的出版商,而不管作者所在城市中是否还有出版商居住,使用右外联接。
    SELECT  a.au_fname,a.au_lname,p.pub_name
    FROM  authors  AS  a  RIGHT  OUTER  JOIN  publishers  AS  p  ON  a.city=p.city
    ORDER  BY  p.pub_name  ASC,a.au_lname  ASC,a.au_fname  ASC
    若要在结果中包括所有作者和出版商,而不管作者所在的城市是否有出版商或者出版商是否和作者在同一个城市,使用完全外联接。
    SELECT  a.au_fname,au.au_lname,p.pub_name
    FROM  authors  a  FULL  OUTER  JOIN  publishers  p  ON  a.city=p.city
    ORDER  BY  p.pub_name  ASC,a.au_lname  ASC,a.au_fname  ASC
交叉联接
例:员工表中有9条记录,客户表中有91条,则两个表交叉联接的结果就是列出了每个员工和每个客户之间的一个组合,结果有819条
    记录
    USE  Northwind
    SELECT  EmployeeID,CustomerID
    FROM  employees  CROSS  JOIN  customers
    ORDER  BY  EmployeeID
自联接
例:要知道每位员工的上司的姓名,可以使用如下的T-SQL查询语句
    SELECT  e.LastName  AS  员工的名字,m.LastName  AS  上司的名字
    FROM  Employees  AS  e  LEFT  JOIN  Employees  AS  m
    ON   e.Reportsto= m.Employeeid

你可能感兴趣的:(mysql,linux,数据库,收藏,rhel5)