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、联表查询(重点)
此处仅讲解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
总结:
可以结合上面的图对比
- inner join是交集,所以对于两个表格都特有的数据,结果中没有取出来
- left join是将左表作为主表,FROM
stu
AS s
LEFT JOINresult
AS r ,这句就是说left左边的表格stu是主表,所以结果还会会展示stu所特有的数据- right join是将右表作为主表,FROM
stu
AS s
LEFT JOINresult
AS r ,这句就是说right右边的表格result是主表,所以结果还会会展示stu所特有的数据
操作 | 描述 |
---|---|
inner join(用的多) | 交集部分 |
left join | 交集+左边表格特有的部分 |
right join | 交集+右边表格特有的部分 |
2.8、自连接(了解)
将一个表拆成两个表查询可以称为自连接,具体使用可自行搜索,此处不再过多概述
2.9、分页和排序
假设目前score表是:
- 排序:记住两个关键字,desc为降序,asc为升序
SELECT * FROM score
ORDER BY score DESC --按照降序展示,将desc改为asc即为升序结果
降序结果:
- 分页:起始位置,每页的数据条数
细节的注意:如果要把分页和排序组合的话,要先写order by 在写limit,即后面加条件的话要按照一定的顺序,其他的也是如此,下面的图给出了条件加入的顺序:
SELECT * FROM score
LIMIT 0,5 --表示从第一条数据开始,每页五条数据 (格式:起始位置,页面大小)
分页后:
2.10、子查询
子查询简单理解其实就是嵌套查询
有些情况下可以用子查询而不需要去使用联表查询就可以解决问题
但是子查询能解决的需求基本都能用联表查询去解决
假设现在有result表:
stu表:
--需求:假设我们现在要从result表中查询小明的成绩:
SELECT `StudentNo`,`StudentResult`
FROM `result`
WHERE StudentNo=( --条件就是result表中的目标学号对应小明的学号,接着从stu表中找到小明的学号,括号的结果就是返回了小明的学号
SELECT `StudentNo`FROM `stu`
WHERE `StudentName`='小明'
)
查询结果:
------能看到这里的想必都不简单!祝你天天向上!
本文含有隐藏内容,请 开通VIP 后查看