mysql基础篇四(多年前整理)

导入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`;
相关推荐
摇滚侠9 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
麦聪聊数据11 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
ApacheSeaTunnel11 小时前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步
shushangyun_11 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡11 小时前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧12 小时前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon12 小时前
SQL学习指南——视图
数据库·sql
活宝小娜12 小时前
mysql详细安装教程
数据库·mysql·adb
贤时间12 小时前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心12 小时前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle