MySQL中的DDL、DML、DCL、DQL

news2024/9/23 5:24:29

SQL分类

  • DDL(Data Definition Language)数据定义语言
    • 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
  • DML(Data Manipulation Language)数据操作语言
    • 用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
  • DQL(Data Query Language)数据查询语言
    • 用来查询数据库中表的记录(数据)。关键字:select, where 等
  • DCL(Data Control Language)数据控制语言(了解)
    • 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

在这里插入图片描述

1.DDL

1.1DDL-操作数据库

  • R(Retrieve):查询

    • 查询所有数据库
    -- 查询所有数据库
    SHOW DATABASES;
    
    • 查询某个数据库的创建语句
    -- 标准语法
    SHOW CREATE DATABASE 数据库名称;
    
    -- 查看mysql数据库的创建格式
    SHOW CREATE DATABASE mysql;
    
  • C(Create):创建

    • 创建数据库
    -- 标准语法
    CREATE DATABASE 数据库名称;
    
    -- 创建db1数据库
    CREATE DATABASE db1;
    
    -- 创建一个已存在的数据库会报错
    -- 错误代码:1007  Can't create database 'db1'; database exists
    CREATE DATABASE db1;
    
    • 创建数据库(判断,如果不存在则创建)
    -- 标准语法
    CREATE DATABASE IF NOT EXISTS 数据库名称;
    
    -- 创建数据库db2(判断,如果不存在则创建)
    CREATE DATABASE IF NOT EXISTS db2;
    
    • 创建数据库、并指定字符集
    -- 标准语法
    CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;
    
    -- 创建数据库db3、并指定字符集utf8
    CREATE DATABASE db3 CHARACTER SET utf8;
    
    -- 查看db3数据库的字符集
    SHOW CREATE DATABASE db3;
    
    • 练习:创建db4数据库、如果不存在则创建,指定字符集为gbk
-- 创建db4数据库、如果不存在则创建,指定字符集为gbk
CREATE DATABASE IF NOT EXISTS db4 CHARACTER SET gbk;

-- 查看db4数据库的字符集
SHOW CREATE DATABASE db4;
  • U(Update):修改

    • 修改数据库的字符集
    -- 标准语法
    ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
    
    -- 修改数据库db4的字符集为utf8
    ALTER DATABASE db4 CHARACTER SET utf8;
    
    -- 查看db4数据库的字符集
    SHOW CREATE DATABASE db4;
    
  • D(Delete):删除

    • 删除数据库
    -- 标准语法
    DROP DATABASE 数据库名称;
    
    -- 删除db1数据库
    DROP DATABASE db1;
    
    -- 删除一个不存在的数据库会报错
    -- 错误代码:1008  Can't drop database 'db1'; database doesn't exist
    DROP DATABASE db1;
    
    • 删除数据库(判断,如果存在则删除)
    -- 标准语法
    DROP DATABASE IF EXISTS 数据库名称;
    
    -- 删除数据库db2,如果存在
    DROP DATABASE IF EXISTS db2;
    
  • 使用数据库

    • 查询当前正在使用的数据库名称
    -- 查询当前正在使用的数据库
    SELECT DATABASE();
    
    • 使用数据库
    -- 标准语法
    USE 数据库名称;
    
    -- 使用db4数据库
    USE db4;
    

1.2DDL-操作数据表

  • R(Retrieve):查询

    • 查询数据库中所有的数据表
    -- 使用mysql数据库
    USE mysql;
    
    -- 查询库中所有的表
    SHOW TABLES;
    
    • 查询表结构
    -- 标准语法
    DESC 表名;
    
    -- 查询user表结构
    DESC user;
    
    • 查询表字符集
    -- 标准语法
    SHOW TABLE STATUS FROM 库名 LIKE '表名';
    
    -- 查看mysql数据库中user表字符集
    SHOW TABLE STATUS FROM mysql LIKE 'user';
    
  • C(Create):创建

    • 创建数据表

      • 标准语法
      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个字符
      
      • 创建数据表
      -- 使用db3数据库
      USE db3;
      
      -- 创建一个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;
      
  • U(Update):修改

    • 修改表名
    -- 标准语法
    ALTER TABLE 表名 RENAME TO 新的表名;
    
    -- 修改product2表名为product3
    ALTER TABLE product2 RENAME TO product3;
    
    • 修改表的字符集
    -- 标准语法
    ALTER TABLE 表名 CHARACTER SET 字符集名称;
    
    -- 查看db3数据库中product3数据表字符集
    SHOW TABLE STATUS FROM db3 LIKE 'product3';
    -- 修改product3数据表字符集为gbk
    ALTER TABLE product3 CHARACTER SET gbk;
    -- 查看db3数据库中product3数据表字符集
    SHOW TABLE STATUS FROM db3 LIKE 'product3';
    
    • 添加一列
    -- 标准语法
    ALTER TABLE 表名 ADD 列名 数据类型;
    
    -- 给product3表添加一列color
    ALTER TABLE product3 ADD color VARCHAR(10);
    
    • 修改列名称和数据类型
    -- 修改数据类型 标准语法
    ALTER TABLE 表名 MODIFY 列名 新数据类型;
    
    -- 将color数据类型修改为int
    ALTER TABLE product3 MODIFY color INT;
    -- 查看product3表详细信息
    DESC product3;
    
    
    -- 修改列名和数据类型 标准语法
    ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
    
    -- 将color修改为address,数据类型为varchar
    ALTER TABLE product3 CHANGE color address VARCHAR(30);
    -- 查看product3表详细信息
    DESC product3;
    
    • 删除列
    -- 标准语法
    ALTER TABLE 表名 DROP 列名;
    
    -- 删除address列
    ALTER TABLE product3 DROP address;
    
  • D(Delete):删除

    • 删除数据表
    -- 标准语法
    DROP TABLE 表名;
    
    -- 删除product3表
    DROP TABLE product3;
    
    -- 删除不存在的表,会报错
    -- 错误代码:1051  Unknown table 'product3'
    DROP TABLE product3;
    
    • 删除数据表(判断,如果存在则删除)
    -- 标准语法
    DROP TABLE IF EXISTS 表名;
    
    -- 删除product3表,如果存在则删除
    DROP TABLE IF EXISTS product3;
    

2.DML

2.1.DML-INSERT语句

  • 新增表数据语法

    • 新增格式1:给指定列添加数据
    -- 标准语法
    INSERT INTO 表名(列名1,列名2,...) VALUES (1,2,...);
    
    -- 向product表添加一条数据
    INSERT INTO product(id,NAME,price,stock,insert_time) VALUES (1,'手机',1999,22,'2099-09-09');
    
    -- 向product表添加指定列数据
    INSERT INTO product (id,NAME,price) VALUES (2,'电脑',4999);
    
    -- 查看表中所有数据
    SELECT * FROM product;
    
    • 新增格式2:默认给全部列添加数据
    -- 标准语法
    INSERT INTO 表名 VALUES (1,2,3,...);
    
    -- 默认给全部列添加数据
    INSERT INTO product VALUES (3,'电视',2999,18,'2099-06-06');
    
    -- 查看表中所有数据
    SELECT * FROM product;
    
    • 新增格式3:批量添加数据
    -- 默认添加所有列数据 标准语法
    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');
    -- 查看表中所有数据
    SELECT * FROM product;
    
    
    -- 给指定列添加数据 标准语法
    INSERT INTO 表名(列名1,列名2,...) VALUES (1,2,...),(1,2,...),(1,2,...);
    
    -- 批量添加指定列数据
    INSERT INTO product (id,NAME,price) VALUES (6,'微波炉',499),(7,'电磁炉',899);
    -- 查看表中所有数据
    SELECT * FROM product;
    
  • 注意事项

    • 列名和值的数量以及数据类型要对应
    • 除了数字类型,其他数据类型的数据都需要加引号(单引双引都可以,推荐单引)

2.2.DML-UPDATE语句

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

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

-- 查看所有数据
SELECT * FROM product;

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

-- 修改电磁炉的库存为10
UPDATE product SET stock=10 WHERE id=7;
  • 注意事项
    • 修改语句中必须加条件
    • 如果不加条件,则将所有数据都修改

2.3.DML-DELETE语句

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

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

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

-- 查看所有商品信息
SELECT * FROM product;
  • 注意事项
    • 删除语句中必须加条件
    • 如果不加条件,则将所有数据删除

3.DQL

3.1DQL-单表查询

  • 数据准备(直接复制执行即可)
-- 创建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
	分页限定
  • 查询全部
-- 标准语法
SELECT * FROM 表名;

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

    • 多个字段查询
    -- 标准语法
    SELECT 列名1,列名2,... FROM 表名;
    
    -- 查询名称、价格、品牌
    SELECT NAME,price,brand FROM product;
    
    • 去除重复查询
      • 注意:只有全部重复的才可以去除
    -- 标准语法
    SELECT DISTINCT 列名1,列名2,... FROM 表名;
    
    -- 查询品牌
    SELECT brand FROM product;
    -- 查询品牌,去除重复
    SELECT DISTINCT brand FROM product;
    
    • 计算列的值(四则运算)
    -- 标准语法
    SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
    
    /*
    	计算列的值
    	标准语法:
    		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,IFNULL(stock,0)+10 getsum FROM product;
    
  • 条件查询

    • 条件分类
    符号功能
    >大于
    <小于
    >=大于等于
    <=小于等于
    =等于
    <> 或 !=不等于
    BETWEEN … AND …在某个范围之内(都包含)
    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 '____';
    
    -- 查询名称中包含电脑的商品信息
    SELECT * FROM product WHERE NAME LIKE '%电脑%';
    
  • 聚合函数

    • 将一列数据作为一个整体,进行纵向的计算
    • 聚合函数分类
    函数名功能
    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='小米';
    
  • 排序查询

    • 排序分类
      • 注意:多个排序条件,当前边的条件值一样时,才会判断第二条件
    关键词功能
    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;
    
  • 分组查询

-- 标准语法
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;
  • 分页查询
-- 标准语法
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
  • 分页查询图解
    在这里插入图片描述

3.2DQL-多表查询

数据准备

  • SQL语句
-- 创建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);

笛卡尔积查询

  • 有两张表,获取这两个表的所有组合情况
  • 要完成多表查询,需要消除这些没有用的数据
  • 多表查询格式
SELECT
	列名列表
FROM
	表名列表
WHERE
	条件...
  • 笛卡尔积查询
-- 标准语法
SELECT 列名 FROM 表名1,表名2,...;

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

内连接查询

  • 查询原理
    • 内连接查询的是两张表有交集的部分数据(有主外键关联的数据)
  • 显式内连接
-- 标准语法
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`;

外连接查询

  • 左外连接

    • 查询原理
      • 查询左表的全部数据,和左右两张表有交集部分的数据
    • 基本演示
    -- 标准语法
    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`;
    

子查询

  • 子查询介绍

    • 查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!
  • 子查询-结果是单行单列的

    • 可以作为条件,使用运算符进行判断!
    • 基本演示
    -- 标准语法
    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;
    

多表查询练习

  • 查询用户的编号、姓名、年龄。订单编号
/*
分析:
	用户的编号、姓名、年龄  user表     订单编号 orderlist表
	条件:user.id = orderlist.uid
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
FROM
	USER t1,       -- 用户表
	orderlist t2   -- 订单表
WHERE
	t1.`id` = t2.`uid`;
  • 查询所有的用户。用户的编号、姓名、年龄。订单编号
/*
分析:
	用户的编号、姓名、年龄 user表     订单编号 orderlist表
	条件:user.id = orderlist.uid
	查询所有用户,使用左外连接
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
FROM
	USER t1        -- 用户表
LEFT OUTER JOIN
	orderlist t2   -- 订单表
ON
	t1.`id` = t2.`uid`;
  • 查询所有的订单。用户的编号、姓名、年龄。订单编号
/*
分析:
	用户的编号、姓名、年龄 user表     订单编号 orderlist表
	条件:user.id = orderlist.uid
	查询所有订单,使用右外连接
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
FROM
	USER t1         -- 用户表
RIGHT OUTER JOIN
	orderlist t2    -- 订单表
ON
	t1.`id` = t2.`uid`;
  • 查询用户年龄大于23岁的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析:
	用户的编号、姓名、年龄 user表     订单编号 orderlist表
	条件:user.age > 23 AND user.id = orderlist.uid
*/
/*
select
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
from
	user t1,     -- 用户表
	orderlist t2 -- 订单表
where
	t1.`age` > 23
	and
	t1.`id` = t2.`uid`;
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
FROM
	USER t1       -- 用户表
LEFT OUTER JOIN
	orderlist t2  -- 订单表
ON
	t1.`id` = t2.`uid`
WHERE
	t1.`age` > 23;
  • 查询张三和李四用户的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析:
	用户的编号、姓名、年龄 user表     订单编号 orderlist表
	条件:user.id = orderlist.uid AND user.name IN ('张三','李四');
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户姓名
	t1.`age`,	-- 用户年龄
	t2.`number`	-- 订单编号
FROM
	USER t1,        -- 用户表
	orderlist t2    -- 订单表
WHERE
	t1.`id` = t2.`uid`
	AND
	-- (t1.`name` = '张三' OR t1.`name` = '李四');
	t1.`name` IN ('张三','李四');
  • 查询商品分类的编号、分类名称。分类下的商品名称
/*
分析:
	商品分类的编号、分类名称 category表     分类下的商品名称 product表
	条件:category.id = product.cid
*/
SELECT
	t1.`id`,	-- 分类编号
	t1.`name`,	-- 分类名称
	t2.`name`	-- 商品名称
FROM
	category t1,	-- 商品分类表
	product t2	    -- 商品表
WHERE
	t1.`id` = t2.`cid`;
  • 查询所有的商品分类。商品分类的编号、分类名称。分类下的商品名称
/*
分析:
	商品分类的编号、分类名称 category表     分类下的商品名称 product表
	条件:category.id = product.cid
	查询所有的商品分类,使用左外连接
*/
SELECT
	t1.`id`,	-- 分类编号
	t1.`name`,	-- 分类名称
	t2.`name`	-- 商品名称
FROM
	category t1	-- 商品分类表
LEFT OUTER JOIN
	product t2	-- 商品表
ON
	t1.`id` = t2.`cid`;
  • 查询所有的商品信息。商品分类的编号、分类名称。分类下的商品名称
/*
分析:
	商品分类的编号、分类名称 category表     分类下的商品名称 product表
	条件:category.id = product.cid
	查询所有的商品信息,使用右外连接
*/
SELECT
	t1.`id`,	-- 分类编号
	t1.`name`,	-- 分类名称
	t2.`name`	-- 商品名称
FROM
	category t1	-- 商品分类表
RIGHT OUTER JOIN
	product t2	-- 商品表
ON
	t1.`id` = t2.`cid`;
  • 查询所有的用户和所有的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析:
	用户的编号、姓名、年龄 user表   商品名称 product表   中间表 us_pro
	条件:us_pro.uid = user.id AND us_pro.pid = product.id
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户名称
	t1.`age`,	-- 用户年龄
	t2.`name`	-- 商品名称
FROM
	USER t1,	-- 用户表
	product t2,	-- 商品表
	us_pro t3	-- 中间表
WHERE
	t3.`uid` = t1.`id`
	AND
	t3.`pid` = t2.`id`;
  • 查询张三和李四这两个用户可以看到的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析:
	用户的编号、姓名、年龄 user表   商品名称 product表   中间表 us_pro
	条件:us_pro.uid = user.id AND us_pro.pid = product.id AND user.name IN ('张三','李四')
*/
SELECT
	t1.`id`,	-- 用户编号
	t1.`name`,	-- 用户名称
	t1.`age`,	-- 用户年龄
	t2.`name`	-- 商品名称
FROM
	USER t1,	-- 用户表
	product t2,	-- 商品表
	us_pro t3	-- 中间表
WHERE
	(t3.`uid` = t1.`id` AND t3.`pid` = t2.`id`)
	AND
	-- (t1.`name` = '张三' or t1.`name` = '李四');
	t1.`name` IN ('张三','李四');

自关联查询

  • 自关联查询介绍
    • 同一张表中有数据关联。可以多次查询这同一个表!
  • 自关联查询演示
-- 创建员工表
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;

4.DCL

SQL中使用GRANT和REVOKE语句向用户授予或收回对数据的操作权限。GRANT语句向用户授予权限,REVOKE语句收回已经授予用户的权限。

4.1GRANT

GRANT语句的一般格式为:

GRANT <权限>[,<权限>]...
ON <对象类型><对象名>
TO <用户>
[WITH GRANT OPTION];

其语义为:将对指定操作对象的指定操作权限授予指定的用户。发出该GRANT语句的可以是数据库管理员,也可以是该数据库对象创建者(即属主owner),还可以是已经拥有该权限的用户。接受权限的用户可以是一个或多个具体用户,也可以是PUBLIC,即全体用户。

如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限再授予给其他的用户。如果没有指定WITH GRANT OPTION 子句,则获得某种权限的用户只能使用该权限,不能传播该权限。

grant语句例子

把查询Student表的权限授给用户U1
GRANT SELECT
ON TABLE Student
TO U1

把对Student表和Course表的全部操作权限授予用户U2和U3
GRANT ALL PRIVILEGES
ON TABLE Student,Course
TO U2,U3

把对表SC的查询权限授予给所有用户
GRANT SELECT
ON TABLE SC
TO PUBLIC

把查询Student表和修改学生学号的权限授予给用户U4
GARNT UPDATE(Sno),SELECT
ON TABLE Student
TO U4
这里,实际上要授予U4用户的是对基本表Student的SELECT权限和对属性列Sno的UPDATE权限。对属性列授权时必须明确指出相应的属性列名。

把对表SC的INSERT权限授予U5用户,并允许将此权限在授予给其他用户
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION
执行此SQL语句后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限,即由U5用户发上述GRANT命令给其他用户。例如U5可以将此权限授予U6
GRANT INSERT
ON TABLE SC
TO U6
WITH GRANT OPTION
同样,U6还可以将此权限授予U7
GRANT INSERT
ON TABLE SC
TO U7
因为U6未给U7传播的权限,因此U7不能再传播此权限

4.2REVOKE

授予用户的权限可以由数据库管理员或其他授权者用REVOKE语句收回,REVOKE语句的一般格式为:

REVOKE <权限>
ON <对象类型> <对象名>
FROM <拥护>

revoke语句例子

把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4

收回所有用户对表SC的查询权限
REVOKE SELECT
ON TABLE SC
FROM PUBLIC

把用户U5对SC表的INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE
将用户U5的INSERT权限收回的同时,级联(CASCADE)收回了U6和U7的INSERT权限,否则系统拒绝执行该命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-element-表格 Excel 【导入】功能 (2023元旦快乐~~~)

一、页面表格导入功能 我们借鉴vue-element-admin文件来学习表格导入功能,如果你有vue-element-admin的完整文件&#xff0c;可以去这里找 or 用我这里的代码 1. 整体复制到你要用到的页面 <template><div class"app-container"><upload-excel-com…

unreal engine 纹理动态运动的实现

先用ps涉及一张图,发光的地方为白色 下图实际上边缘是相连的白色 split_line.jpgue新建材质 基础色vector3 随便选择一个偏灰的颜色 自发光 TextureCoordirate ->Panner->图片rgb->*发光常量 * 20自发光 预览效果 通过修改纹理协调器的V垂直平铺控制条纹数量 image.pn…

mybatis插件

Configuration组成 Mapper映射器 3个部分组成&#xff1a; MappedStatement 保存一个节点(select | insert | update | delete) &#xff0c;包括我们配置的sql&#xff0c;&#xff0c;sql的id&#xff0c;&#xff0c;缓存信息&#xff0c;&#xff0c;resultMap,parameterT…

Redis高并发锁(三)分布式锁

在很多情况下&#xff0c;你的数据库不支持事务&#xff0c;分布式部署也使得你无法去使用JVM锁&#xff0c;那么这种时候&#xff0c;你可以考虑用分布式锁 文章目录分布式锁1. 实现方式2. 特征3. 操作4. 代码改造5. 测试优化1. 递归改成循环2. 防止死锁3. 防误删4. LUA脚本 保…

Arduino code for RS-365PW 16120

Pictures These pictures are from Baidu Search. Picture 1: Installment Picture 2: Appearance Picture 3: Encoder of Motor Picture 4: Pins location and number Physical Specification Brand: Mabuchi Motor (万宝至电机)Type: RS-365PW 16120 Body length&#xff1…

学生抢课接口(高并发入门)

目录 使用Mysql 常规测试 张三测试 流程总结 redis优化 修改代码 测试 使用分布式锁 总结 使用Mysql 常规测试 原始代码: Override Transactional public ResponseResult selectCourse(SelectParmas selectParmas) {if (Objects.isNull(selectParmas)){return new …

【python游戏】新的一年快来变身兔兔战士打败獾守护兔兔吧~

前言 大家早好、午好、晚好吖 ❤ ~ 一只快乐兔&#xff0c; 来到快乐山&#xff0c;喝了快乐泉&#xff0c; 又到快乐殿&#xff0c;吃了快乐莲&#xff0c;遇到快乐仙&#xff0c; 听了快乐言&#xff1a;快乐很简单&#xff0c;快乐在身边&#xff0c;快乐无极限&#xff…

C++中STL的vector扩容机制

目录前言发生扩容扩容机制size()和capacity()reserve()和resize()前言 前阵子面试的时候&#xff0c;被问到往vector中插入一个数据可能会发生什么&#xff1f; 我答:可能会扩容; 为啥vector支持变长&#xff1f; 我答:它实在堆上动态申请内存&#xff0c;因此有自己的一套扩容…

Redis集群系列十 —— 集群伸缩之收缩

集群收缩原理 集群收缩就是让其中一些节点安全下线。 所谓的安全下线指的是让一个节点下线之前&#xff0c;把其负责的所有 slots 迁移到别的节点上&#xff0c;否则该节点下线后其负责的 slots 就没法继续提供服务了。 收缩流程如下&#xff1a; 需求 前面扩容完成后&…

字符串大小写转化,有序数组二分查找个人心得等若干内容

tips 1. 在电脑里面&#xff0c;任何一切字符&#xff0c;当一看到的时候&#xff0c;脑子里面就要把它转化成ACSII值。如while(0)&#xff0c;可以实现死循环。 2. 统计整形数组的长度不能用strlen()&#xff0c;别一天到晚用到底&#xff0c;strlen统计的是字符数组的长度 …

在wsl下开发T113的主线linux(1)-准备wsl开发环境

首先在win10或win11下安装wsl&#xff0c;选择wsl1或者wsl2都可以&#xff0c;wsl2的性能更高一些&#xff0c;wsl1的跨系统文件操作速度更快一些&#xff0c;我这里因为有一些工程在win文件系统下&#xff0c;所以选择了wsl1&#xff0c;发行版使用最新的Ubuntu 22.04.01 LTS。…

MySQL隐式转换

隐式转换概念 When an operator is used with operands of different types, type conversion occurs to make the operands compatible. Some conversions occur implicitly. 当运算符与不同类型的操作数一起使用时&#xff0c;将进行类型转换以使操作数兼容。某些转换是隐式发…

2022年年终总结---新方向,新期待

2022年行将结束&#xff0c;回首年初立下的flag&#xff1a; (1)完成OpenCoord版本升级&#xff0c;增加ITRF框架及历元转换、EGM2008查询功能&#xff1b; (2)完成多波束开源项目的数据读取和显示操作。 任务(1)已经完成了&#xff0c;任务&#xff08;2&#xff09;没有完成。…

力扣(LeetCode)2351. 第一个出现两次的字母(C++)

哈希集合 开哈希集合&#xff0c;遍历字符串&#xff0c;未出现的字母加入哈希集合&#xff0c;如果字母出现过&#xff0c;返回这个字母即可。 class Solution { public:char repeatedCharacter(string s) {unordered_set<char> S;for(auto &c:s)if(!S.count(c)) …

第二证券|72家公司接待机构过千,迈瑞医疗热度“断层领先”

2022年最终一个交易日&#xff0c;沪指以红盘收官&#xff0c;但年内A股商场震荡起伏&#xff0c;三大指数均收跌&#xff0c;其间&#xff0c;沪指全年下跌15%&#xff0c;创业板指跌近三成。 调研活动是出资者挖掘上市公司信息的重要来源&#xff0c;是洞悉商场主力资金意向的…

记录NCNN Yolov5部署华为鸿蒙系统踩过的坑

目录 踩坑一&#xff1a;Android Studio连接鸿蒙系统踩过的坑 踩坑二&#xff1a;配置Android studio环境 踩坑三&#xff1a;打开文件夹的位置 踩坑四&#xff1a;No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi 总结 踩…

使用 Bitnami Helm 安装 Kafka

服务器端 K3S 上部署 Kafka Server Kafka 安装 &#x1f4da;️ Quote: charts/bitnami/kafka at master bitnami/charts (github.com) 输入如下命令添加 Helm 仓库&#xff1a; > helm repo add tkemarket https://market-tke.tencentcloudcr.com/chartrepo/opensource-…

LinuxShell注意事项

Linux 介绍 内存 虚拟内存 = 物理内存 + 交换空间 交换空间 = 交换空间 当用户访问某一个程序内存时,需要访问物理内存,而不是交换内存,如果物理内存没有,而交换内存有,则会将交换内存中的程序 加载进物理内存供用户使用,同样,当一个程序长期未访问,内核会将物理内…

【Mongoose笔记】Websocket 服务器

【Mongoose笔记】Websocket 服务器 简介 Mongoose 笔记系列用于记录学习 Mongoose 的一些内容。 Mongoose 是一个 C/C 的网络库。它为 TCP、UDP、HTTP、WebSocket、MQTT 实现了事件驱动的、非阻塞的 API。 项目地址&#xff1a; https://github.com/cesanta/mongoose学习 …

Chromium Embedded Framework(CEF)源码编译基于windows

1.打开维基百科CEF主页: Chromium Embedded Framework - Wikipedia 2.找到CEF仓库地址:chromiumembedded / cef — Bitbucket 打开CEF源码仓库: 点击 Wiki,然后在 Getting Started节,点击cef-project 向下拉浏览滚动条,可看到Setup章节