MySQL数据库系统由几部分组成。您应该熟悉这些组成部分的内容和每个部分的目的。这需要您了解所管理系统的特征以及帮助您进行管理的可用工具。如果您花时间去了解了要监督的内容,工作将会变得非常容易。为此,您应当使自己熟悉MySQL的以下几个方面:
MySQL服务器。服务器mysql执行数据库和表的所有操作。safe_mysqld 是一个相关的程序,它用于启动服务器、监控服务器和重新启动服务器。
MySQL客户机和实用程序。有几个MySQL程序,可用来帮助您与服务器进行通信和执行管理的任务。其中最重要的几个是:
mysql,一个交互式程序,允许将SQL 语句发布到服务器上并浏览其结果。
mysqladmin,一个管理程序,允许执行诸如关闭服务器以及创建或删除数据库的工作。如果服务器运行不正常,还可以用mysqladmin 来检查服务器的状态。
isamchk 和my i s a m c h k,这些实用程序帮助您完成表的分析和优化,以及在表损坏时进行崩溃恢复。
mysqldump,一个工具,用于备份数据库或将数据库拷贝到另一个服务器中。
服务器的语言,SQL。有些管理职责只能用mysqladmin 的命令行实用程序来完成,但是,如果还能用服务器自己的语言来同服务器进行对话,那就更好了。没有任何替代品能够参与并与服务器直接通信。可通过使用mysql客户机程序发布能够检验授权表的SQL 查询来做到这一点。如果MySQL版本还未引入GRANT 语句,则需要使用mysql首先设置每个用户的权限。
如果不知道SQL 的任何内容,至少必须对SQL要有基本的了解。缺乏对SQL 的熟悉只会带来困惑,而在学习SQL 上所花费的时间将会得到成倍的回报。真正掌握SQL 要花费一些时间,但掌握基本技能则很快。
MySQL数据目录。数据目录是服务器存储其数据库和状态文件的所在。了解数据目录的结构及内容是很重要的,您可以知道服务器是怎样使用文件系统来表现数据库和表的,以及像日志这样的文件的存放位置和其内容。还应该了解在文件系统中管理磁盘空间分配的选项,当发现放置数据目录的文件系统过满时可以进行调整。
在本机命令行下进入MySQL
mysql@as4 ~]$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.0.33
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
1.3.3 MySQL用户管理
MySQL安装好后默认的管理员帐号也是root(与OS的帐号名一样),而密码是空,但是只能从本机访问,该默认帐号可以被删除和修改。
一、新增MySQL用户
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
但例1增加的用户是十分危险的,如果某人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录这台mysql数据库并对数据可以为所欲为了,解决办法见例1。
例1、增加一个用户test2密码为abc,使其只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,也无法从internet上直接访问数据库,只能通过MySQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
二、修改MySQL用户的方法,这里讲两种方法
1) 以root登陆后直接用SQL语句修改系统库mysql中的user表
[mysql@as4 mysql]$ mysql -u root –p(在命令行下用root身份进入MySQL)
mysql> use mysql; (选择系统数据库)
mysql> update user set password=password('654321') where user='root' (将root用户的密码改成654321,注意要加函数password(),因为mysql中密码是采用MD5算法进行加密的,如果不用该函数密码将以明文存储,这样在登陆的时候系统把654321用MD5算法一计算后就跟表user中存出的654321密码不一致了,这样你就登陆不了了)
mysql> flush privileges; (提交你的修改请求)
添加一个远程管理MySQL的用户
[mysql@as4 ~]$ mysql
mysql> grant all privileges on *.* to mysql@'192.168.0.0/255.255.0.0' identified by 'mysql';
mysql> \q
以上命令可以添加一个可以从192.168.0.0/16IP段访问MySQL服务器上所有数据库的用户,其中帐号是mysql,口令是mysql
三、常用命令行操作
1 显示命令
1)显示数据库列表。
show databases;
刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2)显示库中的数据表:
use mysql; //打开库,学过FOXBASE的一定不会陌生吧
show tables;
3)显示数据表的结构:
describe 表名;
4)显示表中的记录:
select * from 表名;
2 创建/删除命令
1) 建库:
create database 库名;
2) 建表:
use 库名;
create table 表名 (字段设定列表);
3) 删库和删表:
drop database 库名;
drop table 表名;
4) 将表中记录清空:
delete from 表名;
3 一个建库和建表以及插入数据的实例
drop database if exists book; //如果存在book库则删除
create database book; //建立库book
use book; //打开库book
create table storybook //建立表storybook
(
id int(3) auto_increment not null primary key,
name char(10) not null,
author varchar(50) default '张三',
public_date date
); //建表结束
//以下为插入字段
insert into storybook values('','MySQL数据库优化','李四','2006-12-15');
insert into storybook values('','精通PostgreSQL数据库','王五','2006-09-11');
MySQL作为系统服务的启动脚本
[root@as4 ~]# vi /etc/init.d/mysql5
#!/bin/bash
#
# Startup script for the MySQL 5.0.33 Server
#
# chkconfig: - 92 27
# description: MySQL server.
start(){
if [ -f $PROFILEDIR/MYSQL_PID ]; then
echo "MySQL Server has been Running!!"
else
if [ -f $MYSQL_BASE/bin/mysqld_safe ]; then
su - mysql -c "$MYSQL_BASE/bin/mysqld_safe --defaults-file=$MYSQL_BASE/my.cnf >/dev/null 2>&1 &"
sleep 3
head -n 1 $MYSQL_BASE/data/as4.pid >$PROFILEDIR/MYSQL_PID
echo "Startting MySQL"
else
echo "MySQL File Not Founds"
fi
fi
}
stop() {
if [ -f $PROFILEDIR/MYSQL_PID ]; then
# Stop the MySQL Server 5.0.33
su - mysql -c "rm -f $PROFILEDIR/MYSQL_PID;$MYSQL_BASE/bin/mysqladmin shutdown -u root -S $MYSQL_BASE/tmp/mysql.sock;"
echo "Stopping MySQL"
else
echo "Not Running MySQL"
fi
}
restart() {
if [ -f $PROFILEDIR/MYSQL_PID ]; then
# Restart the MySQL Server
stop
start
else
echo "Not Running MySQL"
fi
}
case "$1" in
'start')
# Start the MySQL Server 5.0.33
start
;;
'stop')
# Stop the MySQL Server 5.0.33
stop
;;
'restart')
# Restart the MySQL Server 5.0.33
restart
;;
*)
echo "Usage; `basename $0` {start|stop|restart}" 1>&2
exit 1
;;
esac
exit 0
1、删除数据库:DROP DATABASE 数据库名
2、删除表: DROP TABLE 表名
3、表改名: RENAME TABLE 旧表中 TO 新表名 数据库不能改名,但也不是绝对不能改,但改不好会造成里面的数据无法正常读出。
4、库改名: 常用方法是把新库创建出来,然后把旧库里的数据导入进去。
二、查询: 这是SQL中的一大块
SELECT 查询:此命令和其他数据库的没有什么大差别,关键是大家要熟练运用各种运算符,数**算符比较简单,重点在于字符型运算符LIKE、关系运算符和逻辑运算符
如:查找姓王的记录:SELECT * FROM YUANGONG WHERE 姓名 like '王%';
查找姓名中有五的记录:SELECT * FROM YUANGONG WHERE 姓名 like '%王%';
查找以王结尾的记录:SELECT * FROM YUANGONG WHERE 姓名 like '%王';
其中linit是SQL SERVER没有的。
例如:显示第三条到第七条记录
select * from 表名 limit 2,5;
通配符 描述 示例
% 通配零个或多个任意字符
_(下划线) 通配任意一个字符
不再含有 [ ] 不同于SQL SERVER
注意:如果用like发现结果不正确,有可能是编码的问题
三、记录排序
利用order by 对记录进行排序
格式:select 字段名列表 from 表名 [where 条件] order by 排序字段1 [asc ] [desc] [排序字段2……]
如:按年龄对yuangong表进行升序排列
Select * from yuangong order by 年龄 asc 或 select * from yuangong order by 年龄
如:按年龄对yuangong表进行降序排列
Select * from yuangong order by 年龄 desc
对员工表先按性别升序排列,性别相同的再按年龄从大到小排序
Select * from 员工表 order by 性别 asc,年龄 desc
如:求每个部门的基本工资平均值
select 部门,avg(基本工资) as 部门基本工资 from 员工表 group by 部门
显示平均基本工资大于3000的部门
Select 部门,avg(基本工资) from 员工表 group 部门 where avg(基本工资)>3000
此句错误。SQL规定在分组中使用条件不能用 WHERE 而是用 having
Select 部门,avg(基本工资) from 员工表 group by 部门 having avg(基本工资)>3000
五、多表查询:
一个数据库中的多个表,存在一定的联系,怎么样正常的显示这么表的信息?
现在有三个表:
yg
Name ** age
宋洋 男 20
马冬旭 女 40
gs
Name title date 单位
宋洋 AD详解 2006-11-10 清华大学
马冬旭 linux 2005-01-01 人民大学
dz
单位 地址
清华大学 五道口
人民大学 黄庄
第一种方法称为:交叉连接,在SQL SERVER中又称为笛卡尔乘积
但是要注意的默认生成的记录总数是两表记录之积
select * from yg,gs;
select * from yg,gs where yg.name=gs.name;
这才是我们想要的记录
第二种方法是用join连接:
内连接
select * from yg join gs on yg.name=gs.name
左外连接
右外连接
但没有全外连接
六、联合:
除了连接,mysql4.0以上的版本还支持UNION运算符,它用来把多个select查询号的输出连接成一个单独的结果集。大多数情况下,这个运算符用来把查询产生的结果集添加到不同的表,同时创建包括所有结果的一个单独表。比如面试的时候问你,有两个表,字段信息一样,让你用一条语句把两个表的信息组合为一个单独的表!
为了说明UNION运算符的使用方法,我们举一个例子:现在有两个表,分别存放的是男同学信息和女同学信息,如果用一个语句将所有同学的信息显示出来!
mysql> select * from nan;
+--------+-------+
| name | score |
+--------+-------+
| 彭聪留 | 80 |
| 费优优 | 81 |
| 曲权 | 82 |
+--------+-------+
3 rows in set (0.00 sec) mysql> select * from nv;
+------+-------+
| name | score |
+------+-------+
| 彭红 | 80 |
| 费红 | 81 |
| 曲红 | 82 |
+------+-------+
3 rows in set (0.00 sec)
mysql> select * from nan union select * from nv;
+--------+-------+
| name | score |
+--------+-------+
| 彭聪留 | 80 |
| 费优优 | 81 |
| 曲权 | 82 |
| 彭红 | 80 |
| 费红 | 81 |
| 曲红 | 82 |
+--------+-------+
6 rows in set (0.00 sec)
那如果有三个表怎么办?也是一样的操作。
但注意的是如果两个表的某条记录信息完全一致,则只显示为一条;如果想显示全部记录则在union后 加 all
mysql> select * from nan union all select * from nv;
如果想把显示的信息保存到一个表中怎么办?
mysql> create table 表名 select 语句;