上一篇文章主要介绍了MySQL的数据库/表的操作以及数据的增删改查等基本操作,本篇文章主要介绍数据库的编码、备份、主键、约束、多表查询等内容,相较于上一篇文章要难一点。
查看MySQL编码命令:show variables like ‘char%’;
接下来逐条分析每个variable:
character_set_client----客户端发送的数据,mysql会当成该编码来解析,可以使用 set character_set_client=gbk;更改当前窗口的client编码,但关 闭该窗口后又恢复到了以前的值 character_set_results---数据库以该编码格式给客户端发送数据,set character_set_results 可以设置该编码格式,但是也是临时设置可以修改my.ini文件,永久修改上面的两个属性值: 这一条设置语句相当于设置了client、results、connection的值为gbk
数据库的备份和恢复分为两步:
备份 : 数据库—>sql脚本恢复 : sql脚本–>数据库mysqldump -u用户名 -p密码 数据库名>sql脚本绝对路径
eg:
备份数据库mydb
mysqldump -uroot -p123456 mydb>c:\mydb.sql
mysql -u用户名 -p密码 数据库名 ‘<’sql脚本绝对路径
eg:
备份数据库mydb1 mysql -uroot -p123456 mydb1’<’c:\mydb.sql
恢复数据库还可以在登录数据库后,使用source sql脚本来完成
create database mydb2; use mydb2; source c:\mydb.sql;
约束是添加在列上的,用来约束列。
主键特性:
唯一非空可被引用当某一列被设置成了主键,则该列的值不能为空,且唯一
方法一:
方法二:
查看创建的主键
alter table table_name add primary key(列名);
eg: alter table stu add primary key(sid);
alter table table_name drop primary key;
eg: alter table stu drop primary key;
auto_increment,这个属性大多和主键约束一起用(可以单独使用),必须是int类型,且一张表只能有一个列使用该约束
创建表时设置自增长: create table table_name( 列名1 int primary key auto_increment, 列名2 类型2, ...... 列名n 类型n, ); eg: create table stu( _id int primary key auto_increment, name varchar(20), age int, gender varchar(5) ); 修改表时设置自增长: alter table table_name change 列名 新列名 int auto_increment eg: alter table stu change sid sid int auto_increment 删除自增长 alter table table_name change 列名 新列名 int eg: alter table stu change sid sid int设置某列非空约束后,该列的值不能为空NULL
设置: create table table_name( 列名1 类型1 not null, 列名2 类型2, ...... 列名n 类型n ); eg: create table stu( sid int primary key auto_increment, name varchar(20) not null, age int, gender varchar(5) );设置某列唯一约束后,该列的值不能重复
设置 create table table_name( 列名1 类型1 unique, 列名2 类型2, ...... 列名n 类型n ); eg: create table stu( sid int primary key auto_increment, name varchar(20) not null unique, age int, gender varchar(5) );表与表之间三种关系 1. 一对多关系 2. 一对一关系 3. 多对多关系
核心:从表的主键,也是外键
eg: 先创建一张主表 create table husband( h_id int primary key auto_increment, h_name varchar(10) ); 再创建一张从表 create table wife( w_id int primary key auto_increment, w_name varchar(10), constraint fk_wife_husband foreign key(w_id) references husband(h_id) );多对多的关系体现在关联表中!
将查询的两个结果集的记录(行数)合并显示,要求结果集的结构相同(列、类型)。
关键字: 1. union ------- 去除结果集中完全相同的行(记录) 2. union all ------- 不去除相同的行,全部合并 eg: 创建student表 create table student( s_id int, s_name varchar(10) ); insert into student values(1,'stu_zhang'); insert into student values(2,'stu_wang'); 创建teacher表 create table teacher( t_id int, t_name varchar(10) ); insert into teacher values(5,'tea_zhao'); insert into teacher values(6,'tea_han'); 合并结果集: select * from student union all select * from teacher;别名:笛卡尔积 两(多)张表的记录组合 如果没有查询条件,则查询结果为两张表所有记录的自由组合m*n,当有查询条件时,查询结果为满足条件的记录
select 表名1.列名1 ……,表名2.列名1…… from 表名1,表名2 where condition
或者
select 表名1.列名1……,表名2.列名1…… from 表名1 inner join 表名2 on condition
eg:
emp表 select * from emp; dept表 select * from dept; 内连接查询: select emp.ename, emp.deptno, dept.loc from emp, dept where emp.deptno=dept.deptno; 或者 select emp.ename, emp.deptno, dept.loc from emp inner join dept on emp.deptno=dept.deptno; 也可以给表起别名,这样便于书写 select e.ename, e.deptno, d.loc from emp e, dept d where e.deptno=d.deptno; 或者 select e.ename, e.deptno, d.loc from emp e inner join dept d on e.deptno=d.deptno;查询结果:
左边的记录全部显示出来,不满足条件时,右表使用NULL代替
eg: select e.ename,e.deptno,d.loc from emp e left outer join dept d on e.deptno=d.deptno;查询结果
右边的记录全部显示出来,不满足条件时,左表使用NULL代替
eg: select e.ename,e.deptno,d.loc from emp e right outer join dept d on e.deptno=d.deptno;查询结果
左右表的所有记录均显示出来,效果类型与左外连接和右外连接,然后合并结果集
select e.ename,e.deptno,d.loc from emp e left outer join dept d on e.deptno=d.deptno union select e.ename,e.deptno,d.loc from emp e right outer join dept d on e.deptno=d.deptno;查询结果