使用DQL命令查询数据(一)
DQL语言
DQL(Data Query Language,数据查询语言)
查询数据库数据,如SELECT语句
简单的单表查询或多表的复杂查询和嵌套查询
数据库语言中最核心、最重要的语句
使用频率最高的语句
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 }] ; #指定查询的记录从哪条至哪条
[] 括号代表可选的;
{} 括号代表必须的;
井号 MySQL语句中的注释符,也可以用 /* 该处为注释 */
@where条件语句:
[ 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…中的某一个,则结果为真 |
注意:1、数值数据类型的记录之间才能进行算术运算
2、相同数据类型的数据之间才能进行比较
-
(1)BETWEEN AND范围查询
- 根据一个范围值来检索
SELECT 字段列1, 字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
- 等同于 >=和 <= 联合使用
#查询课程表中课时在110和120之间的所有记录 SELECT * FROM subject WHERE ClassHour BETWEEN 110 AND 120; 等同于: SELECT * FROM subject WHERE ClassHour >= 110 AND ClassHour <=120;
-
(2)LIK模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询
-
与“%”一起使用,表示匹配0或任意多个字符
-
与“_”一起使用,表示匹配单个字符
#查询包含“数学”的所有课程 SELECT * FROM subject WHERE SubjectName LIKE "%数学%"; #查询所有姓名为“李某某”三个字的学生信息 SELECT StudentNo,StudentName FROM student WHERE StudentName LIKE "李__";
-
-
(3)使用IN进行范围查询
在WHERE子句中使用IN进行范围查询
SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3… )
- 查询的字段x的值,至少与括号中的一个值相同
- 多个值之间用英文逗号隔开
#普通处理方式 SELECT * FROM subject where ClassHour = 100 OR ClassHour =110 OR ClassHour = 120; #使用IN进行查询方式,更为简洁,效率更高 SELECT * FROM subject where ClassHour IN ( 100, 110, 120 );
-
(4)NULL空值条件查询
NULL
- NULL代表“无值”
- 区别于零值0和空符串“”
- 只能出现在定义允许为NULL的字段
- 须使用 IS NULL 或者 IS NOT NULL 比较操作符去比较
@连接查询(多表查询):
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
分类包括:
-
内连接 ( inner join)
1.等值和非等值的连接查询
2.自身连接查询
-
外连接 ( out join )
3.左连接(LEFT JOIN)
4.右连接 ( RIGHT JOIN)
1.内连接查询:
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中没有匹配,则不返回;
*/
示例: 要求:从subject和grade数据表查询课程名称和所属年级名称
SELECT SubjectName,GradeName FROM subject INNER JOIN grade ON subject.GradeID= grade.GradeID;
2.等值和非等值的连接查询:
-
与单表查询类似,都是SELECT语句
-
把多个表放到FROM后,并用逗号隔开
-
可使用AS关键字取别名,便于引用
-
如无重名查询字段则可省略数据表的指定
示例: 从subject和grade数据表查询课程名称和所属年级名称
#非等值连接查询
SELECT SubjectName, GradeName FROM subject, grade; /*返回记录数为两表记录数的乘积*/
#等值查询
SELECT SubjectName, GradeName FROM subject, grade
WHERE subject.GradeID = grade.GradeID; /*等效于内连接*/
3.自连接查询
数据表与自身进行连接:从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,表结构如下:
#表结构语句
CREATE TABLE IF NOT EXISTS category(
categoryId int(10) auto_increment primary key,
categoryName varchar(32) not null ,
pid int(10)
);
SELECT c1.categoryName AS "父栏目名称", c2.categoryName AS "子栏目名称"
FROM category AS c1,category AS c2
WHERE c1.categoryId = c2.pid;
SELECT c1.categoryName AS "父栏目名称", c2.categoryName AS "子栏目名称"
FROM category AS c1 LEFT JOIN category AS c2
ON c1.categoryId = c2.pid WHERE c1.pid = 1;
4.外连接
-
左外连接(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;
5.不同的SQL JOIN对比
操作符名称 | 描述 |
---|---|
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
指定查询字段
- 查询表中所有的数据列结果,采用 “ * ” 符号
SELECT * from 表名
-
可指定查询的结果数据列
-
如只查询student表中的学号、姓名、电话:
SELECT StudentNo, StudentName, Phone FROM student;
-
如区分连接查询时两个表有同名的字段:
SELECT student.StudentNo, StudentName FROM student, result; /*student.StudentNo指定该字段属于哪个类*/
-
AS子句
AS子句作用:
-
可给数据列取一个新别名
-
可给表取一个新别名
-
可把经计算或总结的结果用另外一个新名称来代替
**AS子句用法:**as可省略
SELECT StudentNo AS "学号" FROM student;
SELECT a.StudentNo FROM student AS a;
SELECT Phone+1 AS Tel FROM student;
DISTINCT关键字的使用
作用:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条。
ALL 关键字是默认的,返回所有的记录,与之相反。
SELECT DISTINCT 字段名1, 字段名2... FROM 表名
示例:查询成绩表中的所包含的课程ID
SELECT DISTINCT SubjectNo FROM result
使用表达式的列
-
表达式一般由文本值、列值、NULL、函数和操作符等组成
-
应用场景
-
SELECT语句返回结果列中使用
-
SELECT语句的ORDER BY、HAVING等子句中使用
-
DML语句中的where条件语句中使用表达式
-
在SQL语句中使用表达式:
-
返回的列中使用
#给返回结果中的课时都加10个课时 SELECT version() , 100*3 #返回MySQL版本和计算结果 SELECT SubjectName "课程名称", ClassHour+10 AS "新学时" FROM subject;
-
避免SQL返回结果中包含“ . ”,“ * ” 和括号等干扰开发语言程序,如
SELECT version() as MySQL_V , 123.44*100 AS EXPRESSION; #返回结果不会与后台开发程序发生混淆