导入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`; ```