MySQL编码问题
查看MysQL数据库编码:SHOW VARTABLES LIKE 'CHAR%'
character_set_client
:MYSQL使用该编码解读客户端发过来的数据。如果客户端发回来的数据不是这个,就会出现乱码
character_set_results
:MYSQL会把数据转换成该编码再发送给客户端。如果客户端不使用该编码,就会出现乱码
CMD默认使用GBK,需要修改变量
set character_set_client = gbk;
set character_set_results = gbk;
修改后只能当前cmd窗口有效,永久改需要到配置文件中修改。在 my.ini中设置
数据库备份恢复
数据库 转换 成 sql语句
sql语句 转换成 数据库
在cmd里,数据库 – SQL语句
备份:
mysqldump - u.... -p.... 数据库名称 > sql文件路径
注意:没有创建数据库,只是备份数据库内容
恢复:
先创建数据库
exit后,mysql -u… -p… 数据库名称 < sql脚本文件路径
注意:生成的脚本文件没有creat database语句,所以备份的是数据库内容,没有创建数据库
最后不要打分号,不要登入mysql,直接cmd运行
第二种 恢复方法:
登入数据库操作,在空的数据库中,使用source语句。上一种是创建新的数据库退出后 执行语句,这个是直接在创建新的数据库中执行
source + sql脚本文件路径 (无分号)
约束 之 主键约束
约束是添加在列上的,同来约束列
主键特性(唯一标识)
1.非空,2.唯一,3.被引用
当表的某一列被指定为主键后,该列就不能为空,不能有重复出现(例如人的主键是身份证号)
创建表时指定主键的俩种方式:
1.CREATE TABLE xxx()
在某一列后不加逗号,加PRIMARY KEY,
2.在最后那列 加 PRIMARY KEY(列名)
修改表时指定主键:
ALTER TABLE xxx ADD PRIMARY KEY(列名);
删除主键:
ALTER TABLE xxx DROP PRIMARY KEY;
主键自增长
通常主键类型为整型,设置为自动增长。保证插入数据时的唯一性和非空性
创建表时指定主键自增长: 在PRIMMARY KEY + AUTO_INCREMENT
主键的列自动填充,自己指定也行,如果不符合主键要求就自动填充
单独创建一个列为 主键,作为主键 。没有其他意义。
非空约束
因为某一些列不能设置为null值,所以对列添加非空约束
创建表时 对指定的列 后面 + NOT NULL
唯一约束
某一些列不能设置重复的信息,所以我们对列添加唯一约束
指定列 后面 加UNIQUE
概念模型
概念模型
一对多
一对一
多对多
对象模型:可以双向关联,引用的是对象,而不是一个主键
关系模型:只能多方引用一方,引用的是主键,而不是整个记录。
外键约束
特性:
1 外键必须引用(另一表,自己也可)主键
2 外键可以重复
3 外键可以为空
4 一张表中可以有多个外键
添加外键约束 一对多
一个表中的一列 作为外键 引用其他表或者自身表的主键
语句:创建表时:最后加CONSTRAINT xxx FOREIGN KEY(自身表的外键的列名) REFERENCES 引用表(引用表的主键列名)
修改表时 加外键约束:ALTER TABLE xxx ADD CONSTRAINT xxx FOREIGN KEY(自身表的外键的列名) REFERENCES 引用表(引用表主键列名)
一对一关系
改一下就行,将自身表的外键列指定为 自身表的主键,这样 的外键不能重复 ,对应的唯一的引用表的主键 ,就是一对一关系
CONSTRAINT xxx FOREIGN KEY(自身表的**主键**的列名) REFERENCES 引用表(引用表主键列名)
多对多关系
额外使用一张中间表, 创建俩个外键 ,对应俩张表的主键。然后俩个外键 将 俩张表的主键联系起来。
多表查询
合并结果集
要求 ,俩个表的结构一样
UNION,去除重复行
UNION ALL,不去重复行
SELECT * FROM ab UNION ALL SELECT * FROM cd;
连接查询
- 内连接
- 外连接
– 左外连接
– 右外连接
– 全外连接(MySQL不支持) - 自然连接(属于一种简化形式)
连接查询 之内连接
首先查询俩个表,FROM后面这样会出现笛卡尔积现象,俩个表记录会相乘。产生很多无用的数据,所以需要加条件
方言:SELECT * FROM 表1 别名1,表2 别名2 WHRER 别名1.列名 = 别名2.列名
标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.列名 = 别名2.列名
自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
会自动找条件,找俩个表相同的列作为条件
连接查询之外连接
外连接有主次,主表的记录无论满足不满足条件,都打印出来,次表只有满足条件才显示。次表部分记录不符合条件使用NULL补位
1.左外连接,左表为主 表1为主
SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 条件
2.右外连接,右表为主 ,表2为主
SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 条件
全外连接
左表 右表 的记录都显示出来,不符合的都用NULL代替
可以将 左外连接 和右外连接的 结果集合并 , 就相当于 全外连接
子查询
一个SQL语句中含有多个SELECT
查询工资最高的员工的信息
SELECT * FROM emp WHRER sal = (SELECT MAX(sal) FROM emp);
子查询出现的位置
FROM后 作为表 需要对这个表起别名
WHRER 后作为条件
单行单列 作为结果集可以 在条件中使用大于等于
多行单列 的话 ,在条件中使用,加上关键字ALL ANY IN 比如xxx > ALL 多行单列
单行多列 类似一个对象,与查找的对比
多行多列,一般在FROM后 作为表,作二次查询