MySQL 语法基础二

tech2024-12-30  18

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后 作为表,作二次查询

最新回复(0)