MySQL---3、DQL数据查询语言

目录

DQL是啥?

一、查询数据

(一)直接查询

(二)WHERE 条件查询

(三)LIKE 模糊查询

(四)算数查询

(五)逻辑查询

(六)IN和NOT IN运算符

(七)范围查询

(八)AS子句 别名

(九)DISTINCT 去重

(十)NULL 空值条件查询

(十一)ORDER BY 排序

(十二)LIMIT 分页

(十三)GROUP BY 分组

(十四)HAVING 筛选

二、连接查询

三、内连接

(一)等值和非 等值连接

      1、等值连接

        2、非等值连接

(二)自连接

四、外连接

(一)左连接

(二)右连接

五、自然连接

六、子查询

 

DQL是啥?

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

查询数据库数据,如SELECT语句

简单的单表查询或多表的复杂查询和嵌套查询

数据库语言中最核心、最重要的语句

使用频率最高的语句

一、查询数据

SELECT   [ALL | DISTINCT] 
{  * |  table.* | [ table.field1 [ as  alias1] [,table.field2 [as  alias2]][,…]] }
FROM  table_name  [ as  table_ alias  ]
    [left|out|inner  join  table_name2]    #联合查询
	[ WHERE  … ]   	#指定结果需满足的条件
	[ GROUP BY …]	#指定结果按照哪几个字段来分组
	[ HAVING …]	#过滤分组的记录必须满足的次要条件
	[ ORDER BY… ]	#指定查询记录按一个或者多个条件排序
	[ LIMIT  {   [ offset,] row_count   |   row_count OFFSET offset   }] ; 
 #指定查询的记录从哪条至哪条

(一)直接查询

语法:select 字段 from 表名;

#从 student 表中查询 name 与 age
select name, age from student;

(二)WHERE 条件查询

用于检索数据表中符合条件的记录

搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

语法:select 字段 from 表名 where 条件;

#从 student 表中查询 age = 15 的 name
select name from student where age = 15;

(三)LIKE 模糊查询

语法:
select 字段 from 表名 where 字段 like '%数据%';

#从 student 表中查询 name 中含有 '张' 的所有记录
select * from student where name like '%张%';

#从 student 表中查询 name 中含姓'张' 的所有记录
select * from student where name like '张%';	

#从 student 表中查询 name 中名字为'张X' 的所有记录
select * from student where name like '张_';	

# %匹配多位
# _匹配一位

(四)算数查询

语法:>(大于), <(小于), =(等于), !=(不等于), <>(不等于), >=(大于等于), <=(小于等于)

#从 student 表中查询 age < 15 的所有记录
select * from student where age < 15;

(五)逻辑查询

语法:and(且), or(或), not(非)

#从 student 表中查询 age = 15 或 sex = 'man' 的所有记录
select * from student where age = 15 or sex = 'man';

(六)IN和NOT IN运算符

语法:select 字段 from 表名 where 字段 in(列表)//或 not in(列表);

#从 student 表中查询 age 为 (13, 14, 15) 之间的所有记录
select * from student where age in(13, 14, 15);

(七)范围查询

语法:用来替换算术运算符
select 字段 from 表名 where 字段 between 范围1 and 范围2;
	select * from student where age between 13 and 15;
#等价于: 
	select * from student where age >= 13 and age <= 15;

(八)AS子句 别名

可给数据列取一个新别名

可给表取一个新别名

可把经计算或总结的结果用另外一个新名称来代替

SELECT s.Sno as '学号'  FROM student as s;

(九)DISTINCT 去重

去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条

SELECT     DISTINCT   字段名1, 字段名2...     FROM   表名
#查询学生信息表中班级
SELECT DISTINCT s.Class FROM student as s;

(十)NULL 空值条件查询

NULL代表“无值”

区别于零值0和空符串“”

只能出现在定义允许为NULL的字段

须使用 IS NULL 或 IS NOT NULL 比较操作符去比较

(十一)ORDER BY 排序

对SELECT语句查询得到的结果,按某些字段进行排序与DESC或ASC搭配使用,默认为ASC

## 排序查询
语法:select 字段 from 表名 order by 字段 排序方式(升序 asc, 降序 desc);

#从 student 表中查询所有记录并按照 age 升序排序
select * from student order by age asc

(十二)LIMIT 分页

LIMIT可以使用在MySQL、PGSQI、MariaDB、sQLite等数据库中使用,表示分页。

不能使用在sQL Server、DB2、oracle !

语法:
LIMIT [m,]n  或  LIMIT  n  OFFSET  m
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目

SELECT * FROM `result` LIMIT 5       #返回前5条记录
SELECT * FROM `result` LIMIT 5,10   #返回6-15条记录

(十三)GROUP BY 分组

语法:
SELECT  列名1,列名2 FROM  表名  [ WHERE  条件 ] `[ GROUP BY …]`; 

 注意:

 对所有的数据进行分组统计

分组的依据字段可以有多个,并依次分组

与HAVING结合使用,进行分组后的数据筛选

 

group by 声明放在from …where 条件后面,

order by…limit 条件前面,group by后面跟having

(十四)HAVING 筛选

having 通常与group by 配合使用也是一种筛选条件,放在group by 之后。与where条件相似但是使用场景不同 分组之后的数据再次筛选需要用having

SELECT job_id ,MIN(salary)
FROM employees
GROUP BY job_id
HAVING MIN(salary) >= 6000 #对分组后的数据再次进行条件筛选

二、连接查询

如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

分类:

内连接(inner join):等值和非等值的连接查询;自身连接查询

外连接(out join):左连接(left join);右连接(right join)

连接对比:

操作符名称描述
INNER JOIN ( JOIN )如果表中有至少一个匹配,则返回行
LEFT JOIN不论右表是否有匹配,都会返回左表的所有行
RIGHT JOIN不论左表是否有匹配,都会返回右表的所有行

三、内连接

   内连接(Inner Join)查询返回两个表中满足连接条件的数据。内连接使用关键字 INNER JOIN 表示,也可以简写成 JOIN。内连接的原理如下图所示(连接条件为两个表的 id 相等)

(一)等值和非 等值连接

与单表查询类似,都是SELECT语句

把多个表放到FROM后,并用逗号隔开

可使用AS关键字取别名,便于引用

如无重名查询字段则可省略数据表的指定

      1、等值连接

连接查询中的 ON 子句与 WHERE 子句类似,可以支持各种条件运算符。其中最常用的是等号(=)运算符,这种连接查询也被称为等值连接

等值连接返回两个表中连接字段值相等的数据,我们最常使用的连接就是等值连接

#等值查询
SELECT  SubjectName, GradeName  FROM  subject,  grade 
WHERE  subject.GradeID = grade.GradeID; 

        2、非等值连接

除等号运算符外,连接条件中也可以使用其他比较运算符或者逻辑运算符,例如>=、!=、BETWEEN、AND 等,这种连接查询被称为非等值连接。

#非等值连接查询
SELECT  SubjectName, GradeName  FROM  subject,  grade;

(二)自连接

自连接(Self Join)查询是指一个表和它自己进行连接查询。自连接本质上并没有什么特殊之处,主要用于处理那些对自身进行了外键引用的表。

#员工表中的经理字段(manager)引用了员工表自身的编号字段(emp_id)。如果我们想要查看员工以及他的经理,可以通过自连接查询实现
SELECT e.emp_name AS "员工姓名",
 m.emp_name AS "经理姓名"
FROM employee e
LEFT JOIN employee m ON (m.emp_id = e.manager)
WHERE e.emp_id = 9;


#查询所有学生的姓名和成绩
#1、内连接 INNER JOIN
SELECT student.Sname,score.Degree FROM student INNER JOIN score  ON student.Sno = score.Sno;

四、外连接

(一)左连接

左外连接(Left Outer Join)查询首先返回左表中的全部数据。之后,如果右表中存在满足连接条件的数据,就返回该数据;如果没有相应的数据,就返回空值。左外连接使用关键字 LEFT OUTER JOIN 表示,也可以简写成 LEFT JOIN。

#查询所有学生的姓名和成绩
#左连接 LEFT JOIN	以左表为主表,显示主表的所有内容
SELECT student.Sname,score.Degree FROM student LEFT  JOIN score  ON student.Sno = score.Sno

 

(二)右连接

右外连接(Right Outer Join)查询首先返回右表中的全部数据。如果左表中存在满足连接条件的数据,就返回该数据;如果没有相应的数据,就返回空值。右外连接使用关键字 RIGHT OUTER JOIN 表示,也可以简写成 RIGHT JOIN。

#查询所有学生的姓名和成绩
#右连接 RIGHT JOIN	以右表为主表,显示主表的所有内容
SELECT student.Sname,score.Degree FROM student RIGHT JOIN score  ON student.Sno = score.Sno;

 

五、自然连接

如果连接查询同时满足以下条件,我们可以使用 USING 替代 ON 来简化连接条件的输入:

  • 连接条件是等值连接。

  • 两个表中的连接字段名称相同,类型也相同。

#从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,
CREATE TABLE IF NOT EXISTS category(
     categoryId int(10)  auto_increment  primary key,
     categoryName   varchar(32) not null ,
     pid  int(10)
);

六、子查询

  • 子查询的使用大大增强了select查询的能力

子查询在主查询之前一次执行完成

子查询的结果被主查询使用

在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句
在返回列中嵌套一个查询

#3.查询没学过"张三"老师授课的同学的信息
SELECT stu.* FROM student as stu #返回没有选该课程学生的信息
WHERE stu.s_id not in (#查找选修过该课程号的学生学号
	SELECT sco.s_id FROM score as sco 
	WHERE c_id = ( #查找教师名为“张三”带的课程号
		SELECT cou.c_id FROM teacher as tea 
		LEFT JOIN course as cou ON tea.t_id = cou.t_id
		WHERE tea.t_name = "张三")
	);
	
#编写技巧:从里往外写,从外往里写

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值