草庐IT

SQL:DML、DQL、DCL

折诗 2023-03-28 原文

SQL:DML、DQL、DCL

DML:Data Manipulation Language(数据操作语言)

DML用来对数据库中的数据记录进行增删改操作。

  • DML-添加数据
  1. 给指定字段添加数据(一条数据)
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...);
  1. 给全部字段添加数据(一条数据)
INSERT INTO 表名 VALUES(值1,值2,...);
  1. 批量添加数据
# 指定字段
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
# 所有字段
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);

注意:

  1. 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
  2. 字符串和日期型数据应该包含在引号中。
  3. 插入的数据大小,应该在字段的规定范围内。
  • DML-修改数据
UPDATE 表名 SET 字段名1=值1,字段名2=值2,...[WHERE 条件];
-- 若不带where条件,则修改整张表全部记录的同一个字段为同一个值
-- 例子:
update emp set name='youhui',gender='女' where id=10;
  • DML-删除数据
DELETE FROM 表名 [WHERE 条件];

--注意:DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据,即表会被清空。
--DELETE语句不能删除某一个字段的值(可以使用UPDATE)。

--例子:
delete from emp where id=10;

DQL:Data Query Language(数据查询语言)

DQL用来查询数据库中表的记录。

查询关键字:SELECT

  • DQL-语法(单表查询)
--编写顺序
SELECT 
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数
  • DQL-基本查询
  1. 查询多个字段
SELECT 字段1,字段2,字段3... FROM 表名;

SELECT * FROM 表名;
  1. 设置别名(不是必须)
SELECT 字段1 [AS 别名1],字段2[AS 别名2] ... FROM 表名;
  1. 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
  • DQL-条件查询(WHERE)
  1. 语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
  1. 条件:可以是比较运算符和逻辑运算符
比较运算符 功能
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
BETWEEN 最小值 AND 最大值 在某个范围之内(含最小、最大值)
IN(...) 在IN之后的列表中的值,多选一
LIKE 占位符 模糊查询(_匹配单个字符,%匹配任意个字符)
IS NULL 是NULL
逻辑运算符 功能
AND 或 && 并且(多个条件同时成立)
OR 或 || 或者(多个条件任意一个成立)
NOT 或 ! 非,不是
  • 聚合函数(count、max、min、avg、sum)
  1. 介绍:聚合函数是将一列数据作为一个整体,进行纵向计算。
  2. 常见聚合函数:都是作用于表中的某一列的
函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和
  1. 语法:
SELECT 聚合函数(字段列表) FROM 表名;
例子:select count(*) from emp;
--注意:null值不参与所有聚合函数运算
  • DQL-分组查询(GROUP BY)
  1. 语法:
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
  1. where与having区别
    • 执行时机不同:where是分组之前进行过滤,不满足where条件,不进行分组;而having是分组之后对结果进行过滤。
    • 判断条件不同:where不能对聚合函数进行判断,而having可以。

注意:

  1. 执行顺序:where > 聚合函数 > having。
  2. 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • DQL-排序查询(ORDER BY)
  1. 语法:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;

例子:
select * from emp order by entrytime;
  1. 排序方式:
    • ASC:升序(默认值)
    • DESC:降序

注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。

  • DQL-分页查询
  1. 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
  1. 注意:
    • 起始索引从0开始,起始索引=(查询页码 - 1)*每页显示记录数。
    • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
    • 如果查询的是第一页的数据,起始索引可以省略,直接简写为limit 查询记录数。
  • DQL-执行顺序

DCL:Data Control Language

DQL是用来管理数据库用户、控制数据库的访问权限的。

  • DCL-管理用户:管理哪些用户可以访问当前数据库
  1. 查询用户
USE mysql;
SELECT * FROM user;
  1. 创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
  1. 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
  1. 删除用户
DROP USER '用户名'@'主机名';

注意:

  1. 主机名可以使用 % 通配。
  2. 这类SQL开发人员操作的比较少,主要是DBA(Database Administrator,数据库管理员)使用。
  • DCL-权限控制:控制当前用户连接上MySQL数据库之后可以访问哪些数据库哪些表以及对这些表执行什么样的操作。

MySQL中定义了很多种权限,但是常用的就以下几种:

权限 说明
ALL,ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 修改数据表/库/视图
CREATE 创建数据库/表
  1. 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
  1. 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
  1. 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
  1. 注意:
    • 多个权限之间,使用逗号分隔。
    • 授权时,数据库名和表名可以使用 * 进行通配,代表所有。

有关SQL:DML、DQL、DCL的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  3. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  4. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  5. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

  6. sql - Rails:使用 Postgres 创建对象时重复 ActiveRecord::RecordNotUnique? - 2

    我正在使用Rails4应用程序,它需要创建大量对象以响应来自另一个系统的事件。当我调用create!时,主键列上出现非常频繁的ActiveRecord::RecordNotUnique错误(由PG::UniqueViolation引起)我的模型之一。我在SO上找到了其他答案,建议挽救异常并调用retry:beginTableName.create!(data:'here')rescueActiveRecord::RecordNotUnique=>eife.message.include?'_pkey'#Onlyretryprimarykeyviolationslog.warn"Retr

  7. ruby-on-rails - Ruby 和 SQL 中的重复业务逻辑 - 2

    我有一个PORO(普通旧Ruby对象)来处理一些业务逻辑。它接收一个ActiveRecord对象并对其进行分类。为了简单起见,以下面为例:classClassificatorSTATES={1=>"Positive",2=>"Neutral",3=>"Negative"}definitializer(item)@item=itemenddefnameSTATES.fetch(state_id)endprivatedefstate_idreturn1if@item.value>0return2if@item.value==0return3if@item.value但是,我还想根据这些st

  8. sql - ActiveRecord 的意外行为包括 - 2

    我正在使用ARincludes在对象User和Building之间执行LEFTOUTERJOIN的方法,其中User可能有也可能没有Building关联:users=User.includes(:building).references(:buildings)因为我正在使用references,任何关联的Building对象都将被预先加载。我的期望是我随后能够遍历用户列表,并检查用户是否有与其关联的建筑物而不会触发额外的查询,但实际上每当我尝试访问建筑物属性时我都会看到对于没有建筑物的用户,AR会进行另一个SQL调用以尝试检索该建筑物(尽管在后续尝试中它只会返回nil)。这些查询显然是

  9. sql - 如何查询具有 3 个标签的事件? - 2

    我有以下模型:activity.rbtag.rbtagging.rb标签是事件和标签的连接模型。我想搜索具有2个或更多标签的事件。我如何在Rails中执行此操作?例如:我有tag1=Christmas,tag2=Florida,tag3=John如果存在,我想找到tag1、tag2和tag3存在的Activity。[编辑]我最终做了什么:tags=[tag1,tag2,tag3]activities=[]tags.eachdo|tag|activities如果任何组值的大小等于tags.size,则该事件包含所有标签。 最佳答案 如

  10. ruby-on-rails - 如何(大量)减少 Rails 应用程序中的 SQL 查询数量? - 2

    在我的Rails应用程序中,我有users,它可以有许多invoices,而invoices又可以有许多payments。现在在dashboardView中,我想总结一个user曾经收到的所有payments,按年、季度或月。付款也分割为毛额、Netty和税额。user.rb:classUser:items).allpayments_with_invoice.select{|x|range.cover?x.date}.sum(&:"#{kind}_amount")endend发票.rb:classInvoicepayment.rb:classPaymentdashboards_cont

随机推荐