MySQL [DQL query data (most important)]

DQL query data (most important)

4.1, DQL (Data Query Language: Data Query Language)

  • All query operations use it Select
  • It can do simple queries and complex queries
  • The core language and the most important statement in the database
  • Most frequently used statement

4.2. Specify query fields

-- 查询全部的学校 select 字段 from 表
SELECT * FROM student;

-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student

-- 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名
SELECT `StudentNo` AS 学号, `StudentName` AS 学生姓名 FROM student AS s

-- 函数 Concat(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student;

Syntax: select field...FROM table

Sometimes, column names are not so well-known, we alias AS field name as alias table name as alias

deduplication distinct

Function: Remove duplicate data in the result of select query, and only display one

-- 查询一下有哪些同学参加了考试,成绩
select * from result --查询全部的考试成绩
select `studentNo` from result --查询有哪些同学参加了考试
select distinct `StudentNo` from result --发现重复数据,去重

database column (expression)

select version() -- 查看系统版本
select 100*3-1 as 计算结果 -- 用来计算
select @@auto_increment_increment -- 查询自增的步长(变量)

-- 学员考试成绩+1分查看
select `StudentNo`,`StudentResult`+1 AS '提分后' from result

Select complete syntax

select [all | distinct]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
from table_name [as table_alias]

    [left | right | inner join table_name2] --联合查询
    [where ...] --指定结果需满足的条件
    [group by...] --指定结果按照哪几个字段来分组
    [having] --过滤分组的记录必须满足的次要条件
    [order by...] --指定查询记录按照一个或者多个条件排序
    [limit {[offset,]row_count | row_countOFFSET offset}];

    --指定查询的记录从哪条到哪条
注意:[]括号代表可选的,{}括号代表必选的

Summarize:

Expressions in databases: text values, columns, Null, functions, calculated expressions, system variables

4.3, where conditional clause

Role: Retrieve the eligible values ​​​​in the data

The search condition consists of one or more expressions, and the result is a Boolean value

Logical Operators

SELECT studentNo, `studentResult`FROM result
--查询考试成绩在95~100分之间
SELECT studentNo, `studentResult` FROM resultwHERE StudentResu7t>=95 AND studentResult<=100
-- and&&
SELECT studentno, `studentResult` FROMresultwHERE StudentResu7t>=95 && studentResult<=100
-- 模糊查询(区间)
SELECT studentNo, `studentResult` FROM resultwHERE StudentResult BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentNo,`studentResult` FROM resultwHERE studentNo!=1000;
-- !=not
SELECT studentNo, `studentResu1t`FROM resultwHERE NOT studentNo = 1000

Fuzzy Queries: Comparison Operators

--查询姓刘的同学
-- like结合%(代表0到任意个字符)_(一个字符)
SELECT `studentNo` , `studentName` FROM `student` wHERE StudentName LIKE '刘%'
--查询姓刘的同学,名字后面只有一个字的
SELECT studentNo , `studentName` FROM `student`wHERE StudentName LIKE '刘_'
--查询姓刘的同学,名字后面只有两个字的
SELECT `studentNo` , `studentName` FROM `student`

--查询名字中间有嘉字的同学%嘉%
SELECT `studentNo`, `studentName` FROM studentWHERE studentName LIKE'%嘉%'
--=a=== in(具体的一个或者多个值)=三三==--查询1001,1002,1003号学员
SELECT `studentNo , studentName FROMstudentwHERE studentNo IN (1001,1002,1003);
--查询在北京的学生
SELECT studentNo ` , `studentName` FROM`student wHERE `Address` IN('安徽','河南洛阳');

--查询地址为空的学生nu11 
SELECT  `studentNo` , `studentName`FROM student wHERE address=''oR address IS NULL
--查询有出生日期的同学―不为空
SELECT `studentNo` , `studentName` FROM student wHERE `BornDate` IS NOT NULyI
--查询没有有出生日期的同学为空 
SELECT `studentNo` , `studentName` FROM `student wHERE `BornDate` IS NULL

4.4. Joint table query

JOIN vs.

/*
连接查询
   如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接 inner join
   查询两个表中的结果集中的交集
外连接 outer join
   左外连接 left join
       (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
   右外连接 right join
       (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
       
等值连接和非等值连接

自连接
*/

-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;

/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno

-- 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno

-- 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno

-- 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno

-- 查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL

-- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno

self-connection (understanding)

Connect your own table with your own table, the core: just split a table into two identical tables

father

Subclass

Operation: Query the subclass relationship corresponding to the parent class

 

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
-- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.`categoryid`=b.`pid`

-- 查询学院所属的年级(学号,学生的姓名,年级名称)
SELECT studentno,studentname,`gradename`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid`=g.`gradeid`

-- 查询科目所属的年级(科目名称,年级名称)
SELECT `subjectname`,`gradename`
FROM `subject` sub
INNER JOIN `grade` g
ON sub.gradeid=g.`gradeid`

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'

 4.5. Pagination and sorting

/*============== 排序 ================
语法 : ORDER BY
   ORDER BY 语句用于根据指定的列对结果集进行排序。
   ORDER BY 语句默认按照ASC升序对记录进行排序。
   如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
   
*/

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
-- 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC

/*============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
好处 : (用户体验,网络传输,查询压力)

推导:
   第一页 : limit 0,5
   第二页 : limit 5,5
   第三页 : limit 10,5
   ......
   第N页 : limit (pageNo-1)*pageSzie,pageSzie
   [pageNo:页码,pageSize:单页面显示条数]
   
*/

-- 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

-- 查询 JAVA第一学年 课程成绩前10名并且分数大于80的学生信息(学号,姓名,课程名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

Syntax: limit(query starting subscript, pageSize)

4.6. Subqueries

where (this value is calculated)

Essence: Nest a subquery statement in the where statement

where(select * from)

/*============== 子查询 ================
什么是子查询?
   在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
   嵌套查询可由多个子查询组成,求解的方式是由里及外;
   子查询返回的结果一般都是集合,故而建议使用IN关键字;
*/

-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;

-- 方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

-- 查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
-- 方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80

-- 方法二:使用连接查询+子查询
-- 分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

-- 在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
   SELECT subjectno FROM `subject`
   WHERE subjectname = '高等数学-2'
)

-- 方法三:使用子查询
-- 分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
   SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
       SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
  )
)

Excerpt from Meeting the Crazy God [MySQL]

Guess you like

Origin blog.csdn.net/qq_48108092/article/details/123639945