[关闭]
@wangyupu 2020-07-14T10:45:41.000000Z 字数 5604 阅读 19

数据库mysql第三章DQL命令查询select语句

mysql


DQL语言

  1. DQL(Data Query Language,数据查询语言)
  2. 查询数据库数据,如SELECT语句
  3. 简单的单表查询或多表的复杂查询和嵌套查询
  4. 数据库语言中最核心、最重要的语句
  5. 使用频率最高的语句

SELECT语法

  1. SELECT [ALL | DISTINCT]
  2. { *| table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2][, ·····]}
  3. FROM table_ name [ as table_ alias]
  4. [ left|out|inner jointable_ name2] #联合 查询
  5. [ WHERE ..]#指定结果需满足的条件
  6. [ GROUP BY ..]#指定结果按照哪几个字段来分组
  7. [ HAVING ..]#过滤分组的记录必须满足的次要条件
  8. [ ORDER BY...]#指定查询记录按-一个或者多个条件排序
  9. [ LIMIT { [ offset,] row_ count| row_ count OFFSET offset }] ;#指定查询的记录从哪条至哪条
  10. []括号代表可选的:
  11. {}括号代表必须的;
  12. # MySQL语句中的注释符,也可以用/*该处为注释*/

where条件语句

  1. 用于检索数据表中符合条件的记录
  2. 搜索条件可由一个或多个逻辑表达式组成,结果- -般
  3. 为真或假
  4. 搜索条件的组成
  5. 逻辑操作符
  6. 比较操作符

逻辑操作符

操作符名称 语法 描述
AND或&& aANDb或a&&b 逻辑与,同时为真,结果才为真
NOT或! NOTa或!a 逻辑非,若操作数为假,结果则为真
OR aORb或allb* 逻辑或,只要个为真,则结果为真

比较操作符

操作符名称 语法 描述
IS NULL a IS NULL 若操作符为NULL,则结果为真
IS NOT NUL La IS NOT NULL 若操作符不为NULL,则结果为真
BETWEENa BETWEEN b ANDC 若a范围在b与c之间则结果为真
LIKE a LIKE b SQL模式匹配,若a匹配b,则结果为真
IN a IN (a1,a2,a3...) 若a等于a1, ...中的某一个,则结果为真

BETWEEN AND范围查询

  1. 根据一个范围值来检索
  2. SELECT 字段列1,字段2 ..FROM 表名WHERE 字段x
  3. BETWEEN1 AND2
  4. 等同于>=和<=联合使用

查询课程表中课时在110和120之间的所有记录

  1. SELECT * FROM subject WHERE ClassHour BETWEEN 110 AND 120;
  2. 等同于:
  3. SELECT * FROM subject WHERE ClassHour >= 110 AND ClassHour <=120;

LIKE模糊查询.

  1. WHERE子句中,使用LIKE关键字进行模糊查询
  2. 与“%”一起使用,表示匹配0或任意多个字符
  3. 与“_”起使用,表示匹配单个字符

示列

查询包含“数学”的所有课程

  1. SELECT * FROM subject WHERE SubjectName LIKE "%数学%";

查询所有姓名为“李**”三个字的学生信息

  1. SELECT StudentNo,StudentName FROM student
  2. WHERE StudentName LIKE "李_ ";
  3. 使用IN进行范围查询
  4. WHERE子句中使用IN进行范围查询
  5. SELECT字段列1,字段2 ..FROM表名WHERE 字段x IN (值1,值2,值3...)
  6. 查询的字段x的值,至少与括号中的一个值相同
  7. 多个值之间用英文逗号隔开
  8. SELECT * FROM subject where
  9. ClassHour= 100 OR
  10. ClassHour =110 OR ClassHour = 120; #普通处理方式
  11. SELECT * FROM subject where ClassHour IN ( 100, 110,120 );

使用IN进行查询方式,更为简洁,效率更高

NULL空值条件查询

  1. NULL
  2. NULL代表"无值”
  3. 区别于零值0和空符串
  4. 只能出现在定义允许为NULL的字段
  5. 须使用IS NULL或IS NOT NULL比较操作符去比较

连接查询(多表查询)

  1. 连接查询
  2. 如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
  3. 分类包括
  4. ●内连接( inner join)
  5. 等值和非等值的连接查询
  6. 自身连接查询
  7. 外连接( out join )
  8. 左连接(LEFT JOIN)
  9. 右连接(RIGHT JOIN)

哪些学生考试了

  1. select distinct
  2. r.StudentNo,r.ExamDate
  3. from result r ;

查询成绩低于60分 返回结果 +10分

  1. select a.StudentNo,a.StudentResult+10
  2. from result a
  3. where a.StudentResult<60;
  4. select * from grade a
  5. where a.GradeName is not null
  6. and a.GradeName != '';

查询mysql版本

  1. select VERSION();

查考试成绩60-80分的信息

WHERE 字段 BETWEEN 值1 AND 值2

  1. select * from result r where r.StudentResult
  2. BETWEEN 60 and 80;
  3. SELECT * FROM result r where r.ExamDate
  4. BETWEEN '2012-11-10' and '2013-11-11';

查询姓张的学生

  1. select * from student s where
  2. s.StudentName like '张_';

查询年级ID 为 1 2 3的所有学生信息

  1. select * from student s where
  2. s.GradeId in(1,2,3);

内连接查询2-1

  1. ##INNER JOIN内连接
  2. 在表中至少一个匹配时, 则返回记录
  3. SELECT字段1,字段2... FROM table_ 1
  4. INNER JOIN table. 2 ON table_ 1.字段x = table_ 2.字段y;

INNER JOIN与JOIN是相同的;

如table. 1中的行在table_ 2中没有匹配,则不返回;

要求:从subject和grade 数据表查询课程名称和所属年级名称

  1. SELECT SubiectName,GradeName FROM subject INNER JOIN grade
  2. ON subiect.GradelD= grade.GradelD;

内连接查询2-2

  1. 等值和非等值的连接查询
  2. 与单表查询类似,都是SELECT语句
  3. 把多个表放到FROM后,并用逗号隔开
  4. 可使用AS关键字取别名,便于引用
  5. 如无重名查询字段则可省略数据表的指定

要求:从subject和grade数据表查询课程名称和所属年级名称

非等值连接查询

  1. SELECT SubjectName, GradeName FROM subject, grade,(返回记录数为两表记录数的乘积

等值查询

  1. SELECT SubjectName, GradeName FROM subject, grade
  2. 等效于内连接WHERE subject.GradelD = grade.GradeID;
  3. 外连接
  4. 左外连接(LEFT JOIN)
  5. 从左表(table_ 1)中返回所有的记录,即便在右(table_ _2)中没有匹配的行
  6. SELECT字段1,字段2... FROM table_ 1
  7. LEFT [ OUTER] JOIN table_ 2 ON table_ 1.字段x = table_ 2.字段y;
  8. 右外连接(RIGHT JOIN)
  9. 从右表(table_ _2) 中返回所有的记录,即便在左(table_ 1)中没有匹配的行
  10. SELECT 字段1,字段2... FROM table_ 1
  11. RIGHT [ OUTER] JOIN table_ 2 ON table_ 1.字段x = table_ 2.字段y;

王老师讲课实录

  1. select a.*,t1.*
  2. from result a
  3. LEFT JOIN (
  4. select b.StudentNo,
  5. b.StudentName,
  6. c.GradeName from student b
  7. LEFT JOIN grade c
  8. on b.GradeId = c.GradeID
  9. ) t1
  10. on a.StudentNo = t1.StudentNo
  11. select now()

一张表包含学生姓名,年级名称

不同的SQL JOIN对比

JOIN对比

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

自连接查询

数据表与自身进行连接

  1. 从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,表结构如下:
  2. #表结构语句
  3. CREATE TABLE IF NOT EXISTS category(
  4. categoryld int(10) auto_ increment primary key,
  5. categoryName varchar(32) not null
  6. pid int(10)
  7. );

ORDER BY排序

  1. ORDER BY排序查询
  2. SELECT语句查询得到的结果,按某些字段进行排序
  3. DESCASC搭配使用,默认为ASC

MySQL的LIMIT

  1. LIMIT[m,]nLIMIT n OFFSET m
  2. 限制SELECT返回结果的行数
  3. m制定第一个返回记录行的偏移量
  4. n制定返回记录行的最大数目
  5. m不指定则偏移量为0,从第一条开始返回前n条记录
  6. LIMIT常用于分页显示
  7. 示例
  8. SELECT * FROM `result` LIMIT 5 #返回前5条记录
  9. SELECT * FROM `result` LIMIT 5,10 #返回6-15条记录
  10. 可以做分页查询
  11. 查询所有《数据库结构-2》的考试成绩,并按照由高
  12. 到低显示,同时把该成绩对应的学生的学号、姓名打
  13. 印出来

查询所有成绩 成绩降序排序

  1. select * from result r
  2. order by r.StudentResult desc;

查询所有参加高等数学01考试的学生成绩

成绩降序排序

  1. select b.StudentName,c.SubjectName,
  2. a.StudentResult,a.ExamDate
  3. from result a LEFT JOIN student b
  4. on a.StudentNo = b.StudentNo LEFT JOIN
  5. `subject` c on a.SubjectNo=c.SubjectNo
  6. where c.SubjectName = '高等数学-1'
  7. ORDER BY a.StudentResult desc,a.ExamDate desc
  8. limit 10;

统计记录数

  1. select count(1)
  2. from student a;

统计所有考试成绩和

  1. select a.SubjectNo,avg(a.StudentResult) r
  2. from result a GROUP BY
  3. a.SubjectNo HAVING avg(a.StudentResult)>80;

每个年级的人数

  1. select @xh:=@xh+1 rownumber,t1.* from (
  2. select b.GradeName ,count(1) as rs
  3. from student a left JOIN grade b
  4. on a.GradeId = b.GradeID
  5. where b.GradeName in(
  6. '大一','大二','大三'
  7. )
  8. group by a.GradeId
  9. HAVING count(1)>0
  10. ORDER BY rs desc
  11. #LIMIT 1
  12. ) t1 ,(select @xh:=0) t2;

子查询

  1. 在查询语句中的WHERE条件子句中,又嵌套了另外-个查询语句
  2. 示例
  3. 查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名
  4. 注意
  5. 嵌套查询可由多个子查询组成,求解的方式是由里及外
  6. 子查询返回的结果一般都是集合,故而建议使用IN关键字

MySQL函数

  1. 数学函数
  2. 字符串函数
  3. 日期和时间函数
  4. 系统信息函数

MySQL的统计函数

函数名称 描述
COUNT( ) 返回满足SELECT条件的记录总和数,如SELECT COUNT(*)...
SUM( ) 返回数字字段或表达式列作统计,返回一-列的总和
AVG( ) 通常为数值字段或表达列作统计,返回一-列的平均值
MAX( ) 可以为数值字段、字符字段或表达式列作统计,返回最大的值
MIN( ) 可以为数值字段、字符字段或表达式列作统计,返回最小的值

GROUP BY分组

使用GROUP BY关键字对查询结果分组

  1. 对所有的数据进行分组统计
  2. 分组的依据字段可以有多个,并依次分组
  3. HAVING结合使用,进行分组后的数据筛选

查询2010年考试成绩

  1. select * from result a
  2. where
  3. DATE_FORMAT(a.ExamDate,'%Y') = 2010;

查询所有考试成绩,返回几天前考的试

相距多少天

  1. select datediff(now(), a.ExamDate) from result a;

日期比较

  1. select DATE_FORMAT(now(),'%Y%m%d%H%i%s');
  2. select DATE_FORMAT('2020-06-01','%Y%m%d%H%i%s') ;

时间累加或累减

  1. select date_add(now(), interval -3 hour);
  2. select date_add(now(), interval 3 hour);
  3. select IFNULL(name,0);
  4. select a.StudentNo,
  5. a.StudentName,IFNULL(b.SubjectNo,0) subno,
  6. SUM(b.StudentResult) 'ResultSum'
  7. from student a
  8. LEFT JOIN result b
  9. on a.StudentNo=b.StudentNo
  10. where a.Sex = 1
  11. GROUP BY a.StudentNo
  12. UNION ALL
  13. select c.StudentNo,
  14. c.StudentName,0 as subno,
  15. '' as 'ResultSum' from student c where c.Sex=2;
  16. select *,'1' as "人数" from grade where GradeName is not null
  17. UNION ALL
  18. select *,'' as "人数" from grade where GradeName is null;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注