DML语言(数据库操作语言)和DQL语言(数据库查询语言)

发布于:2022-12-26 ⋅ 阅读:(516) ⋅ 点赞:(0)

DML语言(数据库操作语言)和DQL语言(数据库查询语言)

1.DML语言(Data Manipulation Language)

1.1、添加语句(insert)

INSERT INTO `teacher`(`name`, `pwd`, `sex`) VALUES('张三', 'aaaaaa', '男'),('李四', '123456', '男')
--格式:INSERT INTO `表名`(`字段1`, `字段2`, `字段3`) VALUES('张三', 'aaaaaa', '男'),('李四', '123456', '男')

--可以插入多条数据,此处就是插入两条数据的操作
--前后注意一一对应,另外字段是可以省略的,但是要注意一一对应的关系(如id设置为自增的情况下就被省略了)

1.2、修改语句(update)

--修改表teacher中id为1的行,将对应行的name修改为'张三'
UPDATE `teacher` SET `name`='张三' WHERE id = 1
--不指定条件会默认修改所有行(面向监狱)
UPDATE `teacher` SET `name`='张三'

--格式:UPDATE `表名` SET `column_name`='value1',[`column_name2`='value2'] where [条件]


  • colum_name是数据库的列,建议带上``
  • value可以是具体的值,也可以是一个变量
  • 一定要加where进行条件筛选,不然修改或者删除所有的数据就麻烦咯
  • where后面的条件:
操作符 含义 例子 结果
= 等于 5=6 false
<>或!= 不等于 5<>6 true
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN…AND… 范围区间 [2,5]
AND或&& 5>1 and 1>2 false
OR或|| 5>1 or 1>2 true
!

  • 下面是加了运算符(其他的类似):
UPDATE `teacher` SET `name`='李老师' WHERE `name`='李四' AND sex='女'  --通过多个条件定位要修改的数据

1.3、删除语句(delete)

DELETE FROM `teacher`   --不加筛选条件删除teacher表中所有数据

DELETE FROM `teacher` WHERE id = 1  --删除指定数据正确写法

TRUNCATE `teacher`   --建议使用这条语句清空表
  • TRUNCATE清空表不会影响自增
  • 同时不影响事务

delete删除的问题,重启数据库出现的现象(了解):

  • 如果使用的是innoDB引擎,自增列会从1开始(存在于内存中,断电即失)
  • 如果使用的是MyISAM 继续从上一个自增量开始(存在于文件中,不丢失)

2.DQL语言(Data Query Language)

2.1、DQL

  • 所有查询操作都用它 Select
  • 简单查询和复杂查询都能做
  • 数据库中最核心的语言​
  • 使用频率最高

2.2、指定要查询的字段

--基本格式: SELECT 字段1,字段2... FROM 表名
SELECT * FROM teacher   --  *表示所有字段
SELECT `name`,`pwd` FROM teacher  
SELECT `name` AS 姓名, `pwd` AS 密码 FROM teacher AS Tea -- 将查出来的name和pwd分别起一个别名,表名也可以起别名
SELECT CONCAT('姓名:',`name`) AS 新名字 FROM teacher  -- 将查出来的数据进行字符串拼接,并把此列起一个别名

2.3、去重(distinct)

select查询出来的数据中如有重复,让重复的数据只显示一条

--直接将distinct加在select后面
SELECT DISTINCT `name` FROM teacher

2.4、其它用法

SELECT VERSION()  --查询系统版本(函数)
SELECT 100*3-1 AS 计算结果    --计算表达式(表达式)
SELECT @@auto_increment_increment  --查询自增的步长(变量)
SELECT `score`+1 AS 提分后 FROM teacher   --对于score一列全部加一然后查看

2.5、利用where查询

查询符号我们所设计的要求的数据

!=  或者 NOT
SELECT name score FROM teacher WHERE NOT score=100 -- 查询出成绩不是100的
||
SELECT name score FROM teacher WHERE score>=95 || score<=25    --查询成绩大于等于95的或者小于等于25的
and  &&SELECT name score FROM teacher WHERE score>=95 AND score<=1000      --查询出成绩是95到100的
区间:
SELECT name score FROM teacher WHERE score BETWEEN 95 AND 100          --查询出成绩是95到100的

2.6、模糊查询

运算符:

运算符 语法 描述
IS NULL a is null 如果a为null则为true
IS NOT NULL a is not null 如果a不为null为true
BETWEEN a between b and c a在b和c之间则为true
Like a like b 如果a匹配b则为true
In a in (a1,a2,a3) a只要在a1到a3中某一个值中就是true

运用案例:

-----------------模糊查询----------------
-- like结合 %(代表0到任意个字符) _(代表一个字符)
SELECT `name` FROM `teacher`
WHERE NAME LIKE '李%'  --查询姓李的人


SELECT `name` FROM `teacher`
WHERE NAME LIKE '王_'  --查询姓王的人且王字后面只有一个字

SELECT `name` FROM `teacher`
WHERE NAME LIKE '%文%'  --查询名字中带文的人

SELECT `name` FROM `teacher`
WHERE id IN (1, 2, 4)  --查询id是1或者2或者4的人

SELECT `name` FROM `teacher`
WHERE address='' OR address IS NULL --查询地址为空的人(即空字符串或者null的)



2.7、联表查询(重点)

七种join

此处仅讲解inner join和left join 还有 right join,想要深入了解可以自行搜索七种join理论

假如目前有两个表:

result表:

StudentNo SubjectNo StudentResult
1002 1 95
1008 5 85
1000 6 75
1001 100 98

​ --最后一条数据所对应的学号仅在result表存在

stu表:

StudentNo StudentName Sex
1000 周丹
1002 小文
1008 小明
1006 小红

–最后一条数据所对应的学号仅在stu表存在

需求:假如我们要想要同时拿到StudentNo(两个表都有)、StudentName(仅stu表有)、StudentResult(仅result表有)三列的数据:

分析:

  • 确定数据从哪些表格取;stu和result表
  • 确定两个表格是否有交集,否则无法联立,此处都有StudentNo
  • 确定将哪个表作为主表

inner join的写法:

SELECT `StudentName`, s.`StudentNo`, `StudentResult`   -- 确定需要的信息,此处由于StudentNo在两个表都有,注意要给他注明从哪个表取
FROM `stu` AS s                                      -- 选择要从哪个表,并给stu表起个别名
INNER JOIN `result` AS r                             -- 选择要连接哪个表,此处选择result,并给它起个别名r
ON s.`StudentNo`=r.`StudentNo`                       -- 设置条件,联立两个表
[Where ..AND...]                                          --可以在后面加入其它条件缩小范围

inner join结果:

StudentName StudentNo StudentResult
小文 1002 95
小明 1008 85
周丹 1000 75

同样地:我们看看另外两种连接的方式:

left join的写法:

SELECT `StudentName`,s.`StudentNo`,`StudentResult`
FROM `stu` AS s
LEFT JOIN `result` AS r                   --仅在此处作改变,此时stu是主表
ON s.`StudentNo`=r.`StudentNo`

left join结果:

StudentName StudentNo StudentResult
小文 1002 95
小明 1008 85
周丹 1000 75
小红 1006 Null

right join的写法:

SELECT `StudentName`,s.`StudentNo`,`StudentResult`
FROM `stu` AS s
Right JOIN `result` AS r                    --仅在此处作改变,此时result是主表
ON s.`StudentNo`=r.`StudentNo`

结果:

StudentName StudentNo StudentResult
周丹 1000 75
小文 1002 95
小明 1008 85
Null Null 98

总结:

可以结合上面的图对比

  1. inner join是交集,所以对于两个表格都特有的数据,结果中没有取出来
  2. left join是将左表作为主表,FROM stu AS s
    LEFT JOIN result AS r ,这句就是说left左边的表格stu是主表,所以结果还会会展示stu所特有的数据
  3. right join是将右表作为主表,FROM stu AS s
    LEFT JOIN result AS r ,这句就是说right右边的表格result是主表,所以结果还会会展示stu所特有的数据
操作 描述
inner join(用的多) 交集部分
left join 交集+左边表格特有的部分
right join 交集+右边表格特有的部分

2.8、自连接(了解)

将一个表拆成两个表查询可以称为自连接,具体使用可自行搜索,此处不再过多概述


2.9、分页和排序

假设目前score表是:

score表

  • 排序:记住两个关键字,desc为降序,asc为升序
SELECT * FROM score
ORDER BY score DESC   --按照降序展示,将desc改为asc即为升序结果


降序结果:

降序结果

  • 分页:起始位置,每页的数据条数

细节的注意:如果要把分页和排序组合的话,要先写order by 在写limit,即后面加条件的话要按照一定的顺序,其他的也是如此,下面的图给出了条件加入的顺序:

各种条件加入的顺序

SELECT * FROM score
LIMIT 0,5    --表示从第一条数据开始,每页五条数据  (格式:起始位置,页面大小)

分页后:

分页后


2.10、子查询

  • 子查询简单理解其实就是嵌套查询

  • 有些情况下可以用子查询而不需要去使用联表查询就可以解决问题

  • 但是子查询能解决的需求基本都能用联表查询去解决

假设现在有result表:

result表

stu表:

stu表

--需求:假设我们现在要从result表中查询小明的成绩:
SELECT `StudentNo`,`StudentResult`
FROM `result`
WHERE StudentNo=(       --条件就是result表中的目标学号对应小明的学号,接着从stu表中找到小明的学号,括号的结果就是返回了小明的学号
	SELECT `StudentNo`FROM `stu`
	WHERE `StudentName`='小明'
)

查询结果:
查询结果

​ ------能看到这里的想必都不简单!祝你天天向上!

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到