文章目录

  • MySQL高级
    • 外键(foreign key)
    • 嵌套查询(子查询)
    • 多表查询
    • 连接查询
    • 数据导入
    • 数据导出
    • 表的复制
    • 锁(自动加锁和释放锁)
  • MySQL高级-重点掌握
    • 外键
    • 嵌套查询(子查询)
    • 多表查询
    • 连接查询
    • 数据导入
    • 索引
  • 面试题

MySQL高级

外键(foreign key)

  • 定义

    让当前表字段的值在另一个表的范围内选择(foreign key 功能 : 建立表与表之间的某种约束的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强)

  • 语法

    foreign key(参考字段名)
    references 主表(被参考字段名)
    on delete 级联动作
    on update 级联动作
    
  • 使用规则

1、主表、从表字段数据类型要一致
2、主表被参考字段 :KEY的一种,一般为主键

  • 示例

表1、缴费信息表(财务)

id   姓名     班级     缴费金额
1   唐伯虎   AID19     300
2   点秋香   AID19     300
3   祝枝山   AID19     300

表2、学生信息表(班主任) – 做外键关联

stu_id   姓名   缴费金额1     唐伯虎    3002     点秋香    300
  • 删除外键
 alter table 表名 drop foreign key 外键名;​外键名 :show create table 表名;
  • 创建外键
 eg1(cascade):create table slave(stu_id int,name varchar(20),money decimal(6,2),foreign key(stu_id) references master(id) on delete cascade on update cascade)charset=utf8;
eg2(restrict):create table slave_2(stu_id int,name varchar(20),money decimal(6,2),foreign key(stu_id) references master(id) on delete restrict on update restrict)charset=utf8;
eg3(set null):create table slave_2(stu_id int,name varchar(20),money decimal(6,2),foreign key(stu_id) references master(id) on delete set null on update set null)charset=utf8;
  • 级联动作
cascade
​数据级联删除、更新(参考字段)
restrict(默认)
​从表有相关联记录,不允许主表操作
set null
​主表删除、更新,从表相关联记录字段值为NULL
  • 已有表添加外键
alter table 表名 add foreign key(外键参考字段) references 主表(被参考字段) on delete 级联动作 on update 级联动作

嵌套查询(子查询)

定义

把内层的查询结果作为外层的查询条件

语法格式

select ... from 表名 where 条件(select ....);

示例

1、把攻击值小于平均攻击值的英雄名字和攻击值显示出来select name,attack from sanguo where attack<(select avg(attack) from sanguo)
2、找出每个国家攻击力最高的英雄的名字和攻击值(子查询)select name,attack from sanguo where (country,attack) in (select country ,max(attack) from sanguo group by country);

多表查询

sql脚本资料:join_query.sql

mysql -uroot -p123456
mysql>source /home/tarena/join_query.sql
create database if not exists db1 character set utf8;
use db1;create table if not exists province(
id int primary key auto_increment,
pid int,
pname varchar(15)
)default charset=utf8;insert into province values
(1, 130000, '河北省'),
(2, 140000, '陕西省'),
(3, 150000, '四川省'),
(4, 160000, '广东省'),
(5, 170000, '山东省'),
(6, 180000, '湖北省'),
(7, 190000, '河南省'),
(8, 200000, '海南省'),
(9, 200001, '云南省'),
(10,200002,'山西省');create table if not exists city(
id int primary key auto_increment,
cid int,
cname varchar(15),
cp_id int
)default charset=utf8;insert into city values
(1, 131100, '石家庄市', 130000),
(2, 131101, '沧州市', 130000),
(3, 131102, '廊坊市', 130000),
(4, 131103, '西安市', 140000),
(5, 131104, '成都市', 150000),
(6, 131105, '重庆市', 150000),
(7, 131106, '广州市', 160000),
(8, 131107, '济南市', 170000),
(9, 131108, '武汉市', 180000),
(10,131109, '郑州市', 190000),
(11,131110, '北京市', 320000),
(12,131111, '天津市', 320000),
(13,131112, '上海市', 320000),
(14,131113, '哈尔滨', 320001),
(15,131114, '雄安新区', 320002);create table if not exists county(
id int primary key auto_increment,
coid int,
coname varchar(15),
copid int
)default charset=utf8;insert into county values
(1, 132100, '正定县', 131100),
(2, 132102, '浦东新区', 131112),
(3, 132103, '武昌区', 131108),
(4, 132104, '哈哈', 131115),
(5, 132105, '安新县', 131114),
(6, 132106, '容城县', 131114),
(7, 132107, '雄县', 131114),
(8, 132108, '嘎嘎', 131115);
  • 笛卡尔积(不推荐使用)
select 字段名列表 from 表名列表;
eg:
select tt1.tt1name,tt2.tt2name from tt1,tt2;
  • 多表查询
select 字段名列表 from 表名列表 where 条件;
  • 示例
1、显示省和市的详细信息河北省  石家庄市河北省  廊坊市湖北省  武汉市
select province.pname,city.cname from province,city where province.pid=city.cp_id;
2、显示 省 市 县 详细信息
select province.pname,city.cname,county.coname from province,city,county where province.pid=city.cp_id and city.cid=county.copid;

连接查询

  • 内连接(结果同多表查询,显示匹配到的记录)(相比笛卡尔积优先使用)
select 字段名 from  表1 inner join 表2 on 条件 inner join 表3 on 条件;
eg1 : 显示省市详细信息select province.pname,city.cname from province inner join city on province.pid=city.cp_id;
eg2 : 显示 省 市 县 详细信息select province.pname,city.cname,county.coname from province inner join city on province.pid=city.cp_id inner join county on city.cid=county.copid;
  • 左外连接

以 左表 为主显示查询结果

select 字段名 from 表1 left join 表2 on 条件 left join 表3 on 条件;
eg1 : 显示 省 市 详细信息(要求省全部显示)select province.pname,city.cname from province left join city on province.pid=city.cp_id;
  • 右外连接

用法同左连接,以右表为主显示查询结果

select 字段名 from 表1 right join 表2 on 条件 right join 表3 on 条件;
eg1 : 显示 省 市 详细信息(要求市全部显示)select province.pname,city.cname from province right join city on province.pid=city.cp_id;
  • 连接查询中on和where的区别:
  • 在使用连接查询时,on and和on where条件的区别如下:
    1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回(左边或右边)表中符合条件的记录。
    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left
    join(right join)的含义(必须返回左(右)边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
    3.在使用内连接时,on and 与on where 没有区别,都是对表进行过滤操作
mysql> select province.p_name,city.c_name,county.x_name from province inner join city on province.p_code=city.c_father_code inner join county on city.c_code=county.x_father_code where county.x_name="济源市";;
+-----------+--------------+-----------+
| p_name    | c_name       | x_name    |
+-----------+--------------+-----------+
| 河南省    | 驻马店市     | 河源市    |
+-----------+--------------+-----------+
1 row in set (0.00 sec)mysql> select province.p_name,city.c_name,county.x_name from province inner join city on province.p_code=city.c_father_code inner join county on city.c_code=county.x_father_code and county.x_name="济源市";
+-----------+--------------+-----------+
| p_name    | c_name       | x_name    |
+-----------+--------------+-----------+
| 河南省    | 驻马店市     | 河源市    |
+-----------+--------------+-----------+
1 row in set (0.00 sec)mysql> select province.p_name,city.c_name,county.x_name from province right join city on province.p_code=city.c_father_code right join county on city.c_code=county.x_father_code where province.p_name="河南省";
+-----------+--------------+-----------------+
| p_name    | c_name       | x_name          |
+-----------+--------------+-----------------+
| 河南省    | 郑州市       | 中原区          |
| 河南省    | 郑州市       | 二七区          |
| 河南省    | 郑州市       | 管城回族区      |
| 河南省    | 郑州市       | 金水区          |
| 河南省    | 郑州市       | 上街区          |
| 河南省    | 郑州市       | 惠济区          |
| 河南省    | 郑州市       | 中牟县          |
| 河南省    | 郑州市       | 巩义市          |mysql> select province.p_name,city.c_name,county.x_name from province right join city on province.p_code=city.c_father_code right join county on city.c_code=county.x_father_code and province.p_name="河南省";
| 河南省    | 驻马店市     | 驿城区                                        |
| 河南省    | 驻马店市     | 西平县                                        |
| 河南省    | 驻马店市     | 上蔡县                                        |
| 河南省    | 驻马店市     | 平舆县                                        |
| 河南省    | 驻马店市     | 正阳县                                        |
| 河南省    | 驻马店市     | 确山县                                        |
| 河南省    | 驻马店市     | 泌阳县                                        |
| 河南省    | 驻马店市     | 汝南县                                        |
| 河南省    | 驻马店市     | 遂平县                                        |
| 河南省    | 驻马店市     | 新蔡县                                        |
| 河南省    | 驻马店市     | 济源市                                        |
| NULL      | NULL         | 东城区                                        |
| NULL      | NULL         | 西城区                                        |
| NULL      | NULL         | 朝阳区                                        |
| NULL      | NULL         | 丰台区                                        |
| NULL      | NULL         | 石景山区                                      |
| NULL      | NULL         | 海淀区                                        |
| NULL      | NULL         | 门头沟区                                      |
| NULL      | NULL         | 房山区                                        |
| NULL      | NULL         | 通州区                                        |

数据导入

掌握大体步骤

source 文件名.sql

作用

把文件系统的内容导入到数据库中
语法(方式一)

load data infile “文件名”
into table 表名
fields terminated by “分隔符”
lines terminated by “\n”
示例
scoretable.csv文件导入到数据库db2的表

1、将scoretable.csv放到数据库搜索路径中mysql>show variables like 'secure_file_priv';/var/lib/mysql-files/Linux: sudo cp /home/tarena/scoreTable.csv(空格)/var/lib/mysql-files/
2、在数据库中创建对应的表create table scoretab(rank int,name varchar(20),score float(5,2),phone char(11),class char(7))charset=utf8;
3、执行数据导入语句
load data infile '/var/lib/mysql-files/scoreTable.csv'
into table scoretab
fields terminated by ','
lines terminated by '\n'
4、练习添加id字段,要求主键自增长,显示宽度为3,位数不够用0填充alter table scoretab add id int(3) zerofill primary key auto_increment first;

语法(方式二)

source 文件名.sql

数据导出

作用

将数据库中表的记录保存到系统文件里

语法格式

select … from 表名
into outfile “文件名”
fields terminated by “分隔符”
lines terminated by “分隔符”;

练习

1、把sanguo表中英雄的姓名、攻击值和国家三个字段导出来,放到 sanguo.csv中select name,attack,country from sanguo into outfile "/var/lib/mysql-files/sanguo.csv" fields terminated by "," lines terminated by "\n";
2、将mysql库下的user表中的 user、host两个字段的值导出到 user2.txt,将其存放在数据库目录下

注意

1、导出的内容由SQL查询语句决定
2、执行导出命令时路径必须指定在对应的数据库目录下

表的复制

1、表能根据实际需求复制数据

2、复制表时不会把KEY属性复制过来

语法

create table 表名 select 查询命令;

练习

1、复制sanguo表的全部记录和字段,sanguo2create table sanguo2 select * from country.sanguo
2、复制sanguo表的 id,name,country 三个字段的前3条记录,sanguo4create table sanguo4 select id,name,country from country.sanguo limit 3;

注意

常规分表套路:

用户ID int % 表数量

用户名ASCII%表数量

经典案例:用户表分表

复制表的时候不会把原有表的 KEY 属性复制过来

复制表结构

create table 表名 select 查询命令 where false;

锁(自动加锁和释放锁)

全程重点,理论和锁分类及特点

点赞并发解决方案->(mvcc多版本控制):

目的

解决客户端并发访问的冲突问题

锁类型分类

读锁(共享锁):select 加读锁之后别人不能更改表记录,但可以进行查询
写锁(互斥锁、排他锁):加写锁之后别人不能查、不能改

锁粒度分类

表级锁 :myisam
行级锁 :innodb


MySQL高级-重点掌握

外键

原理

让当前表字段的值在另一张表的范围内去选择

使用规则

1、数据类型要一致
2、主表被参考字段必须为KEY的一种 : PRI

级联动作

1、cascade : 删除 更新同步(被参考字段)
2、restrict(默认) : 不让主表删除 更新
3、set null : 删除 更新,从表该字段值设置为NULL

嵌套查询(子查询)

定义

把内层的查询结果作为外层查询的条件

多表查询

笛卡尔积

多表查询不加where条件,一张表的每条记录分别和另一张表的所有记录分别匹配一遍

连接查询

分类(先执行on条件再连接)

1、内连接(表1 inner join 表2 on 条件)
2、外连接(表1 left|right join 表2 on 条件)1、左连接 :以左表为主显示查询结果2、右连接 :以右表为主显示查询结果

语法

select 表名.字段名 from 表1 inner join 表2 on 条件;

1、目的 :解决客户端并发访问的冲突问题

2、锁分类

1、锁类型 : 读锁 写锁
2、锁粒度 : 行级锁(InnoDB) 表级锁(MyISAM)

数据导入

方式一(使用source命令)

mysql> source /home/tarena/xxx.sql

方式二(使用load命令)

1、将导入文件拷贝到数据库搜索路径中show variables like 'secure%';
2、在数据库中创建对应的表
3、执行数据导入语句

索引

定义

对数据库表中一列或多列的值进行排序的一种结构(BTree)

优点

加快数据的检索速度

缺点

1、占用实际物理存储空间
2、索引需动态维护,消耗资源,降低数据的维护速度

分类及约束

1、普通索引(MUL): 无约束
2、唯一索引(UNI):字段值不允许重复,但可为NULL
3、主键(PRI) :字段值不允许重复,不可为NULL
4、外键         :让当前表字段的值在另一张表的范围内选择

面试题

1、把 /etc/passwd 文件的内容导入到数据库的表中

tarena:x:1000:1000:tarena,,,:/home/tarena:/bin/bash
1.  sudo cp /etc/passwd /var/lib/mysql-files/
2.建表    creat table u_p(username                varchar(20),password char(1),uid int,gid int,comment varchar(50),homedir varchar(50),shell varchar(30))charset=utf8;
3.导入:
load data infile "/var/lib/mysql-file/passwd"
into table u_p
field terminate by ":"
line terminate by "\n";

MySQL高级之外键、表关联、数据导入及导出相关推荐

  1. MySQL主外键表关联表数据的同时删除

    今天遇到这样的问题,用mysql数据库,删除主表的数据时,删除不了报错.原来是主外键的关联关系. 遇到的错误和解决方法如下: 问题解决后,我又从网上找到了一篇讲解非常优秀的博文,转载至此,作者原文地址 ...

  2. mariadb转mysql_MariaDB/MySQL备份和恢复(二):数据导入、导出

    1.导出.导入数据 load data infile和select into outfile语句是配套的.select into outfile语句是将检索出来的数据按格式导出到文件中,数据迁移跨数据 ...

  3. mysql 删除语句多表关联_MySQL多表关联数据同时删除sql语句

    MySQL多表关联数据同时删除sql语句 有需要的朋友可参考. DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 代码如下 1 delete from t1 wher ...

  4. 将Excel表的数据导入mysql

    将Excel表的数据导入mysql 准备工作 在mysql已有表 准备工作 安装Navicat 12 for MySQL工具 工具下载地址:https://www.navicat.com.cn/pro ...

  5. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞

    有客户和我说:他在含主外键的表中实验发现,在主表数据未提交,然后在外键表插入该数据数据时,出现外键表hang住现象.我开始以为是不同的会话,根据oracle数据库的一致性原则,应该新会话在外键表中不能 ...

  6. MySql中把一个表的数据插入到另一个表中的实现代码--转

    MySql中把一个表的数据插入到另一个表中的实现代码 司的一个项目,做报表--要关联的表结构比较多,最后决定把要用的数据集合到一张新表中,需要用到以下的sql语法......分享下: web开发中,我 ...

  7. python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库

    如何用python将excel数据导入到postgresql数据库中 把excel表格另存为csv文件 python将exce文件含有多个sheet同时l导入sqlserver数据库 需要使用xlrd ...

  8. hive:建库建表、表分区、内部表外部表、数据导入导出

    hive建库建表与数据导入 建库 hive中有一个默认的库: 库名: default 库目录:hdfs://hdp20-01:9000/user/hive/warehouse 新建库: create  ...

  9. MySQL删除或清空表内数据的方法

    MySQL删除或清空表内数据的方法 一.使用MySQL清空表数据命令:truncate SQL语法为: truncate table 表名 注意: truncate该命令会直接将数据表内数据清空: t ...

最新文章

  1. 独家 | 数据科学家应该避免的5种统计陷阱(附链接)
  2. matlab 级联cic,Matlab中CIC滤波器的应用
  3. 读写EEPROM遇到的问题:16位地址的内容都是最后写入的数据。
  4. Python 的闭包和装饰器
  5. skyline TerraBuilder 制作MPT方法与技巧(2)(转自)
  6. 处理Img标签中src无效时出现的border
  7. 计算机网络配置调试综合实验,计算机网络设备配置与调试课程标准.doc
  8. 文档浏览网站 Docs4dev,内含Spring、SpringBoot、Spring Data等中英文文档
  9. 包含html语言的超链接标记的网页_什么是网页
  10. 查看html元素绑定的事件与方法 visual Event 插件
  11. python装饰器详解-学习笔记-Python装饰器详解
  12. python是免费的、开源的、跨平台的_推荐:3款开源的Python IDE
  13. 信号与系统与数字信号处理丹梅老师公众号笔记
  14. iphone 3G 刷机到3.12
  15. 不懂什么是锁?看看这篇你就明白了
  16. 百度网盘不限速方法 直接跑满带宽
  17. 他大叫了一声:“筋斗云”。。。
  18. ThinkPad_E570 拆机清灰换硅脂
  19. 汽车电子触摸屏产品EMC设计要领
  20. PASCAL VOC2012 数据集讲解与制作自己的数据集

热门文章

  1. 從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.2 藝術畫 Python 製作生成式藝術略覽
  2. kafka启动异常InconsistentClusterIdException
  3. oracle rac 宕机频繁,Oracle rac宕机分析故障处理
  4. 【渝粤题库】陕西师范大学164107 电子商务信息安全 作业(高起专)
  5. 深度学习——3D Fully Convolutional Network for Vehicle Detection in Point Cloud模型实现
  6. 127.0.0.1:3000端口已被占用
  7. antd vue 树更新数据后不展开_Vue 性能优化 - 去除 VNode
  8. 电化学传感器电路设计
  9. 浙大计算机能保研到交大多吗6,保研之路:她来自双非高校,却同时保研到交大、浙大,有啥经验?...
  10. 持续集成Jenkins+Gitlab实现持续集成