摘要:
编码处理问题
- 查看NySQL数据车编码
SHOW VARIABLES LIKE ‘char%’ ; - 編码解释
character_ set client: MySQL使 用该编码来解读客户端发送过来的数据,例如该编码为urre, 那么如果客户端发送过来的数据不是uIre,那么就会出现乱码
. character set results: MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为uIre,那么如果客户端不使用IF8来解读,那么就会出现乱码
其它端码只要支持中文即可,也就是说不能使用1atinl: - 控制台乱码问题
- 插入或修改时出现乱码:
这时因为cmd下默认使用GBK,而character_ set_ client不是GBK的原因。我们只需- - 让这两个编码相同即可.
因为修改cmd的编码不方便,所以我们去设置character. set_ client为GBK即可 。 - 查询出的数据为乱码:
这是因为character. get. resulte不是GBK,而cma默认使用GBK的原因。我们只需让这两个编码相同即可。
因为修改cmd的编码不方便,所以我们去设置character_ set results为GBK即可。 - 设置变量的语句:
set character. set. client=gbk;
set character. get. regults=gbk;
注意,设置变量只对当前连接有效,当退出窗口后,專次登录my3q1, 还需要再次设置变量。
为了-劳永逸,可以在my.in1中设置:
设置default-character-set-gbk即可。
- 指定默认编码
我们在安装MySQL时已经指定了默认编码为uIr8,所以我们在创建数据库、创建表时,都无需再次指定编码.
为了一劳永逸,可以在my.ini中设置:
[client]
port=3306
[mysq1]
default-character-set=gbk
数据库备份处理(导入与导出)
- 第一种实在外面直接进行执行操作
Mysqldump -uroot -p密码 db_demo>d:\db_demo.sql;
Mysqldump -uroot -p密码 db_demo<d:\db_demo.sql;
- 第二种在进行数据库里面进行导入操作
前提条件是需要创建好db_demo数据库
Source d:\db_demo.sql
- 约束
- 主键约束
非空
唯一性
被引用
- 主键约束形式:
1.PRIMARY KEY(字段);
2.字段 类型 PRIMARY KEY; - 修改指定的约束(指定为主键)
ALTER TABLE 表名 ADD PRIMARY KEY(主键的字段); - 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
-
主键自增
AUTO_INCREMENT与主键搭配使用操作 -
非空和唯一约束
非空 NOT NULL
唯一约束 UNIQUE KEY -
关系模型
-
对象模型:可以双向关联,而且引用的是对象,而不是一个主键!
关系模型:只能多方引用一方,而且引用的只是主键,而不是
对象模型:在java中是domain! ! ! 例如: User、 student
is a
has a(关联)
1对1
1对多
多对多
use a -
外键
添加外键方式2种:
1.创建表的时候进行约束:
FOREIGN KEY(外键id)REFERENCES 绑定主键的表名 (主键);
Primary key
2.在创建了以后再进行添加处理的操作:
ALTER TABLE emp
ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(外键id) REFERENCES dept(deptno)
删除外键:
ALTER TABLE emp DROP FOREIGN KEY key_emp_deptno;//约束名称进行删除 -
一对一的关系
可以使用的一个表的主键作为另外一个表的外键,而这个外键就是另外一个表的主键这样的话,就可以实现一对一操作
这个操作中使用的是 非空 唯一 引用操作 -
多对多的关系
这个时候需要建立三个表,在哪个中间表中建立2个外键,其他的2个表不直接存在关系,这样的话就可以实现一个多对多的对应的关系。
多表查询操作
- 合并集
合并就是表示可以将多个表一起查询出来,前提条件是有相同的列类型和列数相同的
UNION 去除重复行
UNION ALL 不去除重复的行 - 连接查询操作
连接查询就就是一个笛卡尔积,笛卡尔积的话会产生很多垃圾信息,这个时候的话,就可使用条件去去除垃圾信息。
- 内连接
- 方言查询
- SELECT * FROM emp dept WHERE emp.deptno=dept.deptno;
- 标准查询
- SELECT * FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;
- 自然查询
- SELECT *FROM emp NATURAL JOIN dept ;
自然的查询,这个时候可以直接省略掉这个卡迪尔积产生的垃圾信息,这个时 候会自己自动的进行匹配。 - 外连接
概要:外连接有一主一次,左外的话即表示左表为主,表示主表的中所有的记录无论是满足于不满足条件都打印出来,当不满足条件的时候,右表的使用NULL来补位,右外连接和左外连接是一样的 .
- 左外
SELECT *FROM 表一 LEFT OUTER JOIN 表二 ON 表一.主外键=表二主外键; - 右外
SELECT *FROM 表一 RIGHT OUTER JOIN 表二ON 表一.主外键=表二.主外键
- 全连接
-
全连接:SELECT *FROM emp FULL OUTER JOIN dept ON enp.deptno=dept.deptno这个操作,当是在mysql 中不支持这个操作 ,支持oracle,这个时候的话,可以使用的是UNION将左外查询和右外查询结合在一起查询这个时候查出来就是全连接的操作;
-
全连接
SELECT *FROM 表一 FULL OUTER JOIN 表二ON 表一.主外键=表二.主外键
Mysql不支持,oracle支持 -
mysql合并集的操作
SELECT *FROM 表一 RIGHT OUTER JOIN 表二ON 表一.主外键=表二.主外键
UNION
SELECT *FROM 表一 LEFT OUTER JOIN 表二 ON 表一.主外键=表二主外键; -
子查询
子查询的 就是一个双向的SELECT 的查询的操作
出现的位置- Where 后都作为条件进行操作
- From 后面的作表的操作
- 单行单列的形式 可以使用就是 基本的运算符
SELECT * FROM 表1 别名1 WHRE列1 (=、>、<、>=、<=、!= (SELECT列 FROM 表2 别名2 WHERE 条件)
- 多行单列的形式
就表示的类似于一个集合的一样的形式,这个时候的话 可以使用的是 IN(里面就数据集) ALL(所有) ANY(任意的)
SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALI, AIY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
- 单行多列的形式
就表示的类似于 一个对象的查询比较的操作,使用的一般的是 () IN(),进行比较操作得出的需要数据
SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1 列2 FROM 表2 别名2 WHERE 条件);
- 多表多行的形式
就一般是出现在FROM的后面主要的作用是为了作为一个查出来的表的,在进行进一步的判断操作处理。
SELECT * FROM 表1 别名1 ,(SELECT ...) 别名2 WHERE 条件;
案例题目
查出年份、利润、年度增长比
查出年份 利润,年度增长比(想办法弄到一行数据上面来)
SELECT y.,CONCAT(( y1.zz-y2.zz)/y2.zz100,’%’) AS 增长比
FROM year y1 LEFT OUTER JOIN year y2
ON y1.year=y2.year+1;
分析的技巧:
列:。。
表:。。
条件:。。
申明参考资源:黑马程序员资料