bfb6dfed4e19fcd920e0da2faea7bdfe.png

1.入门

1.1 什么是数据库?

简单的说,数据库(英文Database)就是一个存放数据的仓库,这个仓库是按照一定的数据结果(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据,数据库和我们生活中存放杂物的仓库性质一样,区别只是存放的东西不同。在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库(RDBMS)非关系型数据库(NoSQL)

1.2 MySQL数据库介绍

MySQL是互联网领域一款深受广大用户欢迎的开源关系型数据库软件之一,由瑞典MySQL AB公司开发与维护。2006年MySQL AB公司被SUN公司收购,2008年,SUN公司又被传统数据数据库领域大佬甲骨文(oracle)公司收购,因此,MySQL数据库软件目前属于Oracle公司。

为什么选择MySQL数据库

原因可能有以下几点:

(1)MySQL性能卓越、服务稳定,很少出现异常宕机

(2)MySQL开放源代码且无版权制约,自主性及使用成本低

(3)MySQL历史悠久,社区及用户活跃,遇到问题可以解决

(4)MySQL软件体积小,安装使用简单,并且易于维护,安装及维护成本低

(5)MySQL品牌口碑效应,使得企业无需考虑就直接用,LAMP、LEMP流行架构

(6)MySQL支持多用操作系统,提供多种API接口,支持多用开发语言,特别对流行的PHP语言有很好的支持

1.3 SQL的基本知识

SQL 的全称是 Structured Query Language,中文含义是:结构化查询语言,是访问和处理关系数据库的计算机标准语言。SQL语句既可以查询数据库中的数据,也可以添加、更新和删除数据库中的数据,还可以对数据库进行管理和维护操作。不同的数据库,都支持SQL,我们通过学习SQL这一种语言,就可以操作各种不同的数据库。

  • SQL的分类

d3aedaa02f4fa9a8d6f80422cf7d1b96.png
SQL分类
  • SQL的基本书写规则
  1. SQL语句以英文分号(;)结尾
  2. SQL语句不区分关键字的大小写
  3. 列名不能加单引号(列名命名时不能有空格)
  4. 符号只能使用英文符号
  5. 字符串和日期常数需要使用单引号(')括起来,数字常数无需加注单引号
  6. 单词之间需要使用半角空格或者换行符进行分隔
  • SQL常见数据类型

1.字符串类型

6e9ba7ad605fd1109b448772cb645030.png

2.日期/时间类型

bd8fe74cc4586325f1a1522edf486848.png

3.数值型

ce9311d44fdbdce6ce693d46f432ede3.png

4.约束

cb08ccd600a4685470c721e3582c284f.png

1.4 学习回顾

在本节课程中,学习了关系数据库的基本概念,如何使用SQL操作数据库,以及一种最流行的开源数据库MySQL的基本安装和使用方法。并同时学习了如何使用数据库客户端工具Navicat对MySQL进行连接,并且对Navicat的基本操作进行了学习,包括表的创建、删除和更新,用查询编辑器进行数据的插入、删除和更新。

1.如何安装MySQL以及Navicat客户端?

MySQL数据库安装教程

mysql数据库安装教程​mp.weixin.qq.com
683bae5c7a52d2dfacaf755a67828c97.png

Navicat客户端安装教程

客户端navicat安装教程​mp.weixin.qq.com
1f6ab35e25d77f5629807c78fcc2c55b.png

2.练习一:创建学校数据库的表

  • 创建学生表(student)

f4260fe1b5fd9824c6a51c50dc34b24d.png
  • 创建成绩表(score)

d5bb2425e507321d60c90d0eba20d98b.png
  • 创建课程表(course)

066c16ebabc8c65f4b632ed8b18718df.png
  • 创建教师表(teacher)

757cd0f04279de29dce44e3e126f2e4c.png

3.练习二:往4个表里插入数据

  • 往课程表(course)里添加数据

dc953dc313da0f75b4c4c67ab13c6bb3.png

3afde9dbe5ab32d30d387437fac92300.png
  • 往成绩表(score)里添加数据

7fa21c3fe27b13cfef6f612950340ed4.png

559b723adaff6f4f566b8c7f6026bf5f.png
  • 往学生表(student)里添加数据

496134ca75201c1633454091fb781e35.png
  • 往教师表(teacher)里添加数据

20e6c771435b49803e731e7bdd3a6658.png

2.简单查询

2.1 基本的查询语句

  • 查询指定列
select 

4aa6bcfb92ce6fbccffad1e478ed6eb5.png
  • 查询全部列

b3e2ba750e9d267b9de39b83a118d159.png
  • 为列设定别名(使用as关键字)

别名可以使用中文,使用中文时需要用双引号(")括起来,请注意不是单引号(')。

09752fcf36fbee918d8997af9129093b.png
  • 删除重复数据(使用distinct关键字)

distinct关键字只能用在第一个列名之前

f07f79367612dd8a94e4a7021db23337.png

3ca76095cad8eda027568b12e42ca1bf.png

2.2 指定查询条件

select 

b4f2890e80f6892c2a73ffe8249a8685.png

2.3 注释

注释是SQL 语句中用来标识说明或者注意事项的部分。注释对SQL 的执行没有任何影响。因此,无论是英文字母还是汉字都可以随意使用。注释的书写方法有如下两种。

  • 单行注释

书写在“--”之后,只能写在同一行。(MySQL中需要在“--”之后加入半角空格)

eda5c3a879cef1bac7a9fe83f149f121.png
  • 多行注释

书写在“/*”和“*/”之间,可以跨多行。

7a1232e52e9d76318fab55ddf726c1fc.png

2.4 运算符

14fa747d38fad1b3cc853289e069ad71.png

注意:

  • 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
  • 不能对NULL使用比较运算符,查询NULL值,使用 is null运算符或者 is not null。

练习:

fbac094248c0fc6b6d6209f7170376c9.png

2.5 字符串模糊查询(使用关键字 like )

%:表示任意 0 个或多个字符。可匹配任意类型和长度的字符;

_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。

练习:

5e57c3c8b4f5074052a4977f8b2a0389.png

b55611d470648934fd84f688338f8ac4.png

f8418440d8383e99b4ca1b5f506e5e2d.png

2.6 sqlzoo平台练习

  • select basic(简单查询)练习

72234f87ff989fbea73097bc4919144f.png
  • select from world(运算符)练习

21ebd234d9d502c1bcc771748ae9ce7f.png
  • select names (字符串模糊查询)练习

227f689c17a28d660f52f3afc05e65bf.png

3.汇总分析

3.1 汇总分析

汇总函数

  • count(列名) 求某列的行数,count(*)
  • sum(列名) 对某列数据求和,只能对数值类型的列计算
  • avg(列名) 求某列数据的平均值,只能对数值类型的列计算
  • max(列名) 求某列数据的最大值
  • min(列名) 求某更数据的最小值

5012f5c4c6d5d04ee8360578fcfc9ff1.png

285511713a2a6b1e9cdd2f85ac4d3968.png

b787d445d7d272271801fa3b0e35591d.png

17eddd4a2b46ee5c034b33ae5bdd6ad8.png

d76a70a027860090ff278ee30b80e47e.png

557bc802a133b115ff65ff791080482f.png

练习:汇总分析

  • 查询课程编号为"0002"的总成绩

5465876a112677efa659408eb8ca1c84.png
  • 查询选了课程的学生人数

8a45ec06ada182daa0e3b7f0ed69f256.png

3.2 分组

sql分组:group by

数据分组-应用函数-结合结果

SQL运行顺序

4 select 性别,count(*)

1 from student

2 where 出生日期>'1990-01-01'

3 group by 性别;

练习:分组

  • 查询各科成绩最高和最低的分

d43fc2fe1c56cd5de69f295819dc2fc1.png
  • 查询每门课程被选修的学生数

adadf4a739abf815308bb77bf1deff50.png
  • 查询男生、女生人数

d897e4cb16d05877e161ffa1eb96f26a.png

3.3 对分组结果指定条件(having)

练习:分组结果的条件

  • 查询平均成绩大于60分学生的学号

fb6f68c5ea7e810c98778395e963ae58.png
  • 查询至少选修两门课程的学生学号

4f8d403691dbaf7b9c911cac6607081a.png
  • 查询同名同姓学生名单并统计同名人数

ff02c9f4b6d2b0b2013c4cad901286ae.png

3.4 用sql解决业务问题

练习:计算每门课程的平均成绩并且平均成绩大于等于80分

8376a58fa428b4550e10ca561c4da3ba.png

3.5 对查询结果排序(order by)

desc 降序 从大到小

asc 升序 从小到大

练习:查询不及格的课程并按课程号从大到小排列

5f7ea915be366b28c78a6cfbe96a547f.png

练习:查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排列

462550808e987afc9078bc05f6df0860.png

3.6 sqlzoo练习

SELECT from Nobel Tutorial

b13a0456821f302ec1b27afaeccc9acf.png

SUM and COUNT

3efe576fe7e18a5a5c42a893e9ff61c3.png

4.复杂查询

4.1 视图

  • 从SQL的角度来看,视图和表是相同的,两者的区别在于表中存储的是实际数据,而视图中保存的是从表中取出数据所使用的SELECT语句(视图本身并不存储数据)。

888fdedad568ca7bf5623318c98c2a1b.png
  • 视图的优点
  1. 由于视图无需保存数据,因此可以节省存储设备的容量
  2. 可以将频繁使用的SELECT 语句保存成视图,这样就不用每次都重新书写了
  • 创建视图(CREATE VIEW语句)
create 

d3564d06d9e415161b647809e774ea51.png

562452ccc6d5f29f1a0e767fe9be71fb.png

92262cb0813a3a55a6698524c9e70a70.png
  • 删除视图(DROP VIEW 语句)
DROP 

715c4df13a3df02e455b18038a7ad212.png

要点:

  • 应该避免在视图的基础上创建视图。
  • 定义视图时不要使用ORDER BY子句。
  • 视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
  • 不能往视图里插入数据。

4.2 子查询(in any all)

any(子查询)与some(子查询)相同

练习:

  • 哪些学生的成绩比课程号0002的全部成绩里的任意一个都高呢?

08961327746a88a410872fe7eead3682.png
  • 哪些学生的成绩比课程号0002的全部成绩都高呢?

12fde886f3f94acf2991cb9677452901.png

4.3 标量子查询

  • 大于平均成绩的学生的学号和成绩

bedb2d62b0227e0f9edca0b0d13090b9.png
  • 成绩介于差生平均成绩和优等生平均成绩之间的学生有哪些?

(差生:成绩<=60,优等生:成绩>=80)

SELECT 

9be6f1de1456be28580a233bcdeda959.png

4.4 关联子查询

练习:

  • 查找出每个课程中大于对应课程平均成绩的学生?
select 

3c930fea8355799b8361ba6a7537230b.png
  • 找出每门课程成绩最低的学号?
select 

117c18d5b8c512ed07120109e03e1c84.png

4.5 各种函数

13fc590c69289f4946e05569b79be9ef.png

a4b7d7c7fe1d31f5bc5d677db9b85b07.png

2e18511d2b764db6d56325ffcab834ea.png

4.6 sqlzoo练习

SELECT within SELECT Tutorial

3098f5ef38edc0937e663069a19d183e.png

5.多表查询

5.1 表的加法(union)

  • 新建一个表course1

f7c79f54ab952b95735eb36f306617dc.png

908323e4f74369bff11d9c369d7e5452.png

dd3c8bae78cabc51565004b632579a07.png

00bb4e7ce6303ba17a6babd3bed4b37c.png
course1表
  • 练习:如何合并两个表?

union 去掉了重复数据

union all没有去掉重复数据

select 

29b9865d70c44bc836269a3db84dbd5a.png
select 

282b41cfbdf43eaf364251bbfbb6894a.png

5.2 表的联结(以列为单位对表进行联结)

  • 交叉联结(cross join)是其他所有联结的基础
  • 内联结(inner join)
select 

2f8fcb98082cbbab15cfa93b939e0dc8.png
  • 左联结(left join)
select 

f32b84250b55810fbf91b27cdfe9eb7c.png

f27141ed4301852918ee2fed4637bfd1.png
  • 右联结(right join)
select 

d774581c5fad1111d02a116fe7b69857.png

a5187186bf5477c784ce7ef1d469abc6.png

4c14a72b525a111b776577e2f00d483b.png

5.3 联结应用案例

练习:

  • 查询所有学生的学号、姓名、选课数、总成绩
select 

66c28f10088ac217c66900f4880579ca.png
  • 查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select 

857fa0be457af0da2c1d29fd5582f89c.png
  • 查询学生的选课情况:学号,姓名,课程号,课程名称(三个表联结)
select 

3effbf35c4d069622655998ebf69ef38.png

5.4 case表达式

case 
  • 成绩是否及格
select 

138d7d965dbe623b322226619a9da01d.png

练习:

  • 查询出每门课程的及格人数和不及格人数
select 

38e3b0d78986c3cf077cf509ee854b16.png
  • 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称
select 

4f34743a82d0cfb2679961db1c2f88a4.png

0c9d2b680f0285eab272675d3cf5adb2.png

5.5 sqlzoo练习

The JOIN operation

b95008b1c92c4d3008df27a9edb35648.png

f2ed288746b13bc6b6851a6fcd565347.png

6.其他补充

1.SQL语句书写顺序和执行顺序

  • 书写顺序
  1. SELECT [列名称 *代表所有的列]
  2. FROM [表名称]
  3. join [表名称]
  4. ON [join条件]
  5. WHERE [过滤条件]
  6. GROUP BY [分组字段]
  7. HAVING [分组条件]
  8. ORDER BY [排序字段]
  • 执行顺序
  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. LIMIT(MySQL)

在where中不可以使用select中的别名,而having却可以使用,为什么having可以使用,搜索网上得出如下回答,大意是MySQL新版本号做了扩展。

697e1f56a5eb73ceab1a7d08928cde2a.png

2.查询SQL版本号

新建查询,输入代码select @@version,点击运行。

771eb78a36a1dd536db97e607b69d773.png

3.Where与Having的区别

Where关键字的作用是过滤,选取符合条件的记录,而Having关键字的作用则是,为聚合结果指定条件。但是,在某些条件下,使用这两者可以得到一样的结果。

比如以下的例子:

1.

SELECT 

2.

SELECT 

这两段语句得到的结果是一样的。那么他们两者的区别在哪呢?

1、

Where 子句 = 指定行所对应的条件

Having 子句 = 指定组所对应的条件

因此,2 语句会比较合适。

2、当在Where子句和Having子句中都可以使用的条件,从语句的执行效率来看,最好写在Where子句中。在使用Count函数等对表中的数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度。使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就要多得多。

3、使用Where子句更具速度优势的另一个理由是,可以对Where子句指定条件所对应的列创建索引,这样可以大幅提高处理速度。

4、Where子句中不能使用聚合函数,而Having子句中可以。

4.时间戳与日期转换

  • 日期转时间戳

select UNIX_TIMESTAMP('2018-12-25 12:25:00');

结果:1545711900

  • 时间戳转日期

FROM_UNIXTIME(unix_timestamp) --unix_timestamp为时间戳

select FROM_UNIXTIME(1545711900);

结果:2018-12-25 12:25:00

  • 将字符串类型转换为日期类型

SELECT CAST('2009-12-14' AS DATE) AS date_col;

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐