MySQL数据库学习(一)SQL语言基本语法

一、什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。

通常使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。

所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

RDBMS即关系数据库管理系统(Relational Database Management System)的特点:

1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

SQL(结构化查询语言)是关系型数据库的标准语言。SQL集数据查询、数据操纵、数据定义、数据控制为一体。

MySQL 是一个关系型数据库管理系统又是一种关联数据库管理系统(将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。增加了速度并提高了灵活性)。

二、管理MySQL的基本命令

1.显示数据库列表

在这里插入图片描述

2.显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

在这里插入图片描述

3.显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。

在这里插入图片描述

4.显示数据表的详细索引信息,包括PRIMARY KEY(主键)

在这里插入图片描述

三、创建数据库

在这里插入图片描述

四、数据定义

下面将以一个典型的学生-课程数据库来进行示例:

首先,因为关系数据库支持三级模式结构,且每种模式中的基本对象都包含模式、表、视图和索引等。因此SQL的数据定义如下表:
在这里插入图片描述
他们之间的关系如下:
在这里插入图片描述

1.模式的定义与删除

//为用户wang定义一个S-T模式
create schema S-T authorization wang;
//删除该模式所有
drop schema S-T cascade

2.基本表的定义、删除、修改

创建3张表:
在这里插入图片描述

批量插入记录:

在这里插入图片描述

然后ding !

在这里插入图片描述

删除:

drop table student cascade;

3.索引的建立与删除

当表的数据量过大时,查询操作会比较耗时。此时,建立索引能加快查询速度。但是索引需要占用一定的内存空间,且当表更新时,索引需要维护,会对数据库造成一定的负担。

索引有多种类型,包括:顺序文件上的索引、B+树索引、散列(hash)索引、位示图索引等。

为student 和course表按升序建立唯一索引:
在这里插入图片描述

删除索引(这里我不知道他为毛删不掉):
在这里插入图片描述

五、数据查询

核心语句:
select 某列,某列(*表示全部)
from 某表,某表
where 某条件
group by 某列 (having 某条件)
order by 某列 (asc/升序,desc/降序)

用口水话解释下就是:根据where的条件——从from中指定的表、视图中找出满足条件的元祖——按select中的目标列 选出满足条件的属性值得出结果表。

若是有group by的话,则先按 某列 的值进行分组,属性相等为一组。若同时还带having,则只挑选满足指定条件的组输出。

若是有order by的话,结果还要排序一下。

1.单表查询

  • 查询全体学生的学号与姓名:
    在这里插入图片描述
  • 查询全部列:
    在这里插入图片描述
  • 查询全体学生的姓名及出生年份:

因为需要计算,先改下年龄的字段类型为smallint,因为char无法参与计算
在这里插入图片描述

在这里插入图片描述
字段名看上去不是很好看?可以自己定义哦
在这里插入图片描述

  • 查询选修了课程的学生学号:
    在这里插入图片描述

重复太多?

在这里插入图片描述

  • 查询计算机科学系全体学生的名单:

在这里插入图片描述

  • 查询所有20岁以下的学生姓名及学号:
    在这里插入图片描述
  • 查询不及格的学生姓名:(看来大家成绩都很好嘛)

在这里插入图片描述

  • 查询年龄在19-20岁之间的学会姓名,系别和年龄:

在这里插入图片描述

反之:

在这里插入图片描述

  • 查询数学系和信息系学生的姓名和性别:

在这里插入图片描述

  • 查询所有姓刘的学生姓名,学号:
    %代表任意长度的字符串,_代表任意单个字符串

在这里插入图片描述

在这里插入图片描述

  • 查询D_B课程的课程号(假装有D_B课)
    在这里插入图片描述

  • 查询没参加考试的学生姓名:
    在这里插入图片描述

  • 查询计算机科学系年龄在20岁以下的学生姓名:
    在这里插入图片描述
    -查询选修了3号课程的学号和成绩,按成绩降序输出:
    在这里插入图片描述

  • 查询学生总人数:
    在这里插入图片描述

  • 查询选修了课程的学生人数:
    在这里插入图片描述

  • 计算选修1号课程的学生平均成绩
    在这里插入图片描述

  • 查询选修2号课程的学生最高分数:

在这里插入图片描述

  • 查询学生201215121选修课程的总学分数:

在这里插入图片描述

  • 查询各个课程号及相应的选课人数:

在这里插入图片描述

  • 查询选修了1门以上课程的学生学号:

在这里插入图片描述

  • 查询平均成绩大于90分的学生学号在这里插入图片描述

2.连接查询

包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询、复合条件连接查询等。

  • 查询每个学生及其选修课程的情况

等值连接:
在这里插入图片描述
自然连接(去掉重复属性的列):
在这里插入图片描述

  • 查询选修2号课程且成绩在80分以上的所有学生的学号和姓名:

在这里插入图片描述

  • 查询每一门课程的间接先修课(即先修课的先修课):

在这里插入图片描述

  • 外连接(左外连接,右外连接):

在这里插入图片描述

  • 多表连接(查询每个学生的学号,姓名,选修的课程及成绩:

在这里插入图片描述

3.嵌套查询

SQL语句中,一个 select-from-where 语句称为一个查询块将一个查询块嵌套在另一个查询块的where子句或having语句中的查询称为嵌套查询。

  • 带in的子查询:查询与“刘晨”在同一个系的学生

在这里插入图片描述

这题也可以用自然连接来做:

在这里插入图片描述

查询选修了课程名为“信息系统”的学生学号和姓名:
在这里插入图片描述
方法二:(现实生活中,能用连接运算尽量连接运算)
在这里插入图片描述

  • 带有比较运算符的子查询

找出每个学生超过他自己选修课程平均成绩的课程号:
在这里插入图片描述

即从sc中取一行与所有行作比较

注:求解相关子查询不能像求解不相关子查询一样将子查询求解出来,然后求解父查询。

  • 带有any (some) all 的子查询

子查询返回单值时可以用比较运算符,但返回多值时要用any(some)或者all修饰符。且使用any或all是必须同时使用比较运算符。

查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄:
在这里插入图片描述

也可以用聚集函数来做:
在这里插入图片描述

  • 查询非计算机科学系中比计算机科学系所有学生年龄小的学生姓名和年龄:
    在这里插入图片描述

聚集函数:
在这里插入图片描述

  • 带有exists的子查询

带有exists的子查询不返回任何数据,只产生"true"和"false".

查询了所有选修了1号课程的学生姓名:
在这里插入图片描述

注:由exists引出的子查询,其目标列表达式通常为*,因为带exists的子查询只返回其真值或假值,给出列名无实际意义。

所有带IN、比较运算符、ANY和ALL的子查询都能用带EXISTS子查询替代。

例如,查询选修了所有课程的学生姓名:
换言之,即没有一门课是他没有选修的
在这里插入图片描述

再举个栗子:查询至少选修了学生201215122选修的全部课程的学生学号
即:不存在这样的课程y,学生201215122选修了y,而学生x没有选

4.集合查询

集合操作主要包括:并操作UNION、交操作INTERSECT、差操作EXCEPT (mysql只支持UNION)
注:参加集合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同。

  • 查询计算机科学系的学生及年龄不大于19岁的学生:

在这里插入图片描述

5.基于派生表的查询

子查询不仅可以出现在where语句中,还可以出现在from 语句中,这是子查询生成的临时派生表成为主查询的查询对象。

六、数据更新(即增删改)

1.插入数据

插入有两种:一是插入元组,二是插入子查询结果。

插入元组:

inset
into student(学号,姓名,性别,所在系,年龄)
values('201215218','陈东','男','IS','18');

插入子查询结果:
对于每一个系,求学生的平均年龄,并把结果存入数据库:

首先在数据库新建一个表,再对student分组求平均年龄,填入新表。
在这里插入图片描述

2.修改数据(更新)

  • 修改某一元组的值
    例:将学生201215121的年龄改为22岁

在这里插入图片描述

  • 修改多个元组的值
    例:将所有学生的年龄增加2岁。

在这里插入图片描述

  • 修改带子查询的值
    例:将计算机科学系全体学生的成绩置0

在这里插入图片描述

3.删除数据

在这里插入图片描述

在这里插入图片描述

七、空值的处理

三种不能取空值的情况:NOT NULL, UNION, KEY;
空值与一个值的运算结果为空值,与一个值的比较结果为UNKNOWN;

所在在查询表时,要考虑到空值的情况:
查询1号课程不及格的学生(包括缺考)

select 学号
from sc
where 成绩<60 and 课程号 = '1';

上面的查询若是有缺考就查不出来,UNKNOWN,改为:

select 学号
from sc
where 课程号 = '1'and (成绩<60 or 成绩 is null);

打了一遍,感觉MySQL的基本语法算是熟悉了…也花了我好多时间鸭~
赶数据库的实验报告去了~

猜你喜欢

转载自blog.csdn.net/weixin_41206209/article/details/83867393