MySQL在Windows下:关闭服务:net stop mysql
启动服务:net start mysql
设置字符集:set names 字符集名; # 如:set names gbk/utf8;
一、MySQL数据库中关于表的操作
1、修改基本表
(1)表的重命名
#rename table oldname to newname;
支持同时修改多个表名
#rename table 表1oldername to 表1newname,表2oldername to 表2newname;
支持跨数据库修改表名 (类似把一个表从当前数据库迁移到别的数据库)
#rename table tablename to '库名'.newname;
注:可以利用跨数据库重命名表,也可以为数据库重命名
为数据库重命名用途:创建一个新的数据库,把旧的数据库中的表都rename到
新的数据库,删除旧的数据库
#交换两个表的名字
#rename table tb1 to tb3,tb2 to tb1,tb3 to tb2;
(2)修改表的列定义:alter table tablename [add/drop/change/modify]
子命令:增加、修改、删除、重命名
增加一个新的列:
#alter table tablename add 新列的定义
如:# alter table tablename add height int;
删除一个列:
#alter table tablename drop 列名;
修改一个列的定义:
#alter table tablename modify 列定义;
如:#alter table tablename modify name varchar(40);
列的重定义:
#alter table tablename change 列的重定义;
如:#alter table tablename change score fenshu int; (注意change提供了重命名方法)
修改表的选项:
#alter table tablename 新的表选项
如:#alter table tablename character set utf8; 设置表的字符集为utf8
注:修改数据库的字符集 #alter database dbname character set utf8;
2、查看表的创建信息
#show create table tablename; 显示表的创建信息(格式不清楚)
#show create table tablename\G \G结尾,表的创建信息显示的完整,格式条理
#desc tablename; 查看表的属性定义信息
二、数据操作DML:增删改查
#crud:create、read(retrieve检索)、update、delete
# create table it_class(
Class_id int primary key auto_increment(自动增长),
Class_name varchar(10) not null default ‘it_php’ comment ‘班级名称’, (comment用于指定注释)
)character set utf8; 再定义表的同时显式设置字符集
1、创建数据:insert
#insert into tablename(字段列表) values(字段列表对应值);
2、获得数据:select
#select 字段列表 from tablename 查询条件;
#条件查询用where子句
#select 字段列表 from tablename where 查询条件;
注:(1)*代表所有字段
(2)查询条件可以省略,表示所有的记录都获得;
(3)NULL表示什么都没有,但是也占用空间
(4)如果需要为所有的属性列表赋值,可以不加属性列表,但值的顺序必须按定义的顺序来写
3、删除数据delete
#delete from 表名 条件;
#删除若没有条件限制,默认删除所有的数据;
4、修改数据update : 修改字段的值
#update tablename set 字段=newnum where 条件匹配;
#语法上,若没有指定条件,则修改所有记录对应列的值
三、校对规则
1、查看设置的初始值
#show variables; //显示所有的属性初始值
2、查看数据库的字符集
#show variables like 'character_set%';
#所有的编码设置放在MySQL的配置文件(mysql.ini);
mysql> show variables like 'character_set%';
+--------------------------+------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------+
| character_set_client | utf8 当前客户端的编码 |
| character_set_connection | utf8 当前连接的编码 |
| character_set_database| utf8 当前默认数据库的编码 |
| character_set_results | utf8 |
| character_set_server | utf8 当前服务器的编码(在mysql.ini中可以修改) |
| character_set_system | utf8 |
| character_sets_dir | G:\sqlserver\MySQL\mysql\share\charsets\ |
+--------------------------+------------------------------------------+
7 rows in set (0.00 sec)
四、列属性(列的约束):保证表的结构和数据的正确性和稳定性;
注:若不显式指定,默认可以为空,此时在插入数据时,此属性可以不指定值;
1、是否为空:规定一个字段的值是否可以为NULL(两种形式:null|not null)
2、为列指定默认值: default value 来指定;
## create table php{
a int not null default 10,
b int not null default 20
}; 指定默认值直接跟在属性列后面
此时插入数据:insert into php values();
默认值,在插入数据时,没有显式为该字段指定值时启用默认值为该属性赋值,而且默认值的
设置需要固定值
注:常见的是一个字段不能为空,而且存在默认值。
3、主键和唯一索引
主键:PK(primary key):一列或者一组属性列可以用来唯一标识某条记录的字段的集合。
注:主键一般利用自然增长的序列来设置;可以是真实是实体的属性,但一般好的主键是利用一个与实体不相关的属性作为唯一主键,作为唯一标识
主键上:值唯一且不为NULL;
主键语法:primary key
两种定义方法:
法一:在字段上设置:t_id int primary key;
法二:再定义完字段后创建;(用于定义组合主键)
create table ppp1(
a int not null,
b int not null default 20,
c int,
primary key(a,b)
); # 组合主键的意义:一个主键内包括多个字段,并不是多个字段都是主键。
四、实体间的关系
1、典型的1:1设计:两个实体表内,存在相同的主键属性;如果记录的主键值等于另一个关系表内记录的主键值,则两条记录对应。
此种设计方法:又叫垂直分割,常用于数据库优化,只要两个实体表内存在相同的主键
2、1:m(一对多):例如一个班级对应多个学生 # 平时用的最多
设计:在多的(m)那段增加一个字段,用于指向该实体所指的另外实体的位置
3、m:n(多对多): 例如:一个班级被多个老师教,一个班级可以被多个老师代课
设计:利用一个中间表表示实体之间的关系。把关系拆分成两个1:n关系
4、通过MS visio 软件来设计实体间的关系图(自己动手画一次)
五、外键(foreign key):如果一个实体(student)的某个字段(stuent:class_id),指向另一个实体(class)的主键(class_id),就叫student的class_id为外键
注:此时student为参照关系,class被称为被参照关系
外键的作用:用于约束处于关系内的实体
# 增加子表记录时,是否有与之对应的父表记录(没有增加不了)
即:再增加子表记录时,在主表中必须有与之外间对应的记录存在才可以增加记录
# 在删除或者更新主表记录时,从表应该如何处理相关的记录
定义一个外键:在从表上,增加一个外键字段,只想主表的主键
方式:foreign key (外键字段) references 被参照表(参照字段)
create table it_stu(
stu_id int primary key auto_increment,
stu_name varchar(20) not null,
class_id int,
foreign key (class_id) references it_class(class_id)
)character set utf8;
触发器:MySQL中的一项高级操作
在当前表上,设置一个对每一行数据的监听器,监听相关事件,每当事件发生,会执行一段由SQL完成的代码段
触发器元素:事件,执行代码
1、创建触发器:
Create trigger name 事件 执行性代码;
事件:一个完整的事件需要指明对某一个表在某一个时机上的操作
事件类型:insert、delete、update 注意:查询没有触发器
事件时机:执行之前 before,执行之后 after
如:
delimiter && (delimiter用于指定SQL语句的结束符,因为触发器代码冗长,需指定自己的结束符)
执行频率:for each row 逐行 for each statement 逐语句
delimiter &&
create trigger salary
after update on instructor
for each row
update i_salary set salary=salary-20;
2、如何触发触发器
当mysql内创建的触发器内的特殊事件满足时,触发器执行
3、注意事项:
(1):触发器不能重名
(2)MySQL内触发器的建立规则:不支持在同一表上建立相同类型的触发器
即:在一个表上,每类触发器只能建立一个
4、管理触发器
删除:drop trigger tri_name;
查看一个触发器:show triggers from 数据库名; 查询对应数据库内的触发器
5、触发器高级操作:
数据:就是触发各事件的开关
在触发器内,获得触发该触发器时的数据:
领用触发器内部的old 和 new 来完成
Old:在事件发生之前时的数据,即旧的数据
New: 在事件发生之后,新处理完毕的数据