mysql-union,join,index
union
- 作用:把2次或多次查询结果合并起来
- 要求:2次查询的列数一致
- 推荐:查询的每一列相对应的列类型也一样
- 可以来自于多张表
- 多次sql语句取出的列名可以不一致,此时以第1个sql的列名为准
- 如果不同的sql语句中取出的行,有完全相同(每个列的值都相同),那 么相同的行将会合并(去重复)
- 如果不去重复可以加all来指定
- 如果子句中有order by,limit,须加(),推荐放到所有字句之后,即对最终合并后的结果来排序
- 在子句中,order by配合limit使用才有意义,否则会被语法分析器优化分析时去掉,即排序不生效
left join/right join/inner join
- 左右连接可以相互转化
- 可以把右连接转换为左连接来使用(并推荐使用左连接代替右连接,兼容性好一些)
- 可以来自于多张表
- A站在B的左边<=====>B站在A的右边,即:A left join B<=====>B right join A
- 内连接:查询左右表都有的数据,即:不要左右中NULL的那一部分
- 内连接是左右连接的交集
- 外连接:目前mysql不支持外连接
- 外连接是左右连接的并集
列
- 增加列:
- alter table 表名 add 列声明
- 增加的列默认是在表的最后一列
- 可以用after来声明新增的列在那一列后面:
alter table 表名 add 列声明 after 列名
- 新增放在最前面:
alter table 表名 add 列声明 first
- 修改列:
alter table 表名 change 被改变的列名 列声明
- 删除列:
alter table 表名 drop 列名
校对集
- 声明校对集:
create table() charset utf8 collate utf8_general_ci
导出
- 导出库中的某些表
mysqldump -u 用户名 -p密码 库名 表1 表2 表3 > 地址/备份文件名称(导出的是建表语句及insert语句)
- 导出库中的所有表
mysqldump -u 用户名 -p密码 库名 >地址/备份文件名称
- 以库为单位导出
mysqldump -u 用户名 -p密码 -B 库1 库2 库3 >地址/备份文件名称
- 导出所有库
mysqldump -u 用户名 -p密码 -A >地址/备份文件名称
恢复
- 登录到mysql命令行
- 对于库级的备份:
mysql> source 备份文件地址
- 对于表级的备份:
mysql> use 库名``````
mysql> source 备份文件地址- 不登录到mysql命令行
- 对于库级的备份:
mysql -u用户名 -p密码 < 库级备份文件地址
- 对于表级的备份:
mysql -u用户名 -p密码 < 表级备份文件地址
索引与优化
- 好处
- 加快了查询速度(select)
- 坏处
- 降低了增、删、改的速度(update/delete/insert)
- 增大了表的文件大小(索引文件甚至可能比数据文件还大)
- 索引的使用原则
- 不过度索引
- 索引条件列(where后面最频繁的条件比较适宜索引)
- 索引散列值,过于集中的值不要索引(例如,给性别“男”、“女”加索引,意义不大)
- 索引的分类
- 普通索引:index 仅仅是加快查询速度
- 唯一索引:unique index 行上的值不能重复
- 主键索引:primary key 不能重复
- 主键必唯一,但是唯一索引不一定是主键
- 一张表上只能有一个主键,但是可以用一个或多个唯一索引- 全文索引:fulltext index
- 查看索引
- 查看一张表上所有索引:
show index from 表名
- 建立索引
- alter table 表名
add index/unique/fulltext [索引名] (列名)
alter table 表名 add primary key (列名)
- 删除索引
- 删除非主键索引:
alter table 表名 drop index 索引名
- 删除主键:
alter table 表名 drop primary key