导入MySchool数据库脚本(myschool _db_bakup.sql)
了解表之间的业务逻辑关系
一:DQL
DQL(Data Query Language 数据查询语言)
查询数据库数据,如SELECT语句
简单的单表查询或多表的复杂查询和嵌套查询
数据库语言中最核心,最重要的语句
使用频率最高的语句
语法:
sql
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语句中的注释符,也可以用 /该处为注释/
1)指定查询字段
查询表结果时,可指定查询结果的数据列
查询表中所有的数据列结果,采用"*"符号;(效率低,不推荐)
sql
SQL:SELECT * FROM `student`;
可指定查询的结果数据列;
如只查询student表中的学号、姓名、电话
sql
SQL:SELECT StudentNo,StudentName,Phone FROM `student`;
笛卡尔乘积:(面试问题)
sql
SELECT * FROM a,b;(没有给定条件,查询结果是a*b的集合,且无意义)
如区分连接查询时两个表有同名的字段名,那么可以使用(表名.)这种方式
2)AS子句作为别名
AS子句作用
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
AS子句的用法
sql
SELECT StudentNo AS '学号' FROM `student`;
SELECT s.`StudentName` FROM `student` AS s;
SELECT Phone+1 AS Tel FROM `student`;
SELECT VERSION() AS 'MySQL版本';
注意:
AS 也可省略不写
3)DISTINCT关键字的使用
DISTINCT关键字
作用:
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同)只返回一条
语法:
sql
SELECT DISTINCT 字段名1, 字段名2... FROM 表名
注意:
ALL 关键字是默认的,返回所有的记录,与DISTINCT相反
sql
SELECT ALL * FROM student;
需求:查询成绩表中的所包含的课程ID
sql
SQL:SELECT DISTINCT subjectNo FROM `result`;
4)使用表达式的列
数据库中的表达式
表达式一般由文本值、列值、NULL、函数和操作符等组成
应用场景:
SELECT语句返回结果列中使用
SELECT语句的ORDER BY、HAVING等子句中使用
DML语句中的where条件语句中使用表达式
在SQL语句中使用表达式
返回的列中使用,如:
sql
SELECT VERSION(),100*3;
SELECT VERSION() AS MySQL_V, 123.44*100 AS EXPRESSION;
需求:给课程表中的课时都加10个课时
sql
SQL:SELECT ClassHour+10 AS ClassHour FROM `subject`;
二:where条件语句
1)需求:返回字段名称使用别称,返回课程名称(SujectName)总课时(SubjectHour),返回10天上完课程的均课时(ClassHour/10)
sql
SQL:SELECT su.`SubjectName` AS '课程名称',ClassHour AS '总课时',ClassHour/10 AS '均课时/天' FROM `subject` AS su;
where条件语句
用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成
逻辑操作符
操作符 描述
AND && 逻辑与,同时为真,结果为真
OR || 逻辑或,只要一个为真,结果为真
XOR ^ 逻辑异或,不同为真,相同为假
NOT ! 逻辑非,若操作符为假,结果为真
比较操作符
操作符 描述
IS NULL 若操作符为NULL,结果为真
IS NOT NULL 若操作符不为NULL,结果为真
BETWEEN a BETWEEN b AND c,若a在b,c之间,结果为真(闭区间)
LIKE a LIKE b,若a匹配b,结果为真
IN a IN (a1,a2,a3),若a在a1,a2,a3,中的某一个值,结果为真
2)需求:查询在80-90分之间的所有成绩记录
sql
SQL:SELECT * FROM `result` WHERE StudentResult BETWEEN 80 AND 90;
等同于 >=和<= 联合使用
sql
SELECT * FROM `result` WHERE StudentResult>=80 AND StudentResult<=90;
3)需求:查找地址不为空的学生信息
sql
SQL:SELECT * FROM `student` WHERE Address IS NOT NULL;
4)需求:查询课时是100,110,120的课程
sql
SQL:SELECT * FROM `subject` WHERE ClassHour=100 OR ClassHour=110 OR ClassHour=120;
使用IN关键字
sql
SELECT * FROM `subject` WHERE ClassHour IN(100,110,120);
#使用IN进行查询方式,更为简洁,效率更高
LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询
与"%"一起使用,表示匹配0或任意多个字符
与"_"一起使用,表示匹配单个字符
5)需求:查询包含"数学"的所有课程
sql
SQL:SELECT * FROM `subject` WHERE SubjectName LIKE '%数学%'
6)需求:查询包含"文"的所有学生
sql
SQL:SELECT * FROM student WHERE StudentName LIKE '%文%'
7)需求:查询所有姓名为"李**"三个字的学生信息
sql
SQL:SELECT * FROM student WHERE StudentName LIKE '李__'
8)需求:将欧阳峻峰改名为"欧阳%峻峰"
sql
SQL:UPDATE Student SET StudentName='欧阳%峻峰' WHERE StudentNo=1007;
需求:查询包含"%"的学生
sql
SQL:SELECT * FROM Student WHERE StudentName LIKE '%1%%' ESCAPE '1';
SQL:SELECT * FROM Student WHERE StudentName LIKE '%:%%' ESCAPE ':';
9)查询所有姓"李"的学生所有成绩
sql
SQL:
SELECT
s.`StudentNo`,
s.`StudentName`,
r.`StudentResult`
FROM
Student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
WHERE s.`StudentName` LIKE '李%' ;
三:连接查询(多表查询)
定义:如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
分类包括:
内连接(inner join)
等值和非等值的连接查询
自身连接查询
外连接(out join )
左连接(LEFT JOIN)
右连接(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数据表查询课程名称和所属年级名称
#内连接
sql
SELECT
su.`SubjectName`,
gr.`GradeName`
FROM
`subject` su
INNER JOIN `grade` gr
ON su.`GradeID` = gr.`GradeID`
等值和非等值的连接查询
与单表查询类似,都是SELECT语句
把多个表放到FROM后,并用逗号隔开
可使用AS关键字取别名,便于引用
如无重名查询字段则可省略数据表的指定
需求:从subject和grade数据表查询课程名称和所属年级名称
#等值连接
sql
SELECT
su.`SubjectName`,
gr.`GradeName`
FROM
`subject` su,
`grade` gr
WHERE su.`GradeID` = gr.`GradeID` ;
#非等值连接查询(无意义)
sql
SELECT
SubjectName,
GradeName
FROM
SUBJECT,
grade ;
需求:查看学生姓名为郭靖的成绩,学科名称及其年级
sql
SELECT
s.`StudentName`,
r.`StudentResult`,
su.`SubjectName`,
g.`GradeName`
FROM
`student` s
INNER JOIN `result` r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` su
ON r.`SubjectNo` = su.`SubjectNo`
INNER JOIN `grade` g
ON su.`GradeID` = g.`GradeID`
WHERE s.`StudentName` LIKE '郭靖' #不写%相当于=
2)左外连接(LEFT JOIN)
从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行
SELECT 字段1,字段2,... FROM table_1
LEFT OUTER JOIN table_2 ON table_1.字段x=table_2.字段y;
需求:查询所有学生及其成绩(如果学生未参加考试,仍然需要显示学生)
#左外连接
sql
SELECT
s.`StudentName`,
r.`StudentResult`
FROM
`student` s
LEFT JOIN `result` r
ON s.`StudentNo` = r.`StudentNo`
3)右外连接(RIGHT JOIN)
从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
SELECT 字段1,字段2,... FROM table_1
RIGHT OUTER JOIN table_2 ON table_1.字段x=table_2.字段y;
需求:查询所有学生的年级(没有学生的年级,仍然需要显示)
#右外连接
sql
SELECT
s.`StudentName`,
g.`GradeName`
FROM
`student` s
RIGHT JOIN `grade` g
ON s.`GradeId` = g.`GradeID` ;
JOIN对比
INNER JOIN(JOIN)如果表中有至少一个匹配,则返回行
LEFT JOIN即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN即使左表中没有匹配,也从右表中返回所有的行
4)自身连接查询
数据表与自身进行连接
需求:从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称
//创建表
sql
CREATE TABLE IF NOT EXISTS category (
categoryId INT (10) AUTO_INCREMENT PRIMARY KEY,
categoryName VARCHAR (32) NOT NULL,
pid INT (10)
) ;
//插入数据(自连接的数据有规律)
sql
INSERT INTO category (categoryId, pid, categoryName)
VALUES
(2, 1, "美术设计"),
(3, 1, "软件开发"),
(4, 3, "数据库基础"),
(5, 2, "Photoshop基础"),
(6, 2, "色彩搭配学"),
(7, 3, "PHP基础"),
(8, 3, "一起学JAVA") ;
//自连接查询
sql
SELECT
c1.`categoryName` AS '父项目名称',
c2.`categoryName` '子项目名称'
FROM
category c1
INNER JOIN category c2
ON c1.`categoryId` = c2.`pid` ;
#order by c1.`categoryName`;