MySQL常用操作--多表联查

  连接是把不同的表的记录连接到一起的最普遍的方法, 一种错误的观念认为由于MySQL的简单性和源代码的开放性使得他不擅长连接. 其实MySQL从一开始就很好的支持连接(SQL92标准), 这种连接语句可以以多种方法来组合表记录.

1. 内连接查询: 

  最普遍的连接类型, 而且是最均匀的(要求他们构成连接的每一部分的每个表的匹配, 不匹配的行将被排除), 内连接最普遍的例子是相等连接, 也就是连接后的表中的某个字段与每个表中的都相同, 这种情况下, 最后的结果集只包含参加连接的表中与指定字段相符的行.

mysql> SELECT * FROM goods;
+----+-------------+---------+--------+---------+
| id | productName | price   | cateId | adminId |
+----+-------------+---------+--------+---------+
|  1 | iphone9     | 9888.00 |      3 |       1 |
|  2 | adidas      |  388.00 |      2 |       2 |
|  3 | nike        |  888.00 |      2 |       2 |
|  4 | 奶瓶        |  288.00 |      1 |       1 |
+----+-------------+---------+--------+---------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM goods_sep;
+----+----------+------------------------+
| id | cateName | cateDesc               |
+----+----------+------------------------+
|  1 | 母婴     | 这是对于商品的详细描述 |
|  2 | 服装     | 这是对于商品的详细描述 |
|  3 | 电子     | 这是对于商品的详细描述 |
+----+----------+------------------------+
3 rows in set (0.00 sec)

mysql> SELECT g.id, g.productName, g.price, gs.cateName
    -> FROM goods AS g
    -> JOIN goods_sep AS gs
    -> ON g.cateId=gs.id;
+----+-------------+---------+----------+
| id | productName | price   | cateName |
+----+-------------+---------+----------+
|  1 | iphone9     | 9888.00 | 电子     |
|  2 | adidas      |  388.00 | 服装     |
|  3 | nike        |  888.00 | 服装     |
|  4 | 奶瓶        |  288.00 | 母婴     |
+----+-------------+---------+----------+
4 rows in set (0.00 sec)

内连接的形式

  查询两个表中符合连接条件的记录:
    SELECT 字段名称,... FROM tbl_name1
    INNER JOIN tbl_name2
    ON 连接条件;

--外左连接:

mysql> SELECT g.id, g.productName, g.price, gs.cateName
    -> FROM goods AS g
    -> LEFT JOIN goods_sep AS gs
    -> ON  gs.id=g.cateId;
+----+-------------+---------+----------+
| id | productName | price   | cateName |
+----+-------------+---------+----------+
|  1 | iphone9     | 9888.00 | 电子     |
|  2 | adidas      |  388.00 | 服装     |
|  3 | nike        |  888.00 | 服装     |
|  4 | 奶瓶        |  288.00 | 母婴     |
+----+-------------+---------+----------+
4 rows in set (0.00 sec)

mysql> UPDATE goods SET productName=‘iphone10‘;
ERROR 1062 (23000): Duplicate entry ‘iphone10‘ for key ‘productName‘
mysql> INSERT INTO goods(productName) VALUES(‘xiaomi‘);
Query OK, 1 row affected, 2 warnings (0.01 sec)

mysql> SELECT * FROM goods;
+----+-------------+---------+--------+---------+
| id | productName | price   | cateId | adminId |
+----+-------------+---------+--------+---------+
|  1 | iphone9     | 9888.00 |      3 |       1 |
|  2 | adidas      |  388.00 |      2 |       2 |
|  3 | nike        |  888.00 |      2 |       2 |
|  4 | 奶瓶        |  288.00 |      1 |       1 |
|  5 | xiaomi      |  100.00 |      0 |       0 |
+----+-------------+---------+--------+---------+
5 rows in set (0.00 sec)

mysql> SELECT g.id, g.productName, g.price, gs.cateName
    -> FROM goods AS g
    -> LEFT JOIN goods_sep AS gs
    -> ON gs.id=g.cateId;
+----+-------------+---------+----------+
| id | productName | price   | cateName |
+----+-------------+---------+----------+
|  1 | iphone9     | 9888.00 | 电子     |
|  2 | adidas      |  388.00 | 服装     |
|  3 | nike        |  888.00 | 服装     |
|  4 | 奶瓶        |  288.00 | 母婴     |
|  5 | xiaomi      |  100.00 | NULL     |
+----+-------------+---------+----------+
5 rows in set (0.00 sec)

外连接的形式

  左外连接:
    SELECT 字段名称,... FROM tbl_name1
    LEFT [OUTER] JOIN tbl_name2
    ON 条件;
    先显示左表中的全部记录,再去右表中查询复合条件的记录,不符合的以NULL代替

  右外连接:
    SELECT 字段名称,... FROM tbl_name1
    RIGHT [OUTER] JOIN tbl_name2
    ON 条件;
    先显示右表中的全部记录,再去左表中查询复合条件的记录,不符合的以NULL代替

--右外连接:

mysql> SELECT g.id, g.productName, g.price, gs.cateName
    -> FROM goods AS g
    -> RIGHT JOIN goods_sep AS gs
    -> ON gs.id=g.cateId;
+------+-------------+---------+----------+
| id   | productName | price   | cateName |
+------+-------------+---------+----------+
|    1 | iphone9     | 9888.00 | 电子     |
|    2 | adidas      |  388.00 | 服装     |
|    3 | nike        |  888.00 | 服装     |
|    4 | 奶瓶        |  288.00 | 母婴     |
+------+-------------+---------+----------+
4 rows in set (0.01 sec)

2. 多表联查:

单表:

mysql>
mysql> SELECT * FROM goods;
+----+-------------+---------+--------+---------+
| id | productName | price   | cateId | adminId |
+----+-------------+---------+--------+---------+
|  1 | iphone9     | 9888.00 |      3 |       1 |
|  2 | adidas      |  388.00 |      2 |       2 |
|  3 | nike        |  888.00 |      2 |       2 |
|  4 | 奶瓶        |  288.00 |      1 |       1 |
|  5 | xiaomi      |  100.00 |      0 |       0 |
+----+-------------+---------+--------+---------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM goods_sep;
+----+----------+------------------------+
| id | cateName | cateDesc               |
+----+----------+------------------------+
|  1 | 母婴     | 这是对于商品的详细描述 |
|  2 | 服装     | 这是对于商品的详细描述 |
|  3 | 电子     | 这是对于商品的详细描述 |
+----+----------+------------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM administrate;
ERROR 1146 (42S02): Table ‘test.administrate‘ doesn‘t exist
mysql> SELECT * FROM administrater;
+----+----------+------------+-------+
| id | username | email      | proId |
+----+----------+------------+-------+
|  1 | jack     | [email protected] |     1 |
|  2 | tony     | [email protected] |     2 |
+----+----------+------------+-------+
2 rows in set (0.00 sec)

多表联查:

mysql> SELECT g.id, g.productName, g.price, gs.cateName, a.username, a.email
    -> FROM goods AS g
    -> JOIN administrater AS a
    -> ON g.adminId=a.id
    -> JOIN goods_sep AS gs
    -> ON g.cateId=gs.id;
+----+-------------+---------+----------+----------+------------+
| id | productName | price   | cateName | username | email      |
+----+-------------+---------+----------+----------+------------+
|  1 | iphone9     | 9888.00 | 电子     | jack     | Tencent@qq |
|  4 | 奶瓶        |  288.00 | 母婴     | jack     | Tencent@qq |
|  2 | adidas      |  388.00 | 服装     | tony     | Tencent@qq |
|  3 | nike        |  888.00 | 服装     | tony     | Tencent@qq |
+----+-------------+---------+----------+----------+------------+
4 rows in set (0.01 sec)

3. 外键约束(InnoDB数据库引擎支持)

  外键约束的作用: 保证数据的一致性和完整性.数据的完整性是指数据的正确性和相容性, 是为了防止数据库中存在不符合语义的数据, 即防止数据库中存在不正确的数据, 可以通过CREATE TABLE 或ALTER TABLE 语句来定义. 一旦定义了数据的完整性约束MySQL服务器会随时检测处于更新状态的的数据库内容是否符合相关性的约束, 从而保证数据的一致性与正确性.

   例如: 学生实体和班级实体可以分别用下面的关系表示, 其中主键用下划线标识;

   学生(学生证号, 姓名, 性别, 生日, 班级编号, 备注)

   班级(班级编号, 班级名称, 备注)

这两个关系之间存在着属性的引用, 即: "学生"关系引用了"班级"关系中的主键(班级编号).在这两个实体之间, "班级编号"是"班级"关系中的主键, 也是"学生"关系中外键, 显然, "学生"关系中的"班级编号"的取值必须参照"班级"中的属性和值.

  外键的创建:

  •   建表示创建外键:   

    [CONSTRAINT 外键名称 ] FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
      子表的外键字段和主表的主键字段类型要相似;如果是数值型要求一致,并且无符号也要一致;如果是字符型,要求类型一致,长度可以不同
      如果外键字段没有创建索引,MySQL会自动帮我们添加索引
      子表的外键关联的必须是父表的主键
    外键约束的参照操作:
      CASCADE------从父表删除或更新,子表也跟着删除或者更新,级联的操作
      SET NULL------从父表删除或者更新记录,并设置子表的外键列为NULL。
      NO ACTION | RESTRICT-------拒绝对父表做更新或者删除操作

-- 添加外键

-- 新闻分类表 news_cate
CREATE TABLE news_cate(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
cateName VARCHAR(50) NOT NULL UNIQUE,
cateDesc VARCHAR(100) NOT NULL DEFAULT ‘描述‘
)ENGINE=INNODB CHARSET=UTF8;

-- 新闻表 news
CREATE TABLE news(
id INT UNSIGNED AUTO_INCREMENT KEY,
title VARCHAR(100) NOT NULL UNIQUE,
content VARCHAR(1000) NOT NULL,
cateId TINYINT UNSIGNED NOT NULL,
FOREIGN KEY(cateId) REFERENCES news_cate(id)
)ENGINE=INNODB CHARSET=UTF8;

INSERT news_cate(cateName) VALUES(‘国内新闻‘),
(‘国际新闻‘),
(‘娱乐新闻‘),
(‘体育新闻‘);

INSERT news(title,content,cateId) VALUES(‘a1‘,‘aaaa1‘,1),
(‘a2‘,‘aaaa2‘,1),
(‘a3‘,‘aaaa3‘,4),
(‘a4‘,‘aaaa4‘,2),
(‘a5‘,‘aaaa5‘,3);
mysql> SHOW CREATE TABLE news;
+-------+------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                   |
+-------+------------------------------------------------------------------------------------------+
| news  | CREATE TABLE `news` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` varchar(1000) NOT NULL,
  `cateId` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`),
  KEY `cateId_fk_newsCate` (`cateId`),
  CONSTRAINT `cateId_fk_newsCate` FOREIGN KEY (`cateId`) REFERENCES `news_cate` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE news_cate;
+-----------+--------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                                                                          |
+-----------+--------------------------------------------------------------------------------------+
| news_cate | CREATE TABLE `news_cate` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `cateName` varchar(50) NOT NULL,
  `cateDesc` varchar(100) NOT NULL DEFAULT ‘描述‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `cateName` (`cateName`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
+-----------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 动态添加外键

  动态添加外键:

    ALTER TABLE tbl_name ADD [CONSTRAINT 外键名称] FOREIGN KEY(外键字段) REFERENCES 主表(主键字段);

    动态添加外键之前表中的记录一定合法的记录,没有脏值,否则外键添加不成功
  动态删除外键:

    ALTER TABLE tbl_name
    DROP FOREIGN KEY fk_name;

原文地址:https://www.cnblogs.com/iceliu/p/11610534.html

时间: 2024-10-29 03:41:39

MySQL常用操作--多表联查的相关文章

MySQL常用操作总结

MySQL常用操作 前提条件:已安装MySQL. 学习目标:用一条sql语句写出A和B的剩余数量 AA表 BB表 以上为一道面试题,接下来由这道面试题来回顾一些数据库的基本操作. 登录MySQL sudo mysql -p,回车,然后输入密码即可,按ctrl+c退出登录: 显示数据库 show databases; 创建数据库 create database xxx; 选择数据库 use database xxx; 显示数据库表 show tables; 创建数据库表 create table 

ubuntu命令行操作mysql常用操作

登陆mysql [email protected]:~/ruby/mydiary$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. 查看所有的数据库 mysql> show databases; --注意必须要用;结尾否则不会立即执行代码 +--------------------+ | Database | +--------------------+ | inf

MongoDB与MySQL的操作对比表及区别介绍

MongoDB与MySQL的操作对比表及区别介绍 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Orac

MySql常用操作【基础且详细(●'?'●)】

有那么挺长段时间没有敲代码了,今敲起来竟然有些sql都想不起来了?? 把以前整理sql的内容看了下,再加了点?? 主要参考自 MySql文档:https://dev.mysql.com/doc/refman/8.0/en/tutorial.html 易百教程:https://www.yiibai.com/mysql 一,基本操作 1.连接操作 连接远程数据库: $ mysql -h host -u -user -p (host:主机 user:用户名) 连接本地数据库: $ mysql -u u

mysql 数据操作 多表查询 目录

mysql 数据操作 多表查询 准备 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多表连接查询 外链接之左连接 右连接 mysql 数据操作 多表查询 多表连接查询 全外连接 原文地址:https://www.cnblogs.com/mingerlcm/p/10523097.html

MYSQL常用操作函数的封装

1.mysql常用函数封装文件:mysql.func.php <?php /** * 连接MYSQL函数 * @param string $host * @param string $username * @param string $password * @param string $dbName * @param string $charset * @return resource */ function connect($host,$username,$password,$dbName,$

MYSQL常用操作及python操作MYSQL常用类

Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 show databases 切换数据库 use databas 123123 ###用户授权 创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename user '用户名'@'IP地址'; to '新用户名'

第二篇 Mysql常用操作记录(转载)

我们在创建网站的时候,一般需要用到数据库.考虑到安全性,建议使用非root用户.常用命令如下: 1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,'allen’,password(‘allen’));//刷新系统权限表mysql>flush privileges;这样就创建了一个名为:allen  密码为:a

Mysql常用操作记录

在linux平台中相关的MySql操作 打开Mysql mysql -uroot -p  //-u后边为用户名,-p后边为密码 1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES;2:2.创建一个数据库MYSQLDATAmysql> CREATE DATABASE MYSQLDATA;3:选择你所创建的数据库mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)4:查看现在的数据库中存在