MySQL查询一
DQL语言
SELECT语法
代码语言:javascript复制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 }] ;
查所有
代码语言:javascript复制select * from student
查指定的结果
代码语言:javascript复制SELECT StudentNo, StudentName, Phone FROM student;
SELECT student.StudentNo , StudentName, StudentResult
FROM student , result ;
AS子句
作用
可给数据列取一个新别名 可给表取一个新别名 可把经计算或总结的结果用另外一个新名称来代替
代码语言:javascript复制SELECT StudentNo AS “学号” FROM student;
SELECT a.StudentNo FROM student AS a;
SELECT Phone 1 AS Tel FROM student;
DISTINCT关键字
作用
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
代码语言:javascript复制SELECT DISTINCT 字段名1, 字段名2... FROM 表名
在SQL语句中使用表达式
代码语言:javascript复制SELECT version() , 100*3 #返回MySQL版本和计算结果
SELECT SubjectName “课程名称”, ClassHour 10 AS “新学时” FROM subject;
#给返回结果中的课时都加10个课时
where条件语句
用于检索数据表中符合条件的记录 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假 搜索条件的组成 逻辑操作符 比较操作符
逻辑操作符
操作符名称 | 语法 | 描述 |
---|---|---|
AND或&& | a AND b 或 a && b | 逻辑与,同时为真,结果才为真 |
OR或|| | a OR b 或 a||b | 逻辑或,只要一个为真,则结果为真 |
NOT或! | NOT a 或 !a | 逻辑非,若操作数为假,结果则为真 |
比较操作符
操作符名称 | 语法 | 描述 |
---|---|---|
IS NULL | a IS NULL | 若操作符为NULL,则结果为真 |
IS NOT NULL | a IS NOT NULL | 若操作符不为NULL,则结果为真 |
BETWEEN | a BETWEEN b AND c | 若a范围在b与c之间则结果为真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b,则结果为真 |
IN | a IN (a1,a2,a3,….) | 若a等于a1,a2…中的某一个,则结果为真 |
BETWEEN AND范围查询
代码语言:javascript复制SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询 与“%”一起使用,表示匹配0或任意多个字符 与“_”一起使用,表示匹配单个字符
代码语言:javascript复制#查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE "李__";
使用IN进行范围查询
代码语言:javascript复制SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…)
代码语言:javascript复制SELECT * FROM subject where ClassHour = 100 OR ClassHour =110 OR ClassHour = 120; #普通处理方式
SELECT * FROM subject where ClassHour IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高
连接查询
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询 分类包括 内连接 ( inner join) 等值和非等值的连接查询 自身连接查询 外连接 ( out join ) 左连接(LEFT JOIN) 右连接 ( RIGHT JOIN)
内连接查询
INNER JOIN内连接
在表中至少一个匹配时,则返回记录
代码语言:javascript复制SELECT 字段1,字段2,… FROM table_1
INNER JOIN table_2 ON table_1.字段x = table_2.字段y;
# INNER JOIN 与 JOIN 是相同的;
# 如table_1中的行在table_2中没有匹配,则不返回
等值和非等值的连接查询 与单表查询类似,都是SELECT语句 把多个表放到FROM后,并用逗号隔开 可使用AS关键字取别名,便于引用 如无重名查询字段则可省略数据表的指定
代码语言:javascript复制#要求:从subject和grade数据表查询课程名称和所属年级名称
#非等值连接查询
SELECT SubjectName, GradeName FROM subject, grade;
#等值查询
SELECT SubjectName, GradeName FROM subject, grade
WHERE subject.GradeID = grade.GradeID;
左外连接(LEFT JOIN)
从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行
代码语言:javascript复制SELECT 字段1,字段2,… FROM table_1
LEFT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;
右外连接(RIGHT JOIN)
从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
代码语言:javascript复制SELECT 字段1,字段2,… FROM table_1
RIGHT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;
三个join对比
操作符名称 | 描述 |
---|---|
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
自连接查询
自连接查询 自连接就是一个表和它自身进行连接,是多表连接的特殊情况。 在自连接查询中,要先在FROM字句中为表分别定义两个不同的别名, 然后使用这两个别名写出一个连接条件。
代码语言:javascript复制SELECT DISTINCT c1.CouNo 课程编号, c1.CouName 课程名称,
c1.Kind 课程类别, c1.DepartNo 系部编号
FROM Course c1 JOIN Course c2 ON c1.Kind=c2.Kind AND c1.DepartNo!=c2.DepartNo
ORDER BY c1.CouNo;
查询二
ORDER BY排序
对SELECT语句查询得到的结果,按某些字段进行排序 与DESC或ASC搭配使用,默认为ASC
LIMIT
公式 limit (curPage-1)*pageSize,pageSize
子查询
代码语言:javascript复制SELECT
s.StudentNo,StudentName
FROM student AS s
WHERE
studentNo
IN
(
SELECT
StudentNO
FROM
result
WHERE
SubjectNo = (SELECT SubjectNo FROM subject WHERE SubjectName = "高等数学-2")
AND
StudentResult >= 80
)
函数
函数名称 | 描述 |
---|---|
COUNT( ) | 返回满足SELECT条件的记录总和数,如 SELECT COUNT(*)… |
SUM( ) | 返回数字字段或表达式列作统计,返回一列的总和 |
AVG( ) | 通常为数值字段或表达列作统计,返回一列的平均值 |
MAX( ) | 可以为数值字段、字符字段或表达式列作统计,返回最大的值 |
MIN( ) | 可以为数值字段、字符字段或表达式列作统计,返回最小的值 |
GROUP BY分组
对所有的数据进行分组统计 分组的依据字段可以有多个,并依次分组 与HAVING结合使用,进行分组后的数据筛选
总结:
分析题目 1.分析题目 2.找出这个题目相关的表 3.找出这几个表之间的联系 4.分析顺序分析是不是要内连还是外连 5.看看查出来的结果跟你想象的是不是差不多 6.自己去做10条数据,看看结果是不是达到需求了
分析错误 如果你觉得结果出来了不满足你的预期一般有一下几种原因 0.内外连接使用是否恰当 1.外连顺序 2.多表连接的层级 3.分组把空值自动忽略 4.不要是自己骗自己,不要去函数凑数据