RHEL5中配置MySQL

                                  MySQL数据库的配置与管理

.MySQL服务的安装与启动

   Linux几乎所有的发行版本都内置了MySQL数据库。RHEL5也自带了MySQL服务。对于已经安装了MySQLRHEL5可以执行以下命令查看:

  #rpm -qa | grep mysql

 MySQL相关的软件包                          

mysql-5.0.22-2.1.i386.rpm(第二盘光张)―――――――――――MySQL客户端程序和共享库

mysql-connector-odbc-3.51.12-2.2.i386.rpm(第二盘光张)――MySQLODBC驱动程序

MySQL-python-1.2.1-1.i386.rpm (第二盘光张)―――――――一个到MySQL的界面

mysql-server-5.0.22-2.1.i386.rpm (第二盘光张) ――――――MySQL服务器和相关文件

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(第三张光盘)――――――――库和包含文件,若需要编译其他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 (第三张光盘)―――――――性能测试工具和基准,需要PerlDBD::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目录,在该目录下能够看到binscripts子目录。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 密码字符串

       例如:将MySQLroot用户密码由原来设置的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文件,则试图查找MySQLvar安装路径/my.cnf,即/var/lib/mysql/,如果存在,则采用其配置信息;

      若没有发现MySQLvar安装路径/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_schemamysqltest。这三个数据库是MySQL安装程序自

  动创建的。其中,mysql库中包含的是5MySQL授权表,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 =表类型|存储引擎]

   其中,字段的格式为:字段名  字段类型  [字段约束]

          ·字段类型:又称列类型,规定了某个字段所允许输入的数据类型,常用的字段类型如下:

                    INTINTEGER--------整型,4个字节

                    FLOAT------------------浮点型,4个字节

                    DOUBLE----------------双精度浮点型,8个字节

                    DATE-------------------日期型,3个字节

                    CHAR(M)---------------字符型,M个字节,0<=M<=255

                    VARCHAR(M)----------字符串型,L+1个字节,其中L<=M0<=M<=65535

                    BINARY(M)------------二进制型,M个字节,0<=M<=255

                    BLOB,TEXT-------------可变二进制型,L+2个字节,其中L<216

                    ENUM('value1''value2'....)-------枚举型,12个字节,取决于枚举值的个数(最多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....]

   这些操作包括addchangemodifydroprename等。下面通过举例说明

  例如:在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 userpasswordselect_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)

    从查询结果可以看到:第12条记录表明,MySQL允许用户root可以从本地连接到数据库服务器,并对服务器中的所有数据库都具

    有完全控制权限,从结果记录中第4个字段开始,所有的字段值均为“Y”,表示用户具有完全控制权限;第34条记录表明,任何用

    户都可以从本地连接到数据库服务器中,但对所有数据库都没有访问权限,记录中user字段的值为空表示所有用户,而记录中的第4

    个字段开始,所有的字段值均为“N”,表示对所有数据库都没有访问权限。

   查看db表中的内容,可以使用如下命令:

          mysql>select  hostdbuserselect_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字段的值为testtest/_%表示test数据库或以test开头的数据

    (/_”是转义字符,“%”是通配符),而从表中第4个字段开始,所有的字段值均为“Y”,表示具有完全控制权限。

    注意:尽管在db表中定义了任何用户都可以从任何主机访问test数据库,但在user表中已经做了限制,要求任何用户只可以从本地

    连接到数据库服务器,因此,两个表的共同作用使得MySQL最终的设置是对于任何用户只能从本地连接数据库服务器。

  根据以上分析,可以利用mysql数据库中的授权表在MsSQL中进行用户的管理:

  【创建新用户】

    例如:创建一个test用户,并为其设置密码,使其能够从任何一台主机上连接到数据库服务器,可以使用以下SQL语句实现:

          mysql>use  mysql              //选择mysql数据库//

          mysql>insert  into  user  (hostuserpassword) values (%’,‘test’,password(test)) //添加新记录//

          mysql>flush  privileges         //对授权表进行重载//

          再让test用户从其他任何主机上连接到数据库服务器后,对e_learning数据库能完全控制,可以使用以下SQL语句:

          mysql>insert  into  db (hostdbuserselect_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个授权表中,具体哪些字段是用来设置权限的:

                            userdbhost表中可设置的权限

字段名

权限名

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

InsertReferenceSelectUpdate

tables_priv

columv_priv

InsertReferenceSelectUpdate

table_priv

AlterCreateDeleteDropGrantIndexInsertReferenceSelectUpdate

    MySQL提供了两种修改授权表中访问权限的方法:一种是使用insertupdateSQL语句直接修改授权表中的信息;另一种是使

    GRANTREVOKE语句。相比起来,GRANTREVOKE语句要比前一种方法更为简单,清晰。

  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_learningcreatedelete数据库和表的权限,并撤销该用户将自己             

          所拥有的权限授予他人的权限,可以使用以下语句:

          mysql>revoke  createdrop  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 outfiledumpfile子句,可以将查询的结果导出到一个文件。其语法格式为:

     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 TABLESFLUSH TABLEScpscp来快速备份数据库。

        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

    查询员工所在的城市为SeattleLondon,或者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 ProductNameUnitPrice

    FROM Products

    ORDER BY UnitPrice ASC                                                                  

  Products表中查询所有产品的名称和价格,并按照价格从大到小排列(降序)

    SELECT ProductNameUnitPrice

    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 LENCompanyName AS 'Length'CompanyName

    FROM Customers

    WHERE city=' London '

    使用UPPER函数和LOWER函数实现字符串的大,小写转换。分别用大写显示FirstName列,用小写显示LastName

    SELECT UPPERFirstName AS FirstNameLOWERLastName AS LastName

    FROM Employees

    使用REVERSE函数可以把字符串反转显示

    SELECT REVERSEFirstName AS 反转显示的名字

    FROM Employees

    使用LTRIM函数删除字符串中的起始空格                                                                   

    DECLARE @string_to_trim  varchar60

    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  varchar60

    SET  @string_to_trim='four spaces are after the period in this snetence.    '

    SELECT  'Here is the string without the leading spaecs: ' + CHAR13+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),ABS0.0),ABS7891.05

    结果:123.0  .0  7891.05

    使用CEILING函数返回大于或等于所给数字表达式的最小整数

    SELECT CEILING123.45),CEILING-123.45),CEILING0.0

    结果:124  -123  0

    使用FLOOR函数返回小于或等于所给数字表达式的最大整数

    SELECT FLOOR123.45),FLOOR-123.45),FLOOR0.0

    结果:123  -124  0

    使用PI函数求圆周率,ROUND函数把一个数或者表达式四舍五入到指定的精度,SQUARE函数求平方,SQRT函数求平方根

    SELECT PI(),ROUND123.45674),SQUARE34),SQRT361

    结果: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 143537.090

   使用嵌套函数,用YEARMONTHDAY函数分别获得当前日前的年份,月份,日期

   SELECT YEARGETDATE()),MONTHGETDATE()),DAYGETDATE())

   结果:2004  1  9

 

 

 

GROUP BY子句和聚合函数:使用GROUP BY子句可以给结果集分组并为每一组值生成一个聚合值。聚合值可以是求总和,平均值,最大值或最小值等,聚合值用聚合函数生成。常用的聚合函数有AVG求平均值,MAX返回最大值,MIN返回最小值,SUM求和,统计COUNT

例:在Pubs数据库的titles表中保存了图书及其价格信息

    SELECT title_idtitletypeprice FROM titles

    如果要统计每一类图书的平均价格,可以用GROUP BY子句对type列分组,然后用聚合函数AVG()求各组的平均值

    SELECT type AS 图书分类,AVGprice 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 图书分类,AVGprice AS 平均价格

    FROM titles

    GROUP BY type

    ORDER BY 平均价格格 DESC

    如果要返回平均价格在1318之间的图书分类

    SELECT type AS 图书分类,AVGprice AS 平均价格                                                                                          

    FROM titles

    GROUP BY type

    HAVING AVGprice 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].OrderidProducts.Productname[Order Details].QuantityProducts.Unitsinstock

    FROM [Order Details]Products

    WHERE [Order Details].Productid=Products.Productid

    要获得每笔订单与雇员和客户的关系,就需要对OrdersEmployeesCustomers三个表进行查询

    SELECT OrderidLastNameContactName

    FROM OrdersEmployeesCustomers

    WHERE Orders.Employeeid=Employees.Employeeid

    And Orders.Customerid=Customers.Customerid

使用别名:SQL Server支持在FROM子句中使用表的别名来简化查询语句,在FROM子句中,用AS关键字可以给表定义一个别名,用

          简单的字母就可以代表这个表。

    从订单表Order Details和产品表Products中得到订单编号Orderid,产品名称ProdcutName,订货数量Quantity和产品

    库存量Unitsinstock的查询语句,用表的别名可以让查询语句简短清晰,查询结果和使用表的全名时一样,语句可以写为:

    SELECT OD.OrderidP.ProductnameOD.QuantityP.Unitsinstock

    FROM [order Details] AS ODProducts AS P

    WHERE OD.Productid=P.Productid

    在对三个表进行查询的例子中,用别名的语句可以改写为

    SELECT OrderidLastNameContactName

    FROM Orders AS oEmployees AS eCustomers AS c

    WHERE o.Employeeid=e.Employeeid And o.Customerid=c.Customerid

使用UNION运算符合并结果集:UNION运算符将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部

                               行,可以认为,UNION是对集合做“合并”运算。使用UNION合并起来的SELECT查询结果集应该满

                               足如下条件:每个SELECT查询返回的列数和列顺序必须一致;

                                           每列的数据类型必须一一对应,并且是兼容的;

例:customers表中进行如下查询

    SELECT ContactNamecitypostalcode

    FROM customers

    假如这个查询会返回的行数为91

    emplyees表中进行如下查询

    SELECT lastname + ‘’+ firstnamecitypostalcode

    FROM employees

    假如这个查询返回的行数为9

    现在用UNION操作符把这两个查询联起来成为一条查询,就可以得到合并的结果集,总共就有100行记录

    SELECT ContactNamecitypostalcode

    FROM customers

    UNION

    SELECT lastname + ‘’+ firstnamecitypostalcode

    FROM employees

联接查询

内联接:内联接是用比较运算符比较要联接列的值的联接。内联接是最常用的多表查询,当数据来自于两个有关系的表时,常常用内联接查

        询。内联接的语法是在FROM子句中使用INNER JOIN把两个或者两个以上的表联接起来,用关键字ON来指定联接的条件。

例:INNER JOIN改写两个表的查询,从订单表Order Details和产品表Products中得到订单编号Orderid

    产品名称ProdcutName,订货数量Quantity和产品库存量Unitsinstock

    SELECT OD.OrderidP.ProductnameOD.QuantityP.Unitsinstock

    FROM [Order Details] AS OD INNER JOIN Products AS P

    ON OD.Productid=P.Productid                                                                                

    同样将三个表的查询用INNER JOIN语句改写

    SELECT OrderidLastNameContactName

    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 JOINLEFT JOIN):左外联接在结果集中返回所有LEFT JOIN操作符左侧表中的行。

        右外联接(RIGHT OUTER JOINRIGHT JOIN):右外联接在结果集中返回所有LEFT JOIN操作符右侧表中的行。

        完全外联接(FULL OUTER JOINFULL JOIN):完全外联接在结果集中返回两个表中的所有行

例:假设在city列上联接authors表和publishers表。结果只显示在出版商所在城市居住的作者。若要在结果中包括所有的作者,而

    不管也版商是否和作者在同一个城市,使用左外联接

    USE  pubs

    SELECT  a.au_fnamea.au_lnamep.pub_name

    FROM  authors  a  LEFT  OUTER  JOIN  publishers  p  ON  a.city=p.city

    ORDER  BY  p.pub_name  ASCa.au_lname  ASCa.au_fname  ASC

    若要在结果中包括所有的出版商,而不管作者所在城市中是否还有出版商居住,使用右外联接。

    SELECT  a.au_fnamea.au_lnamep.pub_name

    FROM  authors  AS  a  RIGHT  OUTER  JOIN  publishers  AS  p  ON  a.city=p.city

    ORDER  BY  p.pub_name  ASCa.au_lname  ASCa.au_fname  ASC

    若要在结果中包括所有作者和出版商,而不管作者所在的城市是否有出版商或者出版商是否和作者在同一个城市,使用完全外联接。

    SELECT  a.au_fnameau.au_lnamep.pub_name

    FROM  authors  a  FULL  OUTER  JOIN  publishers  p  ON  a.city=p.city

    ORDER  BY  p.pub_name  ASCa.au_lname  ASCa.au_fname  ASC

交叉联接

例:员工表中有9条记录,客户表中有91条,则两个表交叉联接的结果就是列出了每个员工和每个客户之间的一个组合,结果有819

    记录

    USE  Northwind

    SELECT  EmployeeIDCustomerID

    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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值