学习MySQL之多表操作(三)

##多表查询

##使用数据库 mytest
USE mytest;

##删除,并重新创建表 t_dept
DROP TABLE t_dept;
CREATE TABLE t_dept (
   deptno INT(11) NOT NULL,
   dname VARCHAR(20) NOT NULL,
   loc VARCHAR(40),
   UNIQUE INDEX uk_deptno(deptno)
)
##创建测试表 t_a
CREATE TABLE t_A (
  aId INT (11) AUTO_INCREMENT,    ##主键,自增
  aName VARCHAR (20) NOT NULL,
  loc VARCHAR (40),
  cId INT(11),
  PRIMARY KEY pk_aId (aId)
) ;
##创建测试表 t_b
CREATE TABLE t_B (
  bId INT (11) AUTO_INCREMENT,    ##主键,自增
  bStand VARCHAR (40) NOT NULL,
  aId INT (11) NOT NULL,
  PRIMARY KEY pk_bId (bId),
  UNIQUE INDEX uk_aId (aId)    ##唯一索引
) ;
##创建测试表 t_c
CREATE TABLE t_c (
  cId INT (11) AUTO_INCREMENT,    ##主键,自增
  cvalue VARCHAR (20) NOT NULL,
  PRIMARY KEY pk_cId (cId)
);
##创建测试表 t_d
CREATE TABLE t_d(
    xname VARCHAR(11),
    xsex VARCHAR(11)
);
##创建测试表 t_e
CREATE TABLE t_e(
    xname VARCHAR(11),
    xsex VARCHAR(11)
);

##删除唯一索引
ALTER TABLE t_b
    DROP KEY uk_aId;

##插入测试数据
INSERT INTO t_dept(deptno,dname,loc)
VALUES
   (10,‘生产‘,‘生产部‘),
   (20,‘业务‘,‘业务部‘),
   (30,‘品质‘,‘品质部‘),
   (40,‘人事‘,‘人事部‘),
   (50,‘工程‘,‘工程部‘);

INSERT INTO t_a (aName, loc,cId)
VALUES
  (‘Jay‘, ‘Jay Chou‘,1),
  (‘Join‘, ‘Join Chang‘,3),
  (‘Hebe‘, ‘Hebe Young‘,2),
  (‘Jack‘, ‘Jack Son‘,2),
  (‘Smile‘, ‘Smile Kiss‘,1) ;

INSERT INTO t_b (bStand, aId)
VALUES
  (‘Jay-Jay Chou‘, 1),
  (‘Hebe-Hebe Young‘, 3),
  (‘Jack-Jack Son‘, 4),
  (‘Smile-Smile Kiss‘, 5) ;

INSERT INTO t_c (cvalue)
VALUES (‘鸡‘),(‘牛‘),(‘马‘);

INSERT INTO t_d (xname,xsex)
VALUES (‘章子怡‘,‘女‘),(‘张筱雨‘,‘女‘),(‘张雨涵‘,‘男‘),(‘张予曦‘,‘女‘),(‘张曦予‘,‘女‘);

INSERT INTO t_e (xname,xsex)
VALUES (‘张曦予‘,‘女‘),(‘汪峰‘,‘男‘),(‘张馨予‘,‘女‘);

-- -----------      内联、外联不推荐使用,根据笛卡尔积,执行效率低于子查询       ----------- --
##内联 □■□
##INNER JOIN …… ON。显示主副表数据交集
SELECT  a.aid,a.aName,a.loc,b.bStand,c.cvalue
  FROM  t_a AS a
  INNER JOIN t_b AS b
    ON a.aId = b.aId
   INNER JOIN t_c AS c
    ON a.cId=c.cId;

##外联 ■■□ OR □■■
##外联显示的数据以主表为准,不管副表是否有对应数据都会显示,副表无数据的,显示null。■■□
##内联,副表无对应数据,则不会显示出。简而言之,显示数据为主副表的 交集。□■□

##左联:以本表为主表,左联表为副表。■■□
SELECT a.aid,a.aName,a.loc,b.bStand
    FROM t_a AS a
    LEFT JOIN t_b AS b
    ON a.aid=b.aid;

##右联:以本表为副表,右联表为主表。□■■
SELECT a.aid,a.aName,a.loc,b.bStand
    FROM t_a AS a
    RIGHT JOIN t_b AS b
    ON a.aid=b.aid;

##合并查询:
SELECT * FROM t_d UNION SELECT * FROM t_e;    ## UNION,去掉两表的重复数据。        ■■■
SELECT * FROM t_d UNION ALL SELECT * FROM t_e;    ## UNION ALL, 未去掉两表的重复数据。    ■■■■

-- -----------      子查询  推荐使用,根据笛卡尔积,执行效率高      ----------- --

SELECT COUNT(*) FROM t_a AS a,t_b AS b;    ##笛卡尔积

SELECT * FROM t_a
 WHERE cId=(SELECT cId FROM t_a WHERE aName = ‘Jay‘);    ##结果集可以是多行

SELECT * FROM t_a
 WHERE (aId,loc) = ( SELECT aId,loc FROM t_a WHERE cId=3);    ##结果集只能是单行

SELECT * FROM t_employee
 WHERE deptno IN ( SELECT deptno FROM t_dept);

SELECT * FROM t_employee
 WHERE deptno NOT IN ( SELECT deptno FROM t_dept);

 ##使用ANY。在使用上,用 <= 和 >= 更有意义 ■■□
 ## <ANY (<=ANY) ,结果集是比最小值(包含)大的结果。
 ## >ANY (>=ANY) ,结果集是比最大值(包含)小的结果。
 ## =ANY,与使用 IN 一样。
SELECT sal FROM t_employee
  WHERE job=‘SALESMAN‘;

SELECT * FROM t_employee
  WHERE sal>=ANY(SELECT sal FROM t_employee WHERE job=‘SALESMAN‘);

 ##使用ALL。在使用上,用 < 和 > 更有意义 ■□□
 ## <ALL (<=ALL) ,结果集是比最大值(包含)更大的结果。
 ## >ALL (>=ALL) ,结果集是比最小值(包含)更小的结果。
 ## =ANY,与使用 IN 一样。
SELECT sal FROM t_employee
  WHERE job=‘SALESMAN‘;

SELECT * FROM t_employee
  WHERE sal>ALL(SELECT sal FROM t_employee WHERE job=‘SALESMAN‘);

##使用 EXISTS 与IN 的使用效果类似,以下两条SQL语句执行结果一致。
SELECT *
    FROM t_dept AS d
    WHERE EXISTS( SELECT * FROM t_employee WHERE deptno=d.deptno);

SELECT * FROM t_dept AS d
    WHERE deptno  IN( SELECT deptno FROM t_employee);

--                 综合测试                --
##计算笛卡尔积
SELECT COUNT(empno) FROM t_employee;
SELECT COUNT(deptno) FROM t_dept;

##使用内联,无字段为NULL,但效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number, AVG(e.sal) AS average
 FROM  t_dept AS d  INNER JOIN t_employee AS e
    ON d.deptno = e.deptno
    GROUP BY d.deptno;

##使用左联,有字段为NULL,且效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number,AVG(e.sal) AS average
FROM t_dept AS d LEFT JOIN t_employee AS e
ON d.deptno=e.deptno
GROUP BY d.deptno;

##使用右联,虽无字段为NULL,但无法保证其他情况没NULL,且效率低(笛卡尔积为 9X5=45)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) AS number,AVG(e.sal) AS average
FROM t_employee AS e LEFT JOIN t_dept AS d
ON d.deptno=e.deptno
GROUP BY d.deptno;

##使用子查询。最好为每个表派生别名,并指出每个字段是哪张表的。(防止字段之间重名)
##效率高,笛卡尔积为(4+9=13)
SELECT d.deptno,d.dname,d.loc,e.number,e.average
 FROM t_dept AS d,
    (SELECT deptno, COUNT(empno) AS number,AVG(sal) AS average
    FROM t_employee GROUP BY deptno) AS e
    WHERE d.deptno=e.deptno;
    

所有代码,均为自学时用到的测试与注释,知识细节或知识点不会面面俱到,亦不会有任何讲解,只做为自己学习复习用。

时间: 2024-10-11 18:01:33

学习MySQL之多表操作(三)的相关文章

MYSQL数据库学习----MYSQL数据库、表操作和引擎区别

MYSQL数据库的操作 一:查看MYSQL中所有的数据库 SHOW DATABASES; 二:创建数据库 CRETAE DATABASE 数据库名称; 三:删除数据库 DROP DATABASE 数据库名称; 四:查看数据库支持的存储引擎 SHOW ENGINES; 四:连接MYSQL数据库 USE 数据库名称; MYSQL数据库中表的操作 一:查看数据库中的所有表格 SHOW TABLES: 二:查看表格的结构 DESC 表名称;(基本结构): 或 SHOW CREATE TABLE 表名称;

学习MySQL之单表操作(二)

##单表操作 ##创建表 CREATE TABLE t_employee( empno INT(11), ename VARCHAR(20), job VARCHAR(40), MGR INT(11), Hiredate DATE DEFAULT '0000-00-00', sal DOUBLE(10,2), comm DOUBLE(10,2), deptno INT(11), UNIQUE INDEX uk_empno(empno) ##使用唯一索引 ); ##增 INSERT INTO t_

mysql数据库学习(二)--表操作

一.表操作 以下内容都是自己学习的时候看过的一些知识,作为笔记记录一下吧,大部分都是所看文章的内容. 1.创建表 前面的基础篇笔记是相当于搭建了一个方便管理的文件夹树根,下面要学习的是一些关于表的知识,相当于树上的叶子吧! create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8: 下面这两个变量是: ENGINE :存储引擎 charset:字符集 是否可空,null表示空,非字符串 not

Django学习手册 - ORM 数据表操作

queryset 数据类型介绍 QuerySet与惰性机制 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行. QuerySet特点: <1>  可迭代的 <2>  可切片 <3>  惰性计算和缓存机制 例: info=models.table_name.objects.all()[0:5] #切片 info= models.table

Mysql之库表操作(胖胖老师)

SQL概念:结构化查询语言(SQL = Structured Query Language),也是一种编程语言(数据库查询和程序设计语言),可以用于数据的存取及查询,更新,管理关系型数据库系统ps: 不同数据库系统之间的SQL不能完全相互通用; 分类针对操作的对象不同,可以分成不同语言1: 数据操作(数据管理)语言  DML(Data Management Language)    1): 查询数据           DQL    2): 增, 删, 改           DML2: 数据定

Mysql 删除数据表的三种方式详解

用法:1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到弱如下排列: 1.  drop table tb; drop 是直接将表格删除,无法找回.例如删除 user 表: drop table user; 2.  truncate (table) tb; truncate 是删除表中所有数据,但不能与where一起使用: TRUNCATE TABLE us

mysql中的表操作

------------恢复内容开始------------ 创建数据库 create database 数据库名 切换数据库 use 数据库名 建表: create table 表名 ( 字段名1,类型,约束 字段名2,类型,约束 ... ) 约束: 1.主键约束 1)直接在建表时字段类型后加 primary key 2)在表最后加 constraint 约束名 primary key(字段名) 3)表外修改 alter table 表名 add constraint 约束名 primary

Oracle 表操作(三)

增删改查  交并补  内连接  外连接 创建表: create table table_name( num int IDENTIFIED(1,1) not null,  --identified自增量 name VARCHAR2(20) not null,       --not null不为空 age VARCHAR2(20), sex VARCHAR2(2) ) 新增列: alter table table_name add col_name data_type 删除列: alter  ta

MySQL 7.多表操作

创建下表,并储存21条信息 1 CREATE TABLE tdb_goods( 2 goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 3 goods_name VARCHAR(150) NOT NULL,#产品名称 4 goods_cate VARCHAR(40) NOT NULL, #产品类别 5 brands_name VARCHAR(40) NOT NULL,#产品品牌 6 goods_price DECIMAL UNSIGNED