MySQL数据库语言二:DML、DQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 本篇文章介绍MySQL语言中的DML和DQL语句,文章结尾有关于数据库实现鉴权展示内容的实操。

前言


 本篇文章介绍MySQL语言中的DML和DQL语句,文章结尾有关于数据库实现鉴权展示内容的实操。


DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE

DQL语句 数据库查询语言: 查询数据SELECT。


DML语句

DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE


INSERT插入语句

语法:

完整插入:INSERT  INTO   表名   VALUES(数据1、数据2。。。);

部分插入:INSERT   INTO  表名(字段1、字段2)  VELUES(数据1、数据2);            


创建测试表

6e11325028794aca9a05aa6526b6d7ac.png


完整插入

完整插入:INSERT  INTO   表名   VALUES(数据1、数据2。。。);

完整插入的时候要按照表字段的顺序进行数据插入 ,默认将输入的第一个数据插入到表的第一个字段以此类推。

2ea4d1ce925b42fd869846c3426e37e7.png


部分插入

部分插入:INSERT   INTO  表名(字段1、字段2)  VELUES(数据1、数据2);  

指定需要插入的字段,插入数据,按照自己指定的字段来插入对应的数据。


82f90b22841f4dcfa7311eb11c487bcc.png


UPDATE更新数据

语法:UPDATE   表名   SET   列名=值   WHERE   CONDITION;


测试

更新id为1的name为zhangsan。


d4a9f75204804dd0b7963877033f71d0.png


DELETE删除数据

语法:DELETE   FROM    表名   WHERE   CONDITION;


测试

删除姓名为jack的数据


a891371c49a34f72bf61cc974034d71f.png


DQL语句

DQL语句 数据库查询语言: 查询数据SELECT。

在MySQL管理软件中,可以通过SQL语句中的DQL语言来实现数据的

在玩游戏的时候,我们查看自己的装备,道具等操作都是通过SELECT语句实现的,还有银行的余额等查询功能都是SELECT操作完成的。


简单查询

查询所有列信息:SELECT  * FROM  表名;        //这也是之前一直用的查询语句。

查询部分列信息:SELECT   列1,列2列3    FROM  表名;

准备表并插入数据

create table employee(id int,name varchar(50),age int);


3315d9f2e2df4e46b7d76ab13ce920f8.png


查询所有信息

select * from employee;

查看表内的所有列信息。


4e0f8e9ff2ae4b7688a45bca70a4d3e5.png


查询部分信息

select name,age from employee;

查询employee表的name和age列。


a990306bbbef44a2b1de9cb87fb322a0.png


条件查询


但条件查询where

将以完整查询为例实验。

select  * from   表名    where   condition

查询年龄为18的人员信息。

select * from employee where age=18;


b06148d1efa74b9590826e140a45ffa8.png


多条件查询AND/OR

语法:select  *  from  表名   where   condition  AND   condition

            select  *  from  表名   where   condition  OR   condition  

1)查询id为1并且年龄为18的人员信息

2)查询id大于3或者年龄为19的人员信息


1)

27612790503246928793d0aad37a8b9f.png

2)

abbdc4718b354567b8ee4788a94712bd.png


关键字BETWEEN AND 在什么之间

语法:select  *  from  employee   where  列   between  值1  and  值1;

查找id在1-3之间的员工信息。


0f5b2492da8b41fe8f77e46c807d2d4c.png


查找id不在1-3之间的员工信息。


dfe7267642d64a25af34365832808c3a.png


IN集合查询

语法:select  *  from   表名   where   列  in(值1,值2,值3);

查询该列符合in内数值的信息,用or也能实现但是效率并没有in的高。

查询年龄为19,24,16的人员信息。

select  *  from  employee  where  age   in(16,19,24);


419f5081a68944efb5b7756ac5138b02.png


查询年龄不在19,24,16的人员信息。

select   *   from  employee  where  age  not  in(16,19,24);


44d12d01696e45dd82390a1cc248fee2.png


IS NULL查询空值信息

插入两行数据:一个是name为空的数据一个是name为空格的数据。


cad97ec971b9430a9890785b84b6c415.png


查询name为空的人员信息。

select * from employee where name is null;


dbcdbf1d57934d08a1745f48b3a7cf19.png


可以看到查到了6号人员信息7号人员信息并没有查到。


查询name不为空的人员信息。

select * from employee where name is not null;


95a6a07decb7436d892303afc4a90722.png

发现7号人员的信息被查到了,因为7号人员的name是空格不是空。


LIKE模糊查询

当记不清楚需要查询人员的具体信息的时候可以使用like关键字进行查询。

语法:select *  from  表名  where  列   like  '部分信息%';

查询姓张的人员信息。

select * from employee where name like 'zhang%';

f77339b833774363a57b1fd3963b35d9.png


查询好像名字是以re结尾的人员信息。

select * from employee where name like '%re';


e1e5226405c34d07ab408ecfe638c015.png


只知道人员名字前两个字母为na,并且知道该人员名字是四个字母的人员信息。

select * from employee where name like 'na__';

注意这里na后面是两个下划线,几个下划线代表后面有几个字母。


38944ea39e4946d8b89a67a4b7fec897.png


查询排序

查询升序排序:select  *  from   表名   ORDER  BY   列名  ASC;       //默认是以升序排序。

查询降序排序:select   *   from  表名  ORDER  BY  列名  DESC;


查询升序排序

select  *  from   表名   ORDER  BY  列名  ASC;

select  *  from   表名   ORDER  BY  列名;

查询结果按年龄升序排序。


47f6caf7280443afaddd74a8151a14b1.png


查询降序排序

select   *   from  表名  ORDER  BY  列名  DESC;

查询结果按年龄降序排序。


93565f4fb85a428292c525331017677f.png


多表查询

多表查询分为:多表连接查询、子查询


准备表

这里需要对employee表进行增加列的操作需要使用ALTER关键字进行操作。

语法:ALTER  TABLE   表名   ADD   列名   列描述    FIRST/AFTER列名;

FIRST/AFTER列名:指定新加列的位置,可写可不写,不写的话默认加在表的最后一列

在employee表的末尾加上人员的部门编码以及人员等级列。

增加多列需要用“,”隔开。

alter table employee add num int,add level int;

并且创建两个表一个是部门信息表,一个是人员等级信息表。


716d7077aa6f4dd8bab4a4736959d77c.png


准备数据

更新人员信息的部门编码以及人员等级,并且插入数据到部门信息表以及等级信息表。

完善人员信息表。


7d1c075608374cd196122aa9aad38f74.png


完善部门信息表

a1428aa7b83845338dbde0ac5e69d1f1.png


完善人员等级信息表。


ddf49ef83d054db1aa87f37cf1aaeb69.png


交叉连接

生成笛卡尔积,它不使用任何匹配条件。

比如将A表的6行,B表的7行,最后结果6*7=42行。

select employee.id,employee.name,employee.age,employee.num,department.name from employee,department;


e6088185d99b49b4ac3bdfbd34064521.png


内连接

这里因为都能够匹配,所以现在在三个表中添加一行匹配不到的数据。


38bb72e8ec274a4c8fb9b0e57c4d33c7.png


规定的两表的两列相同的数据才会显示出来。

语法:select  A表.列,B表.列   from  A表,B表   where   A表.列=B表.列;

select employee.id,employee.name,employee.num,department.dep_name from employee,department where employee.num=department.code;


3dddf540e40e403ea219be88533bd798.png


这里8号人员以及102部门都没有显示出来,因为没有匹配到


外连接

外连接分为左连接、右连接。

左连接:以左表为基础匹配右表的数据,这里不管左右两表有没有完全匹配,左表的内容都会被显示出来。

右连接:以右表为基础匹配左表的数据,这里不管左右两表有没有完全匹配,右表的内容都会被显示出来。


左连接

要求:查询所有人员所属部门,包括部门信息未存在的人员。

select * from employee left join department on employee.num=department.code;


f5d6468887ef4d67910d2d6ab629e890.png

可以看到人员信息表的信息都显示出来了,但是发现部门信息的102部门没有显示。


右连接

查看所有部门中年龄大于18的人员信息。

select * from employee right join department on employee.num=department.code and age>18;

这里使用了and,可能会有疑问为什么and后面的age不是用employee.age,因为and是在连接后处理的,连接后是一个新表,新表age就不用写employee.age了。

7879d08355db4d0bbeabaddf1acc3c18.png


发现部门信息都会显示出来,人员只有匹配的才会显示出来。


带in的子查询

将一个查询语句的结果当做另一个查询语句的条件进行查询。

语法:select  *  from  A表  where  列  in (select  distinct  和A表能够匹配的列  from B表   condition);

需求:查询级别月薪大于10000的人员信息。

select * from employee where level in (select distinct level from dep_level where salary>10000);

原理:括号内的子查询,将dep_level表查到的月薪大于10000的level的信息传递到父查询的level字段中作为范围来查询。


02e2639f2c664a25b2e7c1351077d496.png


查询员工年龄大于18的部门。

首先通过内连接的方法查看大于18岁人员的信息包括部门,再用子查询的方法查看结果是否一致。


cefdbf06d4064ea6875c46c00c5deeec.png


带exists的子查询(会员VIP的应用场景)

EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。

Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

需求:如果sure是董事长,则查询所有人员的月薪。

select * from employee,dep_level where employee.level=dep_level.level and exists (select *  from employee where level in (select distinct level from dep_level where name='董事长') and name='sure');

这里用了嵌套的方式来鉴别sure是不是董事长。

该查询往往用在身份鉴别、权限鉴别,根据身份权限来展示相应的内容,比如游戏充值VIP之后才可以看到的内容就会用到该查询,当然游戏中完成这个功能不会用这么复杂的sql语句,会使用一些if语句来判断。刚刚做的实操,董事长才有权限查看员工的工资。


3762db6b37ff4053b38b02f08a16db0b.png


需求:如果zhangsan是董事长,则显示所有员工的月薪。

select * from employee,dep_level where employee.level=dep_level.level and exists (select *  from employee where level in (select distinct level from dep_level where name='董事长') and name='zhangsan');


6a535fa2a903473bb2b4f090189563ba.png


这里使用子查询没有查询到结果,因为zhangsan不是董事长。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
SQL 关系型数据库 MySQL
Go语言中使用 sqlx 来操作 MySQL
Go语言因其高效的性能和简洁的语法而受到开发者们的欢迎。在开发过程中,数据库操作不可或缺。虽然Go的标准库提供了`database/sql`包支持数据库操作,但使用起来稍显复杂。为此,`sqlx`应运而生,作为`database/sql`的扩展库,它简化了许多常见的数据库任务。本文介绍如何使用`sqlx`包操作MySQL数据库,包括安装所需的包、连接数据库、创建表、插入/查询/更新/删除数据等操作,并展示了如何利用命名参数来进一步简化代码。通过`sqlx`,开发者可以更加高效且简洁地完成数据库交互任务。
13 1
|
7天前
|
SQL 关系型数据库 MySQL
MySQL】-DQL(基本、条件、分组、排序、分页)详细版
通过这些查询方法,你可以高效地检索、分析和组织MySQL数据库中的数据,以满足各种应用需求。实践中,理解这些SQL语句的基础知识以及它们如何组合起来进行复杂的数据操作是至关重要的。
15 1
|
11天前
|
SQL 关系型数据库 MySQL
Go语言中如何连接 MySQL,基础必备!
在现代应用中,数据库操作至关重要。本教程将指导你使用Go语言进行MySQL的CRUD操作。首先,确保已创建`test_db`数据库及`users`表。接着安装MySQL驱动:`go get -u github.com/go-sql-driver/mysql`。通过示例代码,你将学会连接数据库、创建、查询、更新及删除用户记录。尽管此方法直接,但在实际项目中可能略显繁琐,后续会介绍更高效的库如sqlx或gorm。现在,让我们从基础开始,掌握Go语言中的数据库交互技巧。
34 3
|
19天前
|
SQL 关系型数据库 数据库
|
19天前
|
SQL 关系型数据库 数据库
|
6天前
|
SQL 安全 关系型数据库
Go 语言中的 MySQL 事务操作
在现代应用中,确保数据完整与一致至关重要。MySQL的事务机制提供了可靠保障。本文首先解释了事务的概念及其ACID特性,随后介绍了如何在Go语言中使用`database/sql`包进行MySQL事务操作。通过一个银行转账的例子,演示了如何通过Go开启事务、执行操作并在必要时回滚或提交,确保数据一致性。最后,还讨论了不同事务隔离级别的含义及如何在Go中设置这些级别。通过本文的学习,开发者能更好地掌握MySQL事务的应用。
11 0
|
7天前
|
SQL 关系型数据库 MySQL
Go语言中进行MySQL预处理和SQL注入防护
在现代Web应用开发中,安全性至关重要。SQL注入是一种常见的攻击方式,攻击者可通过构造特殊SQL查询来非法访问或修改数据库数据。本文介绍如何利用Go语言中的预处理SQL语句来防范此类攻击。预处理不仅能提升安全性,还能提高性能并简化代码。通过使用`?`作为占位符,Go自动处理参数转义,有效避免SQL注入。此外,文章还提供了连接MySQL数据库、执行预处理查询以及最佳实践的示例代码。务必遵循这些指导原则,确保应用程序的安全性。
16 0
|
5天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
20 0
|
5天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
8天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。

热门文章

最新文章