mysql oracle DB2 SQL-SERVER
安装提供数据库服务的软件包
[root@mail yum.repos.d]# rpm -qa | grep mysql
mysql-5.0.77-4.el5_4.2 工具包
mysql-server-5.0.77-4.el5_4.2 提供服务的主包
服务名称mysqld
进程名称mysqld
进程运行的所有者是mysql帐号
使用的传输协议tcp
默认监听端口 3306
启动数据库服务
#/etc/init.d/mysqld start/restart/stop/status
主配置文件/etc/my.cnf
访问数据库服务 (要输入正确的用户名和密码 才可以访问)
默认情况下只允许使用数据库管理员从数据库服务器本机登录
数据库管理员 名字 叫root 且密码默认为空
[root@mail mysql]# /etc/init.d/mysqld status
mysqld (pid 6331) is running...
登录数据库服务器
# mysql -h数据库服务器的Ip地址 -u登录用户名 -p密码
[root@mail mysql]# mysql -hlocalhost -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>quit; 退出登录
#mysql
mysql> select user(); 查看当前登录用户信息 那个用户从那登录的
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
mysql> select database(); 查看登录后 所在的数据库是那个
+------------+
| database() |
+------------+
| NULL | 表示登录的用户没有使用任何一个库
+------------+
1 row in set (0.00 sec)
mysql> show databases; 查看当前数据库服务器上已有的库 默认有3个初始库
+--------------------+
| Database |
+--------------------+
| information_schema | 虚拟库不占用磁盘空间 数据存放在内存里 服务器的参数信息
| mysql | 授权库
| test | 公共库
+--------------------+
库操作
建库 (数据库名具有唯一性 库名区分大小些 不能用纯数字
给数据库命名 不要用特殊字符 关键子 )
create database 数据库名;
drop database 数据库名;(如果库里有表也同时被删除了)
use 数据库名; 切换数据库
表操作(表是存放在数据库里的 同一个库里表名不能相同)
mysql> show tables; 查看当前所在的库里有那些表
建表
create table 表名(
<字段名1> <类型>[(宽度) 约束条件],
<字段名2> <类型>[(宽度) 约束条件],
<字段名3> <类型>[(宽度) 约束条件],
<字段名n> <类型>[(宽度) 约束条件]
);
mysql> create table gamet(
-> gamename char(3),
-> sex char,
-> level tinyint
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc gamet; 查看表结构(向表里插入记录时 要和字段的类型 约束条件匹配 才能插入记录成功)
字段名字 字段的类型 是否为空 索引 字段默认值 描述
+----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
| gamename | char(3) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| level | tinyint(4) | YES | | NULL | |
+----------+------------+------+-----+---------+-------+
insert into 表名(字段名1,字段名2,字段名n)
values
(字段1的值,字段2的值,字段n的值),
(字段1的值,字段2的值,字段n的值),
(字段1的值,字段2的值,字段n的值);
xmysql> insert into gamet(gamename,sex,level)
-> values
-> ("swk","b",300),
-> ("shs","b",250),
-> ("zbj","b",250),
-> ("ts","b",0);
查看表记录
mysql> select 字段名列表 from 表名;
* 代表表里的所有字段
mysql> select level,gamename from gamet;
mysql> select * from gamet;
+----------+------+-------+
| gamename | sex | level |
+----------+------+-------+
| swk | b | 127 |
| shs | b | 127 |
| zbj | b | 127 |
| ts | b | 0 |
+----------+------+-------+
无符号
mysql> create table t2( name char(3), level tinyint unsigned );
字段类型
数值类型
整数类型 (工龄 年龄)
浮点类型(有小数位 10.88) 工资 身高 体重
gz_tab
name
gz float(7,2) 10000.00
99999.99
100000.00
mysql> create table gz_t(
-> name char(3),
-> gz float(7,2)
-> );
字符类型(255)
char 定长字符 name char(3) tom jim yy y
varchar 变长字符 name varchar(3) tom yy
age int(3) 99 999 9999
1 11 111 1111
mysql> create table t4( name char(1), age int(4) zerofill );
日期类型(生日 上班时间 工作年份) now() 获取完整时间的函数
year年 date 日期 time 时间 datetime 日期时间
2012 2012-09-03 09:30 2012-09-03 09:30:00
01-69 20
70-99 19
00 0000
name
jobday year
birthday date
workstart time
workstartday datetime
mysql> create table t5(
-> name varchar(10), jim
-> jobday year, 2009
-> birthday date, 1988-10-9
-> workstart time, 10:30
-> workstartday datetime); 2009-09-10 8:00
ql> insert into t5 values("tom",now(),now(),now(),now());
mysql> insert into t5 values("lsy",2009,19900909,093000,20091018093000);
mysql> insert into t5 values("lsy",2009,"19900909","093000","20091018093000");
mysql> delete from t5; 删除表里的所有记录
表名
mysql> drop table t2;
表名 删除表
枚举类型(字段的值要在给定的范围内选择)
enum 只能在给定的范围内选择一个值
set 在给定的范围内可以选一个或多个值
性别 enum("男","女","保密")
爱好 set("look“,"film",“game”,“muisc")
name varchar(10)
sex enum("boy","gril","no")
loves set("look“,"film",“game”,“muisc")
mysql> create table gamedb.t6(
-> name varchar(10),
-> sex enum("boy","gril","no"),
-> loves set("book","film","music","football")
-> );
mysql> insert into t6 values("jim",'boy','book');
mysql> insert into t6 values("tom",'boy',"film,music");
约束条件
null 是否允许字段值为null(空) 默认允许为null
not null 不允许为空
key 索引字段 主键 外键 索引(index unique)
default 字段的默认值 默认的默认值是Null
插入记录时不给字段赋值时使用字段的默认值给字段赋值
default 值 (值的类型 要和字段类型匹配)
Extra 描述信息
mysql> create table t7(
-> name varchar(10) not null,
-> sex enum("boy","gril") not null default "boy",
-> age int(2) not null default 23,
-> loves set("a","b","c","d") not null default "a,b"
-> );
mysql> delete from t4 where age is NULL;
指定的字段没有值
在studb库里 创建 stuinfo表 字段如下
姓名 字符类型 不允许为空 名字的最大长度是10个字符 变长
性别 默认是 boy 不允许为空 可选范围只能是在 boy gril 里选
年龄 不允许为空 默认24 是tinyint类型 且不允许 存负数
爱好 不允许为空 默认爱好 football book 可以有多个爱好
生日 不允许为空
上课时间 不允许为空
出生年份 不允许为空
专业 不允许为空 默认是 network 单选(dba shell os c network)
成绩 数值类型 100分 不允许为空 默认 60分
修改表结构 表名
mysql> alter table test1 动作
动作
add 添加字段 (用add新添加的字段会按照添加的顺序追加在已有字段 的下方)
mysql> alter table test1
-> add name char(10) not null,
-> add age int(3) not null default 19;
first 添加字段时,把新添加的字段放在所有已有字段的上方
mysql> alter table test1 add mail varchar(50) not null first;
after 字段名 添加字段时,把新字段添加在指定字段的下方
mysql> alter table test1 add loves set("book","film","network") not null default "book" after name;
modify 修改字段类型 和 约束条件
mysql> alter table test1 modify age tinyint(2) unsigned not null default 23;
change 修改字段名 和 修改字段类型、约束条件
源 新
mysql> alter table test1 change mail email varchar(50) not null;
mysql> alter table test1 change email usermail char(10) not null;
drop 删除字段 字段名
mysql> alter table test1 drop id;
mysql> alter table test1 drop name,drop usermail;
更新表中的记录
表名 字段名=值列表 条件表达式
mysql> update test1 set name="tom" where id=2;
mysql> update test1 set id=1,loves="book,film,network" where id=0;
给表重命名
mysql> alter table 源表名 rename 新表名;
mysql> alter table test1 rename stuinfo;
复制表 复制源表的那些数据
mysql> create table 新表名 select * from stuinfo;
mysql> create table stuinfobak select * from stuinfo; 复制源表所有数据
mysql> create table stuinfo_1 select id,name,age from stuinfo; 复制源表部分数据
只复制源表的表结构(源表 表结构中key字段的属性不会同步给新表)
mysql> create table gnome_stuinfo select * from stuinfo where 1=2 ;
不成立的条件
练习
按如下表结构建表
mysql> desc stuinfo;
+-------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(10) | NO | | NULL | |
| loves | set('book','film','network') | NO | | book | |
| age | tinyint(2) unsigned | NO | | 23 | |
+-------+------------------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
修改stuinfo表的表结构 要求如下
1 删除id字段
2 添加address字段放在所有字段的下方 变长字符类型 宽度是60 不允许为空
3 在name字段下方添加名为sex的字段 枚举类型 字段的值只能在boy或girl
内选择某一个 不允许为空 字段的默认值是boy
4 在所有字段的上方添加stu_id 整形不允许为空
5 将loves字段改名为likes
可选值的范围改为set('book','film','network','music','football') 不允许为空
默认值改为 book 和 football
6 向表内插入10条记录
7 将stuinfo表改名为tea_tab
表结构中的key(索引)
索引 相当于书的目录
好处 会加快select速度
坏处 减慢insert update delete 的速度
index (标记 MUL ) 索引 字段值可以重复 且会把字段值按顺序排序
建表时 就指定 那个字段是index字段
mysql> create table t1(
-> stu_id int(3) not null,
-> name varchar(10) not null,
-> age int(3) not null,
-> index(name) #指定表中的name字段为index字段
-> );
把已存在的表中的某个字段设置为索引字段
mysql> create index 索引名 on 表名(字段名);
mysql> desc t2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int(3) | NO | | NULL | |
| name | varchar(10) | NO | | NULL | |
| age | int(3) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> create index name on t2(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc t2;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| stu_id | int(3) | NO | | NULL | |
| name | varchar(10) | NO | MUL | NULL | |
| age | int(3) | NO | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
删除表中字段的索引属性
mysql> show index from 表名; 显示指定表的索引信息
mysql> drop index 索引名 on 表名;
unique (UNI) 索引 字段值不可以重复 且会把字段值按顺序排序
mysql> create table t4(
stu_id int(3) not null,
name varchar(10),
age int(3) not null,
unique(name)
);
mysql> drop index name on t4;
mysql> create unique index stuid on t4(stu_id);
primary key 主键 只能把表中的一个字段设置为primary key
字段的值也不可以重复 如果要把一个表里的多个字段
都设置为primary key字段
多个字段同时作primary key 是叫符合主键(要在建表之初一起指定)
mysql> create table t5( id int(3) primary key auto_increment,
-> name varchar(10) not null,
-> age int(2) not null,
-> index(name)
-> );
mysql> create table t5(
-> id int(3) auto_increment,
-> name char(3) not null,
-> age int(3),
-> primary key(id)
-> );
把已有表里的某个字段设置为主键盘字段
mysql> alter table t7 add primary key(id);
mysql> alter table t7 modify id int(3) not null auto_increment;
mysql> desc t7;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| name | char(3) | YES | | NULL | |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> alter table t7 modify id int(3) not null;
mysql> alter table t7 drop primary key;
复合主机
ser_access
hostip ser_name ser_port a_status enum('allow','deny') default "deny"
primarykey primarykey
mysql> create table ser_access(
-> hostip varchar(15) not null,
-> ser_name varchar(15) not null,
-> ser_port varchar(5) not null,
-> a_stuatus enum('allow','deny') not null default "deny",
-> primary key(hostip,ser_port)
-> );
mysql> select * from ser_access;
+---------+----------+----------+-----------+
| hostip | ser_name | ser_port | a_stuatus |
+---------+----------+----------+-----------+
| 1.1.1.1 | vsftpd | 21 | allow |
| 1.1.1.1 | named | 53 | allow |
+---------+----------+----------+-----------+
*当表中有复合主键时 只要复合主键的值 不同时重复就可以插入记录
foreign key 外键 (要在表中设置外键字段 当前表的存储引擎要是innodb才行)
子表外键字段的值 要参考父表外键字段的值
存储引擎 执行sql语句一段代码 不同存储引擎存储数据的方式
和功能都不相同
默认mysqld数据库服务使用的存储引擎是myisam存储引擎
查看数据库服务器当前使用的存储引擎
mysql> show variables like "table_type";
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| table_type | MyISAM |
+---------------+--------+
mysql> show create table t1; 看建表过程
建表是指定表使用的存储引擎
mysql> create table t9(
-> id int(3)
-> )engine=innodb; 存储引擎
修改表的存储引擎
mysql> alter table t10 engine=innodb;
表名
设置数据库服务器默认使用的存储引擎vim /etc/my.cnf
vim /etc/my.cnf
[mysqld]
default-storage-engine=innodb
:wq
# service mysqld restart
在表中建外键字段
1 表使用的存储引擎要是innodb
2 外键字段的类型要匹配
3 作外键的字段要是primary key 或 index 属性
yg_tab
yg_id primary key auto_increment 员工编号
name
mysql> create table keydb.yg_tab(
yg_id int(3) primary key auto_increment,
name varchar(10)
)engine=innodb;
gz_tab
id 存放工资记录的编号 primarkey key auto_increment
gz_id 员工编号 index
gz float(7,2)
mysql> create table gz_tab( id int(3) primary key auto_increment,
gz_id int(3) not null,
gz float(7,2),
index(gz_id),
foreign key(gz_id) references yg_tab1(yg_id) on update cascade
on delete cascade)engine=innodb;
说明
foreign key(当前表的字段名) references 父表名(父表里的字段名)
on update cascade 子表与父表同步更新
on delete cascade 子表与父表同步删除
数据的导入
数据的导出
查询
用户权限
数据备份与恢复
binlog日志
AB复制
读写分离
mysql集群
搭建LAMP