MySQL笔记(二) 数据库操纵语言DML 、数据库查询语言DQL、数据库控制语言DCL、计算字段、子查询、函数

news2024/11/16 22:56:37

MySQL笔记(二)

    • 数据库操纵语言 DML
      • 插入数据 INSERT
      • 修改数据 UPDATE
      • 删除数据 DELETE
    • 数据库查询语言DQL
      • 单表查询
      • 常用查询条件
      • 排序查询
      • 分组和分页查询
        • 限制结果
      • 分页查询
      • 多表查询
      • 自身连接查询
      • 外连接查询
      • 嵌套查询
    • 计算字段
      • 字段 field
      • 拼接 concatenate
      • Trim() 函数
      • 别名 (alias)
        • 其他用途
    • 函数
      • 文本处理函数
      • 日期和时间处理函数
      • 数值处理函数
    • 聚集函数 aggregate function
      • DISTINCT
    • 分组
      • 创建分组 GROUP BY
        • 创建
        • 规则
        • WITH ROLLUP
      • 过滤分组
        • HAVING
        • 同时使用WHERE HAVING
    • 子查询
      • 作为计算字段使用子查询
      • 相关子查询 correlated subquery
    • 数据库控制语言DCL
      • 创建用户
      • 登录用户
      • 用户授权

上一篇笔记传送: MySQL笔记(一):设计范式、基础概念、数据库定义语言DDL

数据库操纵语言 DML

插入数据 INSERT

INSERT INTO 表名 VALUES (, , ); 

mysql> INSERT INTO student values(
    -> 26221011,
    -> 'Alice',
    -> 'female');

如果插入的数据与列一一对应,那么可以省略列名,如果希望向指定列上插入数据,则需要指定列名

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

也可以一次性插入多个数据

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

修改数据 UPDATE

如果忘记添加WHERE,那么将修改整张表的数据

UPDATE 表名 SET 列名 = 值, ... WHERE 条件 ;

在这里插入图片描述

删除数据 DELETE

DELETE FROM 表名 WHERE 条件;

数据库查询语言DQL

单表查询

-- 指定查询某一列数据
SELECT 列名[,列名] FROM 表名
-- 会以别名显示此列
SELECT 列名 别名 FROM 表名
-- 查询所有的列数据
SELECT * FROM 表名
-- 只查询不重复的值
SELECT DISTINCT 列名 FROM 表名


在这里插入图片描述

SELECT * FROM 表名 WHERE 条件 ;

常用查询条件

  • 一般的比较运算符,包括=、>、<、>=、<=、!=等。

  • 是否在集合中:in、not in

  • 通配符:like,not like, %(表示任何字符出现任意次数),_(只匹配单个字符)

    使用通配符的技巧

    1. 不要过度使用
    2. 不要把他们用在 搜索模式的开始处,这样搜索起来是最慢的
    3. 注意放置位置
  • 逻辑操作符:and、or、not

  • BETWEEN AND 和 IS NULL

SELECT * FROM student WHERE sid like %03; // 以03结尾的
SELECT * FROM student WHERE name not in('Alice','Bob');
SELECT * FROM student WHERE name not in('Alice','Bob') and sid like %03;
SELECT * FROM student WHERE name IS NULL;
SELECT * FROM student WHERE sid BETWEEN 26221010 AND 26221014;

排序查询

ASC表示正序、 DESC表示降序,默认升序;关键字只应用到直接位于前面的列名

ORDER BY 应该位于 WHERE 的后面

SELECT * FROM 表名 WHERE 条件 ORDER BY 列名1 ASC| DESC, 列名2 ASC|DESC; 

分组和分页查询

对查询结果进行分组,通常需要结合聚合函数一起使用

SELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名 ;

在这里插入图片描述

通过添加having,来增加约束条件

SELECT sum(*) FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 约束条件

限制结果

通过limit来限制查询的数量,只取前n个结果:

注:检索出来的第一行为行0

LIMIT 开始行, 行数;
LIMIT 行数 OFFSET 开始行; #MySQL 5 开始支持
SELECT * FROM 表名 LIMIT 数量

分页查询

SELECT * FROM 表名 LIMIT 起始位置,数量

多表查询

多表查询会通过连接转换成单表查询

直接查询会得到两张表的笛卡尔积,也就是每一项数据都和另一张表的数据结合一次,因此产生庞大的数据

如果两个表中都带有一样的属性,需要添加前缀来表明是哪一张表的数据

SELECT * FROM 表1, 表2 WHERE 条件

自身连接查询

自身连接查询,就是将表本身和表进行笛卡尔积计算,得到结果,但是由于表名相同,所以要先起一个别名

SELECT * FROM 表名 别名1, 表名 别名2

自身连接查询和前面是一样的, 只不过连接对象变成了自己和自己

外连接查询

外连接就是专门用于联合查询情景的,比如我们希望把两张表结合起来查看完整的数据,就可以通过使用外连接来进行查询,外连接有三种方式

inner join 进行内连接,只会返回两张表的交集部分

通过使用left join进行左连接,不仅会返回两个表满足条件的交集部分,也会返回左边表中的全部数据,而在右表中缺失的数据会使用null来代替(右连接right join同理)

在这里插入图片描述

嵌套查询

可以将查询结果作为另一个查询的条件

SELECT * FROM 表名 WHERE 列名 = (SELECT 列名 FROM 表名 WHERE 条件)

mysql> SELECT * FROM student WHERE sid = (SELECT sid FROM teach WHERE tid = (SELECT tid FROM teacher WHERE name = 'Allay'));

计算字段

字段 field

基本上与列的意思相同,经常互换使用;但是数据库列一般称为列,而术语字段通常用在计算字段的连接上;

只有数据库能区分SELECT语句中哪些是实际的表列,哪些列是计算字段;从客户机(应用程序)的角度来看,计算字段的数据和其他列的数据是以相同的方式返回的

拼接 concatenate

在MySQL中的select语句,可以使用Concat来拼接两列

mysql> SELECT Concat(Rtrim(name), '( ',Rtrim(sex),')')
    -> FROM student
    -> ORDER BY name;
+------------------------------------------+
| Concat(Rtrim(name), '( ',Rtrim(sex),')') |
+------------------------------------------+
| Allay( female)                           |
| Bob( male)                               |
| Casey( female)                           |
| David( male)                             |
| Elien( female)                           |
| fairy( female)                           |
+------------------------------------------+

Trim() 函数

MySQL除了支持前面使用到的Rtrim()以外,还有Trim() , Ltrim(),分别是去掉串左右两边的空格,去掉串右边的空格

别名 (alias)

是一个字段或者值的替换名,用AS 赋予;有时也称为导出列

任何客户机引用都可以按名引用这个列,就像他是一个实际的表列一样

mysql> SELECT price,
    -> number,
    -> price * number AS expanded_price
    -> FROM purchase;
+-------+--------+----------------+
| price | number | expanded_price |
+-------+--------+----------------+
|     2 |    100 |            200 |
|     3 |     23 |             69 |
|    12 |     76 |            912 |
+-------+--------+----------------+
3 rows in set (0.00 sec)

其他用途

在实际的表列包含不符合规定的字符(如空格)时重命名;在原来的名字容易混淆时扩充它;

函数

函数的可移植性没有SQL强,所以要确保做注释

大多数SQL支持以下类型的函数

  1. 用于处理文本串的文本函数
  2. 用于在数值数据上进行算术操作的数值函数
  3. 用于处理日期和时间值并从这些值中提取特定成分的日期和时间函数
  4. 返回DBMS正在使用的特殊信息的系统函数

文本处理函数

在这里插入图片描述

关于SOUNDEX

是一个将任何文本串转换为描述其语音表示的字母数字模式的算法,它考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较

SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');

日期和时间处理函数

日期和时间处理函数采用相应的数据类型和特殊的格式存储,以便能快速有效地排序或者过滤,并且节省物理存储空间

它总是被用来读取、统计和处理这些值,在MySQL当中有着重要的意义
在这里插入图片描述

数据经常需要用日期进行过滤,首先需要注意的时MySQL的日期格式均为yyyy-mm-dd ,排除了多义性

SELECT cust_id, order_num 
FROM orders
WHERE order_date = '2023-05-07';

但是这种会出问题,因为date的类型为datetime ,它同时存储日期与时间值,因此我们就需要用到Date()函数,仅仅提取日期部分

SELECT cust_id, order_num 
FROM orders
WHERE Date(order_date) = '2023-05-07';

如果想要提取一个自然月的订单:

第一种方法就是使用 BETWEEN

WHERE Date(order_date) BETWEEN '2023-04-01' AND '2023-04-30';

第二种方法:分别提取比较

WHERE Year(order_date) = 2023 AND Month(order_date) = 9;

数值处理函数

在主要DBMS的函数中,数值函数是最统一最一致的函数
在这里插入图片描述

聚集函数 aggregate function

聚集函数用来汇总数据,这些函数是高效设计的,返回结果一般比在自己的客户机应用程序中计算的要快得多

包括:

  • count([distinct]*)统计所有的行数(distinct表示去重再统计,下同)
  • count([distinct]列名)统计某列的值总和
  • sum([distinct]列名)求一列的和(注意必须是数字类型的)
  • avg([distinct]列名)求一列的平均值(注意必须是数字类型)
  • max([distinct]列名)求一列的最大值
  • min([distinct]列名)求一列的最小值
SELECT count(distinct 列名) FROM 表名 AS 别名 WHERE 条件 ;

SELECT COUNT(DISTINCT name) FROM student; //注意中间没有空格

在这里插入图片描述

DISTINCT

DISTINCT关键字应用于所有列,而不仅是他的前置列,除非指定的两个列相同,否则所有行都会被检测出来

如果指定列名,DISTINCT只能用于Count()而不是Count(*),也就是不允许使用Count(DISTINCT);

DISTINCT不能用于计算或表达式,必须使用列名

分组

创建分组 GROUP BY

创建

分组是在SELECT语句中的GROUP BY子句中创建的

mysql> SELECT sid,
    -> COUNT(*) AS num
    -> FROM teach
    -> GROUP BY sid;
+----------+-----+
| sid      | num |
+----------+-----+
| 26221011 |   1 |
| 26221012 |   1 |
| 26221014 |   1 |
|        2 |   2 |
+----------+-----+
4 rows in set (0.00 sec)

规则

  1. 可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制
  2. 在嵌套分组,数据在最后规定的分组上进行汇总;也就是说,在建立分组时,指定的所有列一起计算
  3. 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数),如果在SELECT中使用表达式则必须在子句中指定相同的表达式,不能使用别名
  4. 除聚集计算语句外,SELECT语句中的每个列都必须在子句中给出
  5. 如果分组列中含有NULL值,则也会作为一个分组返回,列中有多行NULL值,则将他们分为一组
  6. 必须出现在WHERE子句的后面,ORDER BY语句之前

WITH ROLLUP

使用ROLLUP使用 WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组的值)

mysql> SELECT sid,
    -> COUNT(*) AS num
    -> FROM teach
    -> GROUP BY sid WITH ROLLUP;
+----------+-----+
| sid      | num |
+----------+-----+
|        2 |   2 |
| 26221011 |   1 |
| 26221012 |   1 |
| 26221014 |   1 |
|     NULL |   5 |
+----------+-----+
5 rows in set (0.00 sec)

过滤分组

HAVING

WHERE过滤行,HAVING过滤分组

这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组

mysql> SELECT sid,
    -> COUNT(*) AS num
    -> FROM teach
    -> GROUP BY sid
    -> HAVING COUNT(*) > 1;
+-----+-----+
| sid | num |
+-----+-----+
|   2 |   2 |
+-----+-----+
1 row in set (0.00 sec)

同时使用WHERE HAVING

例:返回过去十二月内有两个以上订单的顾客

SELECT vend_id, COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*) >= 2;

子查询

用子查询测试和调试查询很有技巧性,特别是在这些语句的复杂性不断增加的情况下更是如此。用子查询建立(和测试)查询的最可靠的方法是逐渐进行,这与MySQL处理它们的方法非常相同。

首先,建立和测试最内层的查询然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。对于要增加的每个查询,重复这些步骤

这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性。

子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列

mysql> SELECT sid
    -> FROM student
    -> WHERE name IN (SELECT tid
    -> FROM teach
    -> WHERE sid > 1);
Empty set, 6 warnings (0.00 sec)

在SELECT语句中,子查询总是从内向外处理

在使用子查询语句时,要注意分解为多行并且适当的缩进;能极大的简化子查询的使用

作为计算字段使用子查询

使用子查询的另外一种方式是创建计算字段

SELECT cust_name,
	cust_state, (SELECT COUNT(*)
                FROM orders
                WHERE orders.cust_id = customers.cust_id) AS orders FROM customers
                ORDER BY cust_name;

相关子查询 correlated subquery

涉及外部查询的子查询

任何时候只要列名可能有多义性就必须使用该语法(表名和列名由点号隔开),如果不完全限定列名,会出现歧义;所以必须限定有歧义性的列名

数据库控制语言DCL

创建用户

CREATE USER 用户名 IDENTIDIED BY 'PASSWORD';
CREATE USER 用户名 IDENTIDIED BY RANDOM PASSWORD;

示例

mysql> CREATE USER Robot IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.05 sec)

mysql> CREATE USER REST IDENTIFIED BY RANDOM PASSWORD;
+------+------+----------------------+-------------+
| user | host | generated password   | auth_factor |
+------+------+----------------------+-------------+
| REST | %    | Ou&]*FQdgw[ZHQb&DTo< |           1 |
+------+------+----------------------+-------------+
1 row in set (0.04 sec)

登录用户

首先需要添加一个MySQL Server 的环境变量,然后通过cmd进行登录

C:\Users\lenovo>mysql -u Robot -p

访问数据库

show databases;

用户授权

可以通过使用grant来为数据库用户进行授权

grant all|权限1,权限2...(列1,...) on 数据库.表 to 用户 [with grant option];
grant all on need.* to Robot;
mysql> grant select, update(name) on need.student to Robot;

其中all代表授予所有权限,当数据库和表为*,代表为所有的数据库和表都授权。如果在最后添加了with grant option,那么被授权的用户还能将已获得的授权继续授权给其他用户

我们可以使用revoke来收回一个权限:

revoke all|权限1,权限2...(列1,...) on 数据库.表 from 用户

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

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

相关文章

10个免费的ChatGPT镜像网站

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…

MySQL数据库基础表格——增删改查(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

媒体邀约服务

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约是什么&#xff1f;专业的媒体邀约服务包含哪些内容&#xff1f;怎么选择合适的媒体邀约服务机构&#xff1f; 今天胡老师就跟大家分享下这方面你的经验。 一&#xff0c;媒体邀…

【C++STL】AVL树

前言 二叉搜索树是具有特殊存储结构的树&#xff0c;任意根节点的左子树的所有节点值都比根节点的值小&#xff0c;右子树的所有节点值都比根节点大。 这种特殊的存储结构使得查找的效率大大提升&#xff0c;为logN。但是还有缺陷。 因为二叉搜索树的构建是一个节点一个节点的…

django 过往后端搭建笔记整理 (2)--rest_framework视图使用

rest_framework视图使用 CreateAPIView---单独执行post上传逻辑views.pyuser_serializers.py CreateAPIView—单独执行post上传逻辑 基本逻辑&#xff1a; ① 准备视图函数类 ② 准备序列化器类 &#xff08;其中可以自定义如何序列化数据、序列化哪些数据&#xff0c;以及如何…

苹果最近删除的照片删除怎么恢复?专业人士都这样恢复照片!

案例&#xff1a;苹果照片删除了怎么恢复&#xff1f; 【友友们&#xff0c;最近不小心清空了手机照片&#xff0c;在最近删除没有看到&#xff0c;有什么方法可以找回来吗&#xff1f;】 随着现代科技的不断发展&#xff0c;手机已经成为人们生活中必不可少的物品&#xff0c…

设计模式 -- 享元模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

以CSDN为例,用Charles抓浏览器接口

0 描述 很多网站&#xff0c;都禁止F12&#xff0c;这就给抓包设置了门槛&#xff0c;虽然解决的方法有很多&#xff0c;今天尝试使用工具试一试&#xff0c;以CSDN热榜为例&#xff0c;直接转python代码 1 工具下载 工欲善其事&#xff0c;必先利其器 这个我就不多说&#x…

MySql -- 为什么使用B+树做索引

再有人问你为什么MySQL用B树做索引&#xff0c;就把这篇文章发给她 本文是参考上述文章进行总结和补充,大家感兴趣也可以阅读原文. 目录 1. 索引 2. 二叉搜索树 3. 平衡二叉树 4. B树 5. B树 6.扩展 -- 聚集索引 VS 非聚集索引 1. 索引 概念:索引是一种特殊的文件&#xff…

工业4.0,无代码改变软件开发格局,数字化转型不再寸步难行

从工业1.0时代到工业4.0时代&#xff0c;我们已经看到了&#xff0c;中国在不断发展的过程中&#xff0c;面临着很多的挑战&#xff0c;企业也面临着很多的困难。在这样的大背景下&#xff0c;传统的开发方式已经不再适用了。很多企业开始寻求一种新的方式来开发软件&#xff0…

【场景削减】基于DBSCAN密度聚类风电-负荷确定性场景缩减方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

1688阿里巴巴中国站图片识别商品API接口、搜图链接、收藏加购接口

API&#xff08;Application Programming Interface&#xff09; 是现代移动应用程序开发和互联网服务有机结合的产物。API的应用使得应用程序之间的通信变得更加轻松、快捷&#xff0c;尤其对于业务复杂而庞大的企业系统&#xff0c;API让开发者能够从中提取必要的功能进行二次…

图表控件Stimulsoft 2023.2 带来极致深色主题, 一起来看看还有哪些亮点?

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。

​ IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。 根据法拉第电磁感应定律&#xff0c;当交变磁场作用于具有磁性的材料时&#xff0c;材料中会感应出电动势。 由于导电材料的磁性&#xff0c;EMF 的电流围绕磁性材料主体旋转。这种旋转电流称为涡流。当导…

相交链表问题

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

java版spring cloud 企业电子招投标采购系统源码之首页设计

随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审计监督要…

通过MyBatis(下)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 对MyBatis进行单元测试 springboot的单元测试 生成单元测试类 MyBatis中的增删查改 增 删 查 改 ${} 和 #{} 的区别 SQL注入 模糊查询…

低版本CUDA安装/多版本切换/用户级CUDA安装

前言&#xff1a;我想要安装Torch V1.7.1&#xff0c;根据版本信息只有cuda10.2和11.0。但是&#xff0c;本地安装的CUDA版本为11.6和11.2&#xff0c;都不能满足需求。因此需要降低CUDA版本为10.2 本机系统信息 CUDA版本和显卡驱动 nvidia-smi目前CUDA版本为11.6&#xff0c…

7万字省级智慧农业大数据平台项目规划建设方案

1.1 系统总体结构和逻辑结构 XX市智慧农业项目数据中心是全省数据处理加工和数据分析应用的中心&#xff0c;总体上需实现上连省农业厅、下连各级农业、外连市级部门&#xff1b;构建资源整合、互联互通、资源共享的全省统一的数据中心资源库&#xff1b;构建完善的底层支撑平…

Excel常用快捷键,你也可以成为大家口中的大神

掌握复制、粘贴&#xff0c;相信每个职场人都能骄傲地说“自己熟练使用Excel”&#xff0c;果真如此不害臊吗&#xff1f;不出10秒钟&#xff0c;肯定被面试官问得哑口无言。快捷键太多&#xff0c;记住几个常用的&#xff0c;收藏起来&#xff0c;需要的时候过来查看。 “学E…