1. MySQL多表查询

1.1 外键约束

为了消除多张表查询出现的笛卡尔积的现象,MySQL在建表并进行多表之间的关键查询可以使用外键关联查询。

外键:从表1(sub)的某列引用(ref)另外一个表2(main)的某列的值,把表1的这列叫做表2这列的外键。

1.2 外键的设置使用

比如上述最简单的员工(employee)和部门表(department),设置外键dept_id与id相关联。

步骤如下:

①在多方表中设置fk外键,使用外键dept_id关联一方表中的主键id,并选择好参考表;

②修改选项设置中的存储引擎为InnoDB,支持设置外键操作;

注意:在MySQL中,InnoDB支持事务和外键.MyISAM 不支持事务和外键。

上述操作也可以使用SQL语句方式修改存储引擎为InnDB:

ALTER TABLE 表名 ENGINE='InnoDB';

如在命令行界面输入如下语句:

同样使用SQL语句创建外键关联:

ALTER TABLE employee ADD CONSTRAINT employee_fk(外键名) FOREIGN KEY (dept_id) REFERENCES  dept(dept_id);

1.3 连接查询分类

连接查询总的分类可以用一张图来简单描述,主要分为外连接查询(左外连接、右外连接、全连接)、内连接查询(内连接、自连接)。

1.4 内连接查询

内连接两张表的情况如下图,连接查询得到的是两张表的交集部分。

SQL语句写法上可分为显式和隐式写法:

隐式内连接写法:

select <selectList>
From table1,table2 where table1.列 = table2.列;

显式内连接写法(推荐写法):

select <selectList>
From table1 [inner] join table2 on table1.列 = table2.列;

查询实例:

说明:本例以下所有查询以product、product_category、product_stock三张表为例;

①需求:查询所有商品的名称和分类名称:

隐式写法:

SELECT p.product_name, pc.category_name

FROM product p, product_category pc

WHERE p.category_id = pc.id;

显式写法:

SELECT p.product_name, pc.category_name

FROM product p INNER JOIN product_category pc

ON p.category_id = pc.id;

SELECT p.product_name, pc.category_name

FROM product p JOIN product_category pc

ON p.category_id = pc.id;

②需求: 查询货品id,货品名称,货品所属分类名称;

隐式写法:

SELECT *

FROM product p, product_category pc

WHERE p.category_id = pc.id AND

p.sale_price > 200 AND pc.category_name = '无线鼠标';

显式写法:

SELECT *

FROM product p

JOIN product_category pc ON p.category_id = pc.id

AND p.sale_price > 200 AND pc.category_name = '无线鼠标';

1.5 外连接查询

外连接查询分为左外连接查询和右外连接查询。

左外连接:查询出JOIN左边表的全部数据与右表满足ON条件的部分,JOIN右边表不匹配的数据使用NULL来填充数据行。

右外连接:查询出JOIN右边表的全部数据与左表满足ON条件的部分,JOIN左边表不匹配的数据使用NULL来填充数据行。

语法格式:

select <selectList>

from table1 left/right [outer] join table2

on table1.列 = table2.列;

查询实例:

查询每种商品名称,分类的名称和包含的具体商品总数(storeNum)

SELECT p.product_name, pc.category_name, IFNULL(ps.store_num,0)

FROM product p

LEFT JOIN product_category pc

ON p.category_id = pc.id

LEFT JOIN product_stock ps

ON p.id = ps.product_id;

注:IFNULL(expr1,expr2)的使用是如果当前expr1为NULL,则显示expr2的值。

1.6 自连接查询

在特定的查询场景下(商品分类、地区、权限),需要设计将表中的数据进行分类或二级关联时,可能会用到自连接查询的表设计方法。

自连接方式:

查询实例:

查询每个商品分类的名称和父分类名称

#隐式写法

SELECT pare.category_name, sub.category_name FROM

product_category sub, product_category pare

WHERE sub.id = pare.parent_id;
# 显示写法

SELECT pare.category_name, sub.category_name FROM

product_category sub JOIN product_category pare

ON sub.id = pare.parent_id;

查询结果:

1.7 子查询

子查询(嵌套查询):一个查询语句嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件。(相当于查询出来一个结果,然后把结果当着一张表在进行查询)

一般的,嵌套在WHERE或者FROM字句中。

子查询(嵌套查询)一般分为单行单列子查询和单行多列子查询。

查询实例:

① 单行单列子查询

# 单行单列子查询

# 查询零售价比罗技MX1100更高的所有商品信息

SELECT * FROM product WHERE

sale_price > ( SELECT sale_price FROM product WHERE product_name = '罗技MX1100' );

查询结果:

②单行多列子查询

# 查询分类编号和折扣与罗技M100相同的所有商品信息

SELECT * FROM product WHERE (category_id, cutoff) IN (SELECT category_id, cutoff FROM product WHERE product_name = '罗技MX1100');

SELECT * FROM product WHERE (category_id, cutoff) = (SELECT category_id, cutoff FROM product WHERE product_name = '罗技MX1100');

查询结果:

2.MySQL数据操作DML语句

2.1 插入语句(insert)

插入语句:一次只插入一行。

语法:

insert into table_name (column1,column2,column3...) values (value1, value2, value3…);

插入多行数据记录。

语法:

insert into table_name (column1,column2,column3...) values

(value1, value2, value3…), (value4, value5, value6…), (value7, value8, value9…);

实例:

# 插入一行

INSERT INTO mytable(id, name, age, sex) VALUES (1, '琳', 21, 0);

INSERT INTO mytable(sex, age, name, id) VALUES (1, 18, '小白', 2); #顺序可以打乱,只要插入的键值一一对应即可

# 插入多行-- MySQL特有
INSERT INTO mytable(id, name, age, sex)
VALUES (3, 'test01', 26, 0), (4, 'test02', 27, 1), (5, 'test03', 28, 1);

2.2 修改语句(update)

修改语法:

update table_name set column1 = value1, column2 = value2, column3 = value3…

[where condition];

注意:如果省略了where语句,则是修改全表的数据。

修改实例:

# 修改数据
# 将零售价大于300的货品零售价上调0.2倍
UPDATE product SET sale_price = sale_price * 1.2 WHERE sale_price > 300; # 将零售价大于300的有线鼠标的货品零售价上调0.1倍
UPDATE product p JOIN product_category pc ON p.category_id = pc.id
SET sale_price = sale_price * 1.1 WHERE sale_price > 300 AND pc.category_name = '有线鼠标';

2.3 删除语句(delete)

语法:

delete from table_name [where condition];

注:如果省略了where,则会全表数据都进行删除。

实例:

# 删除一条

DELETE FROM mytable WHERE id = 4;

# 删除多条

DELETE FROM mytable WHERE id >=3;

3. MySQL数据备份

MySQL数据备份有两种方式:通过Navicat工具的SQL导入/导出和使用命令行的方式导入/导出。这里主要说明使用命令行的方式。

语法:

导出:mysqldump -u账户 -p密码 数据库名称>脚本文件存储地

MySql自身的数据库维护

通过cmd命令进入dos窗口:

mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql

导入:mysql -u账户 -p密码 数据库名称< 脚本文件存储地址

mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql

MySQL数据库-表操作-SQL语句(二)的更多相关文章

  1. MySQL数据库-表操作-SQL语句(一)

    1. 数据库操作与存储引擎 1.1   数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...

  2. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

  3. MySQL数据库基本操作以及SQL语句

    连接mysql的语法 mysql -u用户名 -p密码 [-h主机名] [-P端口号] 在一个mysql服务器中, 可以有多个mysql数据库(本质是一个文件夹) 在一个mysql数据库中, 可以有多 ...

  4. mysql数据库之基础SQL语句/语法

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库  Create DATABAS ...

  5. MySQl数据库必会sql语句加强版

    这篇承接上一篇<mysql必会sql语句>:http://blog.csdn.net/qq_32059827/article/details/51763950 这一篇属于加强版,问题和sq ...

  6. MySQL数据库——表操作

    I.表操作 一.创建表 基本语法如下: create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8: ...

  7. 转mysql 多表 update sql语句总结

    mysql 多表 update 有几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductP ...

  8. mysql 多表 update sql语句总结

    mysql 多表 update 有几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductP ...

  9. 创建数据库表的SQL语句

    创建表.视图.索引的sql语句如下: CREAT TABLE (列名,数据类型,约束) create view(创建视图) create index (创建索引) 1.primary key(主键) ...

随机推荐

  1. 移动端点击事件兼容问题,在pc端可以点,在手机上不可以点

    ms-click="showCodeExplain()" onClick="javascript:;" 在点击事件后面加上onClick="javas ...

  2. 基于Spring Boot+Cloud构建微云架构

    前言 首先,最想说的是,当你要学习一套最新的技术时,官网的英文文档是学习的最佳渠道.因为网上流传的多数资料是官网翻译而来,很多描述的重点也都偏向于作者自身碰到的问题,这样就很容易让你理解和操作出现偏差 ...

  3. 刷题记录:[CISCN 2019 初赛]Love Math

    目录 刷题记录:[CISCN 2019 初赛]Love Math 思路一 思路二 总结 刷题记录:[CISCN 2019 初赛]Love Math 题目复现链接:https://buuoj.cn/ch ...

  4. 并发下sftp连接报错——com.jcraft.jsch.JSchException: connection is closed by foreign host

    当对单接口极限测试时,随着并发量上升,接口稳定性出现不稳定的情况,排查后台日志,发现报错在该接口调用sftp上传时出现问题(确切的是在初始化连接时失败) 原因:系统SSH终端连接数配置过小,查看虚拟机 ...

  5. nodeJs实现文件上传,下载,删除

    转:https://blog.csdn.net/qq_36228442/article/details/81709272 一.简介 本文介绍了nodeJs+express框架下,用multer中间件实 ...

  6. ElementUi tree 指定节点是否显示复选框

    场景:树的内容是省份下面的城市有酒店 需求:只能多选酒店(为了删除它们),至于为啥不能选省份或者城市更加灵活的去删除相应酒店,这你得去问后台0.0,他只弄了根据酒店id去删除.嗯,连创建酒店的时候级联 ...

  7. Laravel 入门常见问题汇总

    一.安装完成后想打开 Laravel 内置的登录页面,报错 解决方法: Laravel 利用 PHP5.4 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...

  8. 深度强化学习 之 运行环境 mujoco 报错 ERROR: GLEW initalization error: Missing GL version

    使用  mujoco环境  运行代码,报错 ERROR: GLEW initalization error: Missing GL version 一直无法解决,发现网址: https://blog. ...

  9. svg的viewport和viewbox

    svg中视区重要的概念 1. viewport  视口,相当于显示器屏幕 2. viewbox   视区,相当于在屏幕上截取一小块,放大到整个屏幕,就是特写的效果 3. preserveAspectR ...

  10. 通过ssh登录到手机 Termux

    安装Termux Termux官网:https://termux.com/ 安装openssh 安装好Termux后,点击图标进入,依次输入以下命令. 申请读写权限 termux-setup-stor ...