SQL进阶
SQL编码问题
使用SHOW VARIABLES LIKE 'char%';
可以查看当前窗口sql相关编码,在dos窗口内使用set 你想修改的选项=gbk;
,这种修改在窗口关闭后将失效,也就是一次性修改。每次修改或许会很繁琐,所以也可以找到my.ini文件在里面进行修改,重启数据库系统,使修改配置生效
mysql备份与恢复命令(即导入和导出)
1 | mysqldump -uroot -proot mydb>d:/yzw.sql//备份 |
约束
主键约束(唯一标识)
主键特点:非空、唯一、被引用(外键体现这一点)
当表的某一列被指定为主键后,该列就不能为空,不能出现重复值
1 | //当创建表时指定主键的两种方式 |
主键自增长
1 | //创建表时指定主键自增长 |
非空约束
1 | //sname设置非空约束 |
唯一约束
1 | //sname设置唯一约束 |
外键约束
外键必须引用主键,外键可以重复且可以为空,一张表中可以有多个外键
对象模型:可以双向关联,而且引用的是对象,而不是一个主键
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录
1 | CREATE TABLE dept{ |
三种关联关系
一对一
1 | CREATE TABLE hasband{ |
一对多
上面写外键约束用过,略
多对多
1 | CREATE TABLE student{ |
多表查询
合并结果集(合并两张表格)
1 | CREATE TABLE ab{a INT,b VARCHAR(11)}; |
连接查询
连接查询之内连接
方言:SELECT * FROM 表1 别名1,表2 别名2 WHERE 别名1.xx=别名2.xx
标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
连接查询之外连接
左外连接:外连接一主一次,左外部左表为主,主表所有记录无论满足条件与否,都打印出来,不满足字段内容为null
1 | SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx |
右外连接:与左连接理解类似
1 | SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx |
全外连接:SELECT * FROM 表1 别名1 FULL OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
mysql不支持
1 | 解决方式: |
子查询
子查询就是查询中有查询(即出现多个select关键字)
1 | //示例1: |
总结:
1.单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、<=、>=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
2.多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN、ALL、ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
3.单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1 列2 FROM 表2 别名2 WHERE 条件)
4.多行多列;SELECT * FROM 表1 别名1 , (SELECT ...) 别名2 WHERE 条件