1.DQL语言
- 查询数据库数据,如SELECT语句
- 简单的单表查询或多表的复杂查询和嵌套查询
- 数据库语言中最核心、最重要的语句
- 使用频率最高的语句
2.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}] ; #指定查询的记录从哪条至哪条
3.指定查询字段
查询表中所有的数据列结果,采用“*”符号:
select * from student;
可指定查询的结果数据列:
- 如只查询student表中的学号、姓名、电话
SELECT StudentNo, StudentName, Phone FROM student;
如区分连接查询时两个表有同名的字段:
SELECT student.StudentNo , StudentName, StudentResult
FROM student , result ;
4.AS子句
AS子句作用:
- 可给数据列取一个新别名
- 可给表取一个新别名
- 可把经计算或总结的结果用另外一个新名称来代替
AS子句用法:
SELECT StudentNo AS “学号” FROM student;
SELECT a.StudentNo FROM student AS a;
SELECT Phone+1 AS Tel FROM student;
- AS 也可省略不写
5.DISTINCT关键字的使用
DISTINCT的作用:
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
DISTINCT的用法:
SELECT DISTINCT 字段名1, 字段名2... FROM 表名 ;
- ALL 关键字是默认的,返回所有的记录,与之相反
6.使用表达式的列
表达式一般由文本值、列值、NULL、函数和操作符等组成。
应用场景:
- SELECT语句返回结果列中使用
- SELECT语句的ORDER BY、HAVING等子句中使用
- DML语句中的where条件语句中使用表达式
7.where条件语句
- 用于检索数据表中符合条件的记录
- 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
- 搜索条件的组成:逻辑操作符&比较操作符
8.逻辑操作符
操作符名称 | 语法 | 描述 |
AND或&& | a AND b 或 a && b | 逻辑与,同时为真,结果才为真 |
OR或|| | a OR b 或 a||b | 逻辑或,只要一个为真,则结果为真 |
NOT或! | NOT a 或 !a | 逻辑非,若操作数为假,结果则为真 |
9.比较操作符
操作符名称 | 语法 | 描述 |
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…中的某一个,则结果为真 |
10.BETWEEN AND范围查询
根据一个范围值来检索:
SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
等同于 >= 和 <= 联合使用:
SELECT * FROM subject WHERE ClassHour BETWEEN 110 AND 120;
SELECT * FROM subject WHERE ClassHour >= 110 AND ClassHour <=120;
11.LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询
- 与“%”一起使用,表示匹配0或任意多个字符
- 与“_”一起使用,表示匹配单个字符
#查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE "李__";
12.使用IN进行范围查询
在WHERE子句中使用IN进行范围查询
- 查询的字段x的值,至少与括号中的一个值相同
- 多个值之间用英文逗号隔开
SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…)
13.NULL空值条件查询
- NULL代表“无值”
- 区别于零值0和空符串“”
- 只能出现在定义允许为NULL的字段
- 须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
14.连接查询(多表查询)
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
分类包括:
内连接 ( inner join):
- 等值和非等值的连接查询
- 自身连接查询
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关键字取别名,便于引用
- 如无重名查询字段则可省略数据表的指定
外连接 (out join):
左连接(LEFT JOIN):
- 从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行
SELECT 字段1,字段2,… FROM table_1
LEFT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;
右连接 ( RIGHT JOIN):
- 从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
SELECT 字段1,字段2,… FROM table_1
RIGHT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;
自连接查询:
从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,表结构如下:
CREATE TABLE IF NOT EXISTS category(
categoryId int(10) auto_increment primary key,
categoryName varchar(32) not null ,
pid int(10)
);
15.ORDER BY排序
- 对SELECT语句查询得到的结果,按某些字段进行排序
- 与DESC或ASC搭配使用,默认为ASC
16.MySQL的LIMIT
LIMIT [m,]n 或 LIMIT n OFFSET m
- 限制SELECT返回结果的行数
- m 制定第一个返回记录行的偏移量
- n 制定返回记录行的最大数目
17.MySQL函数
统计函数:
函数名称 | 描述 |
COUNT( ) | 返回满足SELECT条件的记录总和数,如 SELECT COUNT(*)… |
SUM( ) | 返回数字字段或表达式列作统计,返回一列的总和 |
AVG( ) | 通常为数值字段或表达列作统计,返回一列的平均值 |
MAX( ) | 可以为数值字段、字符字段或表达式列作统计,返回最大的值 |
MIN( ) | 可以为数值字段、字符字段或表达式列作统计,返回最小的值 |
18.GROUP BY分组
使用GROUP BY关键字对查询结果分组
- 对所有的数据进行分组统计
- 分组的依据字段可以有多个,并依次分组
- 与HAVING结合使用,进行分组后的数据筛选