MySQL数据库-表操作-SQL语句(二)
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语句(二)的更多相关文章
- MySQL数据库-表操作-SQL语句(一)
1. 数据库操作与存储引擎 1.1 数据库和数据库对象 数据库对象:存储,管理和使用数据的不同结构形式,如:表.视图.存储过程.函数.触发器.事件等. 数据库:存储数据库对象的容器. 数据库分两种 ...
- Database学习 - mysql 数据库 表操作
mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...
- MySQL数据库基本操作以及SQL语句
连接mysql的语法 mysql -u用户名 -p密码 [-h主机名] [-P端口号] 在一个mysql服务器中, 可以有多个mysql数据库(本质是一个文件夹) 在一个mysql数据库中, 可以有多 ...
- mysql数据库之基础SQL语句/语法
SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!简要介绍基础语句: 1.说明:创建数据库 Create DATABAS ...
- MySQl数据库必会sql语句加强版
这篇承接上一篇<mysql必会sql语句>:http://blog.csdn.net/qq_32059827/article/details/51763950 这一篇属于加强版,问题和sq ...
- MySQL数据库——表操作
I.表操作 一.创建表 基本语法如下: create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8: ...
- 转mysql 多表 update sql语句总结
mysql 多表 update 有几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductP ...
- mysql 多表 update sql语句总结
mysql 多表 update 有几种不同的写法. 假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductP ...
- 创建数据库表的SQL语句
创建表.视图.索引的sql语句如下: CREAT TABLE (列名,数据类型,约束) create view(创建视图) create index (创建索引) 1.primary key(主键) ...
随机推荐
- Python爬虫进阶 | 多线程
一.简介 为了提高爬虫程序效率,由于python解释器GIL,导致同一进程中即使有多个线程,实际上也只会有一个线程在运行,但通过request.get发送请求获取响应时有阻塞,所以采用了多线程依然可以 ...
- rac集群状态脚本执行awk拼接有问题
再shell中拿出来拼接没问题,在脚本中运行就有问题,
- 洛谷 P1629 邮递员送信 题解
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- A. Vova and Train ( Codeforces Round #515 (Div. 3) )
题意:一条 L 长的路,一列车长在这条路的 l 到 r 之间,只有在 v 倍数时有灯,但是在 l 到 r 之间的灯是看不见的,问最大看见的灯的个数? 题解:L / v 表示总共的灯的个数, r / v ...
- RESTFull开发风格
- 【2019.12.04】SDN上机第6次作业
实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...
- 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践
一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...
- 关于证书如何完成身份验证(SSL证书)
一.写在前面 SSL和IPsec是现在VPN技术中最为常见的,在云计算的应用环境中,SSL更受企业青睐,至于原因的话简单的说就是SSL更为简洁,不需要像IPsec那样需要额外安装客户端,这会带来软件维 ...
- IDEA中执行maven命令:mvn clean 时报错
问题描述: 完成项目中的功能后,想要git一下,就用maven命令先清除一下编译文件,紧接着系统报错 Error executing Maven. 2 problems were encountere ...
- 剑指offer:整数中1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...