2020-09-08

目录

数据库的常用单词

1.操作数据库   

2.操作数据表

2.1添加数据表

2.2删除数据表

2.3修改数据表

2.4查询数据表

2.4.1条件查询 

2.4.2聚合函数       

聚合函数语法

2.4.3排序查询

排序语法

2.4.4分组查询

2.4.5分页查询

3.约束

3.1主键约束

3.2主键自动增长约束

4.多表查询

4.1笛卡尔积查询

4.2内连接查询

4.3外连接查询

4.4子查询

4.5自关联查询


数据库的常用单词

 

词汇词汇含义 词汇词汇含义
create创建 from从某个表
database数据库 where查询条件
alter修改数据库/表 group by 分组
drop删除数据库/表 having分组之后的条件
desc查看表结构 order by排序
modify修改列类型 limit分页限定
change修改列名和类型 distinct去掉重复的查询
select 查询数据 between and范围查询
insert into插入数据 like模糊查询
count统计多少条数据 show查询数据库/表
avg平均值 sql结构化查询语言
primary key主键约束 foreign key外键约束
auto_increment自增长   
unique唯一约束   


1.操作数据库   

  • 创建数据库db

               create database db;

  • 创建数据库db,判断,不存在则创建

                create database if not exists db;

  • 创建数据库db并指定字符集

                create database db character set gbk;

  • 修改数据库db的字符集

                alter database db character utf8;

  • 删除数据库db(判断是否存在如上创建)

                 drop database db;

  • 使用数据库db

                  use db;    


2.操作数据表

  • 查询数据库中的所有表

             show tables;

  • 查询表结构

             desc db;

  • 查询数据库中的表字符集

              show table status from 数据库名 like '表名';


2.1添加数据表

  • 创建数据表

标准格式:CREATE TABLE 表名(
                       列名1 数据类型1,
                       列名2 数据类型2,
                       ....
                       列名n 数据类型n
                    );

  • 数据类型:

         1. int:整数类型
                   * age int
         2. double:小数类型
                   * score double(5,2)
                   * price double
         3. date:日期,只包含年月日     yyyy-MM-dd
         4. datetime:日期,包含年月日时分秒     yyyy-MM-dd HH:mm:ss
         5. timestamp:时间戳类型    包含年月日时分秒     yyyy-MM-dd HH:mm:ss    
                * 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
         6. varchar:字符串
                    * name varchar(20):姓名最大20个字符
                    * zhangsan 8个字符  张三 2个字符

  • 创建数据表product

CREATE TABLE product(
    id INT,                -- 商品编号
    name VARCHAR(30),    -- 商品名称
    price DOUBLE,        -- 商品价格
    stock INT,            -- 商品库存
    insert_time DATE    -- 插入时间
);

  • 复制表

             CREATE TABLE 表名 LIKE 被复制的表名;
           -- 复制product表到product2表
               CREATE TABLE product2 LIKE product;

  • 给指定列添加数据

               INSERT INTO 表名(列名1,列名2,...) VALUES (值1,值2,...)


                INSERT INTO product (id,name,price) VALUES (2,'电脑',4999);

  • 默认给全部列添加数据

              INSERT INTO 表名 VALUES (值1,值2,值3,...);

              INSERT INTO product VALUES (3,'电视',2999,18,'2099-06-06');

  • 批量添加数据

               INSERT INTO 表名 VALUES (值1,值2,值3,...),(值1,值2,值3,...),(值1,值2,值3,...);

               INSERT INTO product VALUES (4,'冰箱',999,26,'2099-08-08'),(5,'洗衣机',1999,32,'2099-05-10');


2.2删除数据表

  • 删除列

               ALTER TABLE 表名 DROP 列名;

  • 删除数据表

               DROP TABLE 表名;

  • 删除数据表(判断,如果存在则删除)

              DROP TABLE IF EXISTS 表名; 

  • 删除表数据语法   DELETE FROM 表名 [WHERE 条件];

              -- 删除product表中的微波炉信息
              DELETE FROM product WHERE NAME='微波炉';

               -- 删除product表中库存为10的商品信息
              DELETE FROM product WHERE stock=10;


2.3修改数据表

          修改表数据语法       UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,... [where 条件];

           -- 修改手机的价格为3500
           UPDATE product SET price=3500 WHERE name='手机';

          -- 修改电视的价格为1800、库存为36
          UPDATE product SET price=1800,stock=36 WHERE name='电视';

           -- 修改电磁炉的库存为10
           UPDATE product SET stock=10 WHERE id=7;


2.4查询数据表

数据准备:

  • -- 创建db1数据库

                   CREATE DATABASE db1;

  • -- 使用db1数据库

                   USE db1;

  • -- 创建数据表

               CREATE TABLE product(
                          id INT,                -- 商品编号
                          NAME VARCHAR(20),    -- 商品名称
                          price DOUBLE,        -- 商品价格
                          brand VARCHAR(10),    -- 商品品牌
                          stock INT,            -- 商品库存
                          insert_time DATE    -- 添加时间
                );

  • -- 添加数据

                   INSERT INTO product VALUES (1,'华为手机',3999,'华为',23,'2088-03-10'),
                   (2,'小米手机',2999,'小米',30,'2088-05-15'),
                   (3,'苹果手机',5999,'苹果',18,'2088-08-20'),
                   (4,'华为电脑',6999,'华为',14,'2088-06-16'),
                   (5,'小米电脑',4999,'小米',26,'2088-07-08'),
                   (6,'苹果电脑',8999,'苹果',15,'2088-10-25'),
                   (7,'联想电脑',7999,'联想',NULL,'2088-11-11');

  • 查询语法

                select
                           字段列表
                from
                           表名列表
               where
                           条件列表
                group by
                           分组字段
                having
                            分组之后的条件
                order by
                            排序
                limit
                           分页限定

  • 查询全部

               -- 查询product表所有数据
               SELECT * FROM product;

  • 查询部分

多个字段查询              -- 查询名称、价格、品牌
                                   SELECT NAME,price,brand FROM product;

去除重复查询             -- 查询品牌,去除重复
                                    SELECT DISTINCT brand FROM product;

计算列的值(四则运算)

                              标准语法: SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
                             如果某一列为null,可以进行替换       ifnull(表达式1,表达式2)
                              表达式1:想替换的列      表达式2:想替换的值

           -- 查询商品名称和库存,库存数量在原有基础上加10
                  SELECT NAME,stock+10 FROM product;

           -- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断
                  SELECT NAME,IFNULL(stock,0)+10 FROM product;

起别名            SELECT 列名1,列名2,... AS 别名 FROM 表名;

          -- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断。起别名为getSum
                 SELECT NAME,IFNULL(stock,0)+10 AS getsum FROM product;
                 SELECT NAME N,IFNULL(stock,0)+10 getsum FROM product;


2.4.1条件查询 

  • 条件分类
符号功能
>大于
<小于
>=大于等于
<=小于等于
=等于
<> 或 !=不等于
BETWEEN ... AND ...在某个范围之内(都包含)
IN(...)查询满足in中条件的数据
LIKE 占位符模糊查询 _单个任意字符 %多个任意字符
IS NULL是NULL
IS NOT NULL不是NULL
AND 或 &&并且
OR 或 ||或者
NOT 或 !非,不是
  • 条件查询语法

-- 标准语法
SELECT 列名 FROM 表名 WHERE 条件;

-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;

-- 查询品牌为华为的商品信息
SELECT * FROM product WHERE brand='华为';

-- 查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;  

-- 查询库存为14、30、23的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);

-- 查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;
-- 查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;

-- 查询名称以小米为开头的商品信息  (%代表任意多的任意字符,_代表一个任意字符)
SELECT * FROM product WHERE NAME LIKE '小米%'; 

-- 查询名称第二个字是为的商品信息
SELECT * FROM product WHERE NAME LIKE '_为%';  // 华为手机,华为电脑
SELECT * FROM product WHERE NAME LIKE '%为%';  // 大华为手机,华为电脑 , xx为 , 为xx

-- 查询名称为四个字符的商品信息
SELECT * FROM product WHERE NAME LIKE '____';

-- 查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE '%电脑%';


2.4.2聚合函数       

 将一列数据作为一个整体,进行纵向的计算

函数名功能
count(列名)统计数量(记录数,总共有多少条数据)(一般选用不为null的列)
max(列名)最大值
min(列名)最小值
sum(列名)求和
avg(列名)平均值
  • 聚合函数语法

-- 标准语法
SELECT 函数名(列名) FROM 表名 [WHERE 条件];

-- 计算product表中总记录条数
SELECT COUNT(*) FROM product;

-- 获取最高价格
SELECT MAX(price) FROM product;
-- 获取最高价格的商品名称
SELECT NAME,price FROM product WHERE price = (SELECT MAX(price) FROM product);

-- 获取最低库存
SELECT MIN(stock) FROM product;
-- 获取最低库存的商品名称
SELECT NAME,stock FROM product WHERE stock = (SELECT MIN(stock) FROM product);

-- 获取总库存数量
SELECT SUM(stock) FROM product;
-- 获取品牌为苹果的总库存数量
SELECT SUM(stock) FROM product WHERE brand='苹果';

-- 获取品牌为小米的平均商品价格
SELECT AVG(price) FROM product WHERE brand='小米';


2.4.3排序查询

排序分类

  • 注意:多个排序条件,当前边的条件值一样时,才会判断第二条件

关键词功能
ORDER BY 列名1 排序方式1,列名2 排序方式2对指定列排序,ASC升序(默认的) DESC降序
  • 排序语法

-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;

-- 按照库存升序排序
SELECT * FROM product ORDER BY stock ASC;

-- 查询名称中包含手机的商品信息。按照金额降序排序
SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;

-- 按照金额升序排序,如果金额相同,按照库存降序排列
SELECT * FROM product ORDER BY price ASC,stock DESC;


2.4.4分组查询

-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];

-- 按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product GROUP BY brand;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的降序排列
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000 ORDER BY getSum DESC;


2.4.5分页查询

-- 标准语法
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式] LIMIT 开始索引,查询条数;
-- 公式:开始索引 = (当前页码-1) * 每页显示的条数

-- 每页显示2条数据
SELECT * FROM product LIMIT 0,2;  -- 第一页 开始索引=(1-1) * 2
SELECT * FROM product LIMIT 2,2;  -- 第二页 开始索引=(2-1) * 2
SELECT * FROM product LIMIT 4,2;  -- 第三页 开始索引=(3-1) * 2
SELECT * FROM product LIMIT 6,2;  -- 第四页 开始索引=(4-1) * 2

LIMIT index,count;
      起始索引,查询几条(每页多少条)
    
      公式:起始索引 = (当前页数-1) * 每页显示的条数


3.约束

  • 约束的概念

    • 对表中的数据进行限定,保证数据的正确性、有效性、完整性!

  • 约束的分类

约束说明
PRIMARY KEY主键约束
PRIMARY KEY AUTO_INCREMENT主键、自动增长
UNIQUE唯一约束
NOT NULL非空约束
FOREIGN KEY外键约束
FOREIGN KEY ON UPDATE CASCADE外键级联更新
FOREIGN KEY ON DELETE CASCADE外键级联删除

3.1主键约束

  • 建表时添加主键自增约束

-- 标准语法
CREATE TABLE 表名(
    列名 数据类型 PRIMARY KEY, primary key
    列名 数据类型,
    ...
);

-- 创建student表
CREATE TABLE student(
    id INT PRIMARY KEY  -- 给id添加主键约束
);

-- 添加数据
INSERT INTO student VALUES (1),(2);
-- 主键默认唯一,添加重复数据,会报错
INSERT INTO student VALUES (2);
-- 主键默认非空,不能添加null的数据
INSERT INTO student VALUES (NULL);

-- 查询student表
SELECT * FROM student;
-- 查询student表详细
DESC student;

  • 删除主键

-- 标准语法
ALTER TABLE 表名 DROP PRIMARY KEY;

-- 删除主键
ALTER TABLE student DROP PRIMARY KEY;

  • 建表后单独添加主键

-- 标准语法
ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY;

-- 添加主键
ALTER TABLE student MODIFY id INT PRIMARY KEY;


3.2主键自动增长约束

  • 建表时添加主键自增约束

-- 标准语法
CREATE TABLE 表名(
    列名 数据类型 PRIMARY KEY AUTO_INCREMENT,
    列名 数据类型,
    ...
);

-- 创建student2表
CREATE TABLE student2(
    id INT PRIMARY KEY AUTO_INCREMENT    -- 给id添加主键自增约束
);

-- 添加数据
INSERT INTO student2 VALUES (1),(2);
-- 添加null值,会自动增长
INSERT INTO student2 VALUES (NULL),(NULL);

-- 查询student2表
SELECT * FROM student2;
-- student2表详细
DESC student2;

  • 删除自动增长

-- 标准语法
ALTER TABLE 表名 MODIFY 列名 数据类型;

-- 删除自动增长
ALTER TABLE student2 MODIFY id INT;

  • 建表后单独添加自动增长

-- 标准语法
ALTER TABLE 表名 MODIFY 列名 数据类型 AUTO_INCREMENT;

-- 添加自动增长
ALTER TABLE student2 MODIFY id INT AUTO_INCREMENT;


4.多表查询

  • 数据准备

-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;

-- 创建user表
CREATE TABLE USER(
    id INT PRIMARY KEY AUTO_INCREMENT,    -- 用户id
    NAME VARCHAR(20),                    -- 用户姓名
    age INT                             -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);


-- 订单表
CREATE TABLE orderlist(
    id INT PRIMARY KEY AUTO_INCREMENT,    -- 订单id
    number VARCHAR(30),                    -- 订单编号
    uid INT,    -- 外键字段
    CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);


-- 商品分类表
CREATE TABLE category(
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类id
    NAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');


-- 商品表
CREATE TABLE product(
    id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品id
    NAME VARCHAR(30),                    -- 商品名称
    cid INT, -- 外键字段
    CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);


-- 中间表
CREATE TABLE us_pro(
    upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表id
    uid INT, -- 外键字段。需要和用户表的主键产生关联
    pid INT, -- 外键字段。需要和商品表的主键产生关联
    CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
    CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);


4.1笛卡尔积查询

  • 笛卡尔乘积:两个集合的元素,任意两个元素结合在一起

    假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
  • 有两张表,获取这两个表的所有组合情况

  • 要完成多表查询,需要消除这些没有用的数据

  • 多表查询格式

                    SELECT
                                 列名列表
                    FROM
                                表名列表
                    WHERE
                                      条件...

  • 笛卡尔积查询

-- 标准语法
SELECT 列名 FROM 表名1,表名2,...;

-- 查询user表和orderlist表
SELECT * FROM USER,orderlist;


4.2内连接查询

  • 查询原理

    • 内连接查询的是两张表有交集的部分数据(有主外键关联的数据)

  • 显式内连接

-- 标准语法
SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;

-- 查询用户信息和对应的订单信息
SELECT * FROM USER INNER JOIN orderlist ON user.id=orderlist.uid;
SELECT * FROM USER JOIN orderlist ON user.id=orderlist.uid;

-- 查询用户信息和对应的订单信息,起别名
SELECT * FROM USER u JOIN orderlist o ON u.id=o.uid;

-- 查询用户姓名,年龄。和订单编号
SELECT
    u.`name`,    -- 姓名
    u.`age`,    -- 年龄
    o.`number`    -- 订单编号
FROM
    USER u          -- 用户表
JOIN
    orderlist o     -- 订单表
ON 
    u.`id` = o.`uid`;

  • 隐式内连接

-- 标准语法
SELECT 列名 FROM 表名1,表名2 WHERE 条件;

-- 查询用户姓名,年龄。和订单编号
SELECT
    u.`name`,    -- 姓名
    u.`age`,    -- 年龄
    o.`number`    -- 订单编号
FROM
    USER u,        -- 用户表
    orderlist o     -- 订单表
WHERE
    u.`id`=o.`uid`;


4.3外连接查询

  • 左外连接
  • 查询原理

    • 查询左表的全部数据,和左右两张表有交集部分的数据

  • 基本演示

- 标准语法
SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;

-- 查询所有用户信息,以及用户对应的订单信息
SELECT
    u.`name`,    -- 姓名
    u.`age`,    -- 年龄
    o.`number`    -- 订单编号
FROM
    USER u          -- 用户表
LEFT OUTER JOIN
    orderlist o     -- 订单表
ON
    u.`id`=o.`uid`;

  • 右外连接
  • 查询原理

    • 查询右表的全部数据,和左右两张表有交集部分的数据

  • 基本演示

-- 基本语法
SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;

-- 查询所有订单信息,以及订单所属的用户信息
SELECT
    u.`name`,    -- 姓名
    u.`age`,    -- 年龄
    o.`number`    -- 订单编号
FROM
    USER u          -- 用户表
RIGHT OUTER JOIN
    orderlist o     -- 订单表
ON
    u.`id`=o.`uid`;


4.4子查询

  • 子查询介绍

    • 查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!

  • 子查询-结果是单行单列的

    • 可以作为条件,使用运算符进行判断!

    • 基本演示

-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);

-- 查询年龄最高的用户姓名
SELECT MAX(age) FROM USER;              -- 查询出最高年龄
SELECT NAME,age FROM USER WHERE age=26; -- 根据查询出来的最高年龄,查询姓名和年龄
SELECT NAME,age FROM USER WHERE age = (SELECT MAX(age) FROM USER);

  • 子查询-结果是多行单列的
  • 可以作为条件,使用运算符in或not in进行判断!

  • 基本演示

-- 标准语法
SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]); 

-- 查询张三和李四的订单信息
SELECT id FROM USER WHERE NAME='张三' OR NAME='李四';   -- 查询张三和李四用户的id
SELECT number,uid FROM orderlist WHERE uid=1 OR uid=2; -- 根据id查询订单
SELECT number,uid FROM orderlist WHERE uid IN (SELECT id FROM USER WHERE NAME='张三' OR NAME='李四');

子查询-结果是多行多列的

  • 可以作为一张虚拟表参与查询!

  • 基本演示

-- 标准语法
SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];

-- 查询订单表中id大于4的订单信息和所属用户信息
SELECT * FROM USER u,(SELECT * FROM orderlist WHERE id>4) o WHERE u.id=o.uid;

 

4.5自关联查询

  • 自关联查询介绍

    • 同一张表中有数据关联。可以多次查询这同一个表!

  • 自关联查询演示

  • -- 创建员工表
    CREATE TABLE employee(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(20),
        mgr INT,  -- 上级编号
        salary DOUBLE
    );
    -- 添加数据
    INSERT INTO employee VALUES (1001,'孙悟空',1005,9000.00),
    (1002,'猪八戒',1005,8000.00),
    (1003,'沙和尚',1005,8500.00),
    (1004,'小白龙',1005,7900.00),
    (1005,'唐僧',NULL,15000.00),
    (1006,'武松',1009,7600.00),
    (1007,'李逵',1009,7400.00),
    (1008,'林冲',1009,8100.00),
    (1009,'宋江',NULL,16000.00);

    -- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
    /*
    分析:
        员工姓名 employee表        直接上级姓名 employee表
        条件:employee.mgr = employee.id
        查询左表的全部数据,和左右两张表交集部分数据,使用左外连接
    */
    SELECT
        t1.name,    -- 员工姓名
        t1.mgr,        -- 上级编号
        t2.id,        -- 员工编号
        t2.name     -- 员工姓名
    FROM
        employee t1  -- 员工表
    LEFT OUTER JOIN
        employee t2  -- 员工表
    ON
        t1.mgr = t2.id;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是代码实现: ```python import datetime def format_time_diff(start_time, end_time): time_diff = end_time - start_time if time_diff.days > 365: return end_time.strftime("%Y年%m月") elif time_diff.days > 30: return end_time.strftime("%Y年%m月%d日") elif time_diff.days > 0: return f"{time_diff.days}天前" elif time_diff.seconds > 3600: return f"{int(time_diff.seconds/3600)}小时前" elif time_diff.seconds > 60: return f"{int(time_diff.seconds/60)}分钟前" elif time_diff.seconds > 0: return f"{time_diff.seconds}秒前" else: return "未来时间" start_time = datetime.datetime(2018, 3, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 1, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 8, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 20) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 50) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 30, 40) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") ``` 输出结果为: ``` 2018-03-01 09:00:00 -> 2020-02-29 09:30:30: 2018年03月 2020-01-01 09:00:00 -> 2020-02-29 09:30:30: 2020年01月01日 2020-02-01 09:00:00 -> 2020-02-29 09:30:30: 28天前 2020-02-29 08:00:00 -> 2020-02-29 09:30:30: 1小时前 2020-02-29 09:29:20 -> 2020-02-29 09:30:30: 1分钟前 2020-02-29 09:29:50 -> 2020-02-29 09:30:30: 40秒前 2020-02-29 09:30:40 -> 2020-02-29 09:30:30: 未来时间 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值