MySQL数据库的配置与管理
一.MySQL服务的安装与启动
Linux几乎所有的发行版本都内置了MySQL数据库。RHEL5也自带了MySQL服务。对于已经安装了MySQL的RHEL5可以执行以下命令查看:
#rpm -qa | grep mysql
与MySQL相关的软件包
mysql-5.0.22-2.1.i386.rpm(第二盘光张)―――――――――――MySQL客户端程序和共享库
mysql-connector-odbc-3.51.12-2.2.i386.rpm(第二盘光张)――MySQL的ODBC驱动程序
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 (第三张光盘)―――――――性能测试工具和基准,需要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
转自:http://blog.csdn.net/tjj101218/archive/2009/01/02/3683267.aspx