SQL基础语句学习
目录
问题1:安装MySQL完成后,mysql server和workbench都没有安装。
SQL语句规范中符号的使用
符号的使用

![]()
这边插一下关于MySQL的安装的问题:
mysql的安装问题:
有一步execute需要按一下。
删除mysql的话,直接双击安装包,选择里面的remove卸载。
回顾一下之前我们学习到的关键词有:
SELECT 列名|表达式 AS 列别名
FROM 表名
WHERE 条件 BETWEEN AND
在开始学习之前我们先准备好三张表,表结构如下:
student表

course表
sc表 
sc表

需要大家插入的数据如下:
student表的数据:

course表的数据:

sc表的数据:

SELECT语句讲解
绕来绕去又绕回来SELECT了,让我们开始今天主要的课程内容8,注意我们的数据默认是使用上面创建好的数据库的表和数据内容(没有完成的同学可以先创建完上面的表和数据):
3.1 WHERE 关键字补充:
1. 运算符< ,>, =
WHERE这个关键字在python中有点像if的意思,都是用来做筛选的,第一个补充的用法是比较符号:> < = ,这些比较符号可以与WHERE一起使用,来构成条件语句。
如:查询出学分不再2-3之间的课程的课程名称,学分和开课:
SELECT cname, credit, semester FROM course
WHERE credit < 2 OR credit >3;
(Q1:尝试用关键字 BETWEEN AND 完成上面的语句)

2. IN ,NOT IN
WHERE 还可以与 IN|NOT IN使用,IN可以用于查找属性值在指定集合范围内的元组,NOT IN的含义正好与IN相反。
如:查询计算机系和机电系学生的学号、姓名和所在系:
SELECT sno, sname, sdept
FROM student
WHERE sdept IN ('计算机系', '机电系');

(Q2:尝试用NOT IN关键字查询不在“计算机系”和“机电系”的学生的学号,姓名和所在系)
3. 字符串匹配关键字LIKE
字符串匹配LIKE,LIKE运算符用于查找指定列中与匹配字符串常量匹配的元组,使用NOT LIKE表示查找没有包含该字符串的属性所在的元组,匹配串中可以包含如下4种通配符:
_ (下划线):匹配任意一个字符(注意和%的取别)
% (百分号):匹配0到多个字符
[] (方括号):匹配方括号中的任意字符, 如[a,b,c,d]表示匹配a,b,c,d中的任意一个
[^ ] :不匹配方括号中的任意字符
如:查询姓李的学生的学号,姓名和所在系:
SELECT sno, sname, sdept
FROM student
WHERE sname LIKE '李%';

查询姓名中第二个字是”冲“的学生的学号,姓名,所在系:
SELECT sno, sname, sdept
FROM student
WHERE sname LIKE '_冲%';

(Q3:尝试用 NOT LIKE 关键字查询学号的最后一位不是’2‘或者’3‘的学生的学号、姓名和所在系,
提示:可以使用方括号[]包含多个选项,或者使用and连接条件语句)
4. 转义字符
如果要查找的字符串正好含有通配符,比如下划线或者百分号,就i使用一个特殊子句来告诉数据库管理系统,这个下划线是一个普通字符,这个特殊的子句是ESCAPE
5. 空值查询
空值NULL在数据库中又特殊的含义,类比Python中的None,都是一个比较独特的个体,NULL表示当前不确定或为止的值, 如学生选课后还未考试,那他只有选课记录,没有成绩,因此考试的成绩就为空值。
如:查询还没有考试的学生的学号,相应的课程号和成绩:
SELECT sno, cno
FROM sc
WHERE grade IS NULL;

(Q4:查询有备注的学生的学号、姓名、和备注,注意使用IS NOT NULL)
6 多重给查询条件
当需要多个查询条件时,可以在WHERE子句中使用逻辑运算符AND 和OR来组成多条件查询语句。
如查询机电系有备注的学生的学号,姓名,所在系和备注:
SELECT sno, sname, sdept, memo
FROM student
WHERE memo IS NOT NULL AND sdept ='机电系';

消除相同的行
本来在数据库的关系表中不存在取值全部相同的元组,但是在进行了字段的筛选后,就有可能在查询结果中出现取值完全相同的行,取值相同的行在结果中是没有意义的,因此可以删除这些行。如:查询有考试挂科的学生的学号
SELECT DISTINCT sno
FROM sc
WHERE Grade < 60;

(Q5:尝试一下不加DISTINCT的查询会是什么结果)
对查询结果排序
有时我们希望查询的结果能按一定的顺序显示出来,比如考试成绩由高到低排列,关键字ORDER BY能够帮助我们完成这个任务。排序句子的语法为:
1. 升序排列 关键字ASC
如:将"C01"号课程的成绩按照升序排列:
SELECT cno, grade
FROM sc
WHERE cno='C01'
ORDER BY GRADEl;

2. 降序排列关键字 DESC
如将060101号学生的成绩按照降序排列
SELECT cno, grade
FROM student
WHERE sno = '060101'
ORDER BY grade DESC;
使用聚合函数进行统计
聚合函数也成为统计函数,其作用是对一组值进行计算并返回一个统计结果,SQL提供的统计结果包括:
1) COUNT(*) :统计表中元组的个数
2) COUNT([DISTINCT] 列名) 统计本列的列值个数,DISTINCT选项表示去掉列的重复值后再计算
3) SUM(列名):计算列值的和值(必须是数值类型)
4) AVG(列名):计算列值的平均值(必须是数值类型)
5) MAX(列名):得到列值的最大值
6) MIN(列名):得到列值的最小值
上述函数出去COUNT(*)之外,其他函数再计算过程中均忽略NULL值。
注意:聚合函数是跟在SELECT后面的
如:统计学生的总人数:
SELECT COUNT(*) as '学生总人数'
FROM student;

如:统计学号为060101学生的总成绩:
SELECT sum(grade) as 总成绩
FROM sc
WHERE sno='060101';
![]()
(Q6:尝试统计学生学号为060101的平均成绩,注意NULL值有有没有参与计算)
(Q7:统计课程'C01'的最高分数和最低分数,使用MAX和MIN函数)
对数据进行分组
在实际应用中,我们要对数据进行更加详细的统计,比如统计每个学生的平均成绩,每个系的学生人数等,这时候就需要先对数据进行分组,比如每隔一个系的学生分为一组,然后再对每一组进行统。GROUP BY提供了对数据进行分组的功能,使用GROUP BY子句可将统计控制在组这一级。分组的目的是细化聚合函数的作用对象。使用分组的语句形式为:
GROUP BY 需要分组的列
[HAVING 提取条件]
如:统计每门课程的选课,列出课程号和选课人数:
SELECT cno AS 课程号, COUNT(sno) AS 选课人数
FROM sc
GROUP BY cno;

(Q8 统计每个学生的选课门数,列出学号、选课门数和平均成绩,注意该语句首先应该对sc表的数据按照sno的值进行分组,所具有的相同sno值的元组归为一组,然后再对每一组使用COUNT和AVG聚合函数进行计算)
以上黄色字体是给初学者的练习,需要答案的同学可以私信一下作者!!!
下面插入MySQL安装的一些问题:
MySQL安装问题
问题1:安装MySQL完成后,mysql server和workbench都没有安装。
解决办法:使用MySQL Installer先卸载所有安装的应用(不要直接去删除文件夹,会无法删除关键的注册表)

然后重新安装MySQL,在该步骤先点execute安装mysql运行必备的环境,再点击next。

MySQL创建表之间的外键无法设定
问题1:表结构的外键无法设定
首先声名一下这可能是MySQL Workbench的Bug(没办法,谁让人家免费还开源,如果使用Navivat一年需要好几万的购买费,因此Workbench有点bug也是阔以接受的)
推荐大家使用代码创建数据库的表和外键,步骤如下:
步骤一:创建数据库,选择字符集utf8
步骤二:使用命令创建数据库的表,表的结构,外键。注意先创建student表和course表,再创建sc表,因为sc表中的字段依赖student和course表。

步骤三:插入数据
CREATE TABLE `student` (
`sno` char(6) NOT NULL,
`sname` varchar(45) NOT NULL,
`ssex` char(1) NOT NULL,
`sbirthday` date DEFAULT NULL,
`sdept` varchar(45) DEFAULT NULL,
`memo` text,
PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sc` (
`sno` char(6) NOT NULL,
`cno` char(3) NOT NULL,
`grade` smallint DEFAULT NULL,
PRIMARY KEY (`sno`,`cno`),
KEY `FK_cno_idx` (`cno`),
CONSTRAINT `FK_cno` FOREIGN KEY (`cno`) REFERENCES `course` (`cno`),
CONSTRAINT `FK_sno` FOREIGN KEY (`sno`) REFERENCES `student` (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `course` (
`cno` char(3) NOT NULL,
`cname` varchar(20) NOT NULL,
`precno` char(3) DEFAULT NULL,
`credit` tinyint DEFAULT NULL,
`semester` tinyint DEFAULT NULL,
PRIMARY KEY (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
配置MySQL环境变量
环境变量,这个常谈的问题,我们发现在安装MySQL时,MySQL不会为我们配置环境变量,我们需要手动配置环境变量。
配置教程:
https://jingyan.baidu.com/article/3c48dd34782b68e10be35882.html
注意教程中的MySQL目录要替换成安装MySQL所在目录,一般默认为:
”C:\Program Files\MySQL\MySQL Server 8.0\bin“
(其实不添加环境变量也能使用,但是麻烦很多,不推荐)
通过命令连接MySQL数据库
step1: 连接MySQL服务器
打开命令行(使用cmd即可,win10系统使用power shell效果更好)
在命令行输入如下命令,连接MySQL服务器:
mysql -u root -p
-u用来指定用户名,root是我们之前安装MySQL时设定的用户名,-p表示需要通过密码登陆,按下回车会出现如下结果,输入密码后,即可登陆,密码也是同学们一开始设定的密码。


连接成功后,我们先观察一下终端跳出的信息,Server version的意思是说现在连接的服务器是MySQL 社区版,版本号是8.0.19。最下面一行mysql>表示现在已经连接到MySQL,从现在开始输入的命令是MySQL自身的语句,我们可以在此处输入一系列的查询语句来和服务器“对话”。
MySQL登陆忘记密码了怎么办?
大家可以按照如下的方法重置密码。
http://baijiahao.baidu.com/s?id=1602482045240479273&wfr=spider&for=pc
step2 :使用命令获取MySQL数据库管理系统简单的信息
查看目前已经存在的数据库(每个人的结果可能不太相同,取决于同学们服务器上的数据库):
SHOW DATABASES;

注意:之后的内容,每个知识点讲述的结构基本是问题+代码+结果的形式,大家尽可能地边看边动手实践,熟能生巧。
问题补充(使用cmd命令行工具,可能会出现的问题):
此处补充一个使用cmd命令提示符界面可能会出现的问题:输入命令+分号后,不返回结果,终端还是在等待用户输入,如下如所示:

出现这个问题的原因是:mysql的默认结束提示符被更改了,需要使用如下命令将结束提示符改回分号:
delimiter ;
更多的延申阅读请查看:
命令行中数据库sql语句无法以分号结束_Prodigal-优快云博客
分号;的使用
正常情况下,一条查询语句都需要分号;作为结尾,如之前的语句:
mysql> SELECT VERSION(), CURRENT_DATE;
上述语句是用来告诉我们MySQL的版本和当前的日期,结果后面还会跟上一个mysql>提示符。
注意:
1. 分号;的使用,一定是半角的,全角的分号;输入进去MySQL是读不懂的。
2. 有几个不需要加分号的语句:如USE关键字
查询语句中关键字的大小写
MySQL中的关键字不区分大小写,比如show和SHOW是一样的。
SELECT VERSION(), CURRENT_DATE;
select version(), current_date;
SeLeCt vErSiOn(), current_DATE;
但出于书写规范,强力推荐大家使用第一种写法。这个其实类似与html中的自闭和标签有点类似,<input \>标签最后加不加\,其实可以不加,但是还是推荐大家加上,因为在读代码的时候,可能会搞混,把没有加\的认为是某个标签没有结尾。
这篇博客主要介绍了MySQL的SQL基础语句,包括符号使用、SELECT语句的各种操作,如运算符、IN、LIKE、转义字符、空值查询等。此外,还讨论了MySQL安装过程中的常见问题,如环境变量配置、外键设定和命令行连接数据库等。
1万+

被折叠的 条评论
为什么被折叠?



