mySQL复习

目录

一.写在前面

二.介绍

三.选择语句

四.内连接

五.列属性


 

一.写在前面

课程视频:【中字】SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!_哔哩哔哩_bilibili

课程所需资料:

链接:https://pan.baidu.com/s/1xDsDWFLiRITYTT6HoFb7Tw 
提取码:s5iz

 

二.介绍

数据库是用来存储数据的集合,一般用数据库管理系统(dbms)来进行管理,目前有两种dbms:

关系型(RDBMS)和非关系型(NoSQL)

前者是我们接下来会学习的,后者即没有表或者关系(例如在关系型中,每个产品都会有个价格;然而在非关系型中,产品与价格是拆分来来的)。

本课程使用的是mySQL,安装略(安装教程视频里有)。

红色框框点进去,就会弹出下面那个界面,输入在安装时设置的密码。

成功时会弹出下面的界面(噫!我成功啦):

下载视频课程后链接的zip文件,其中会有课程所需要的文件内容。点击新创建的connections,点击左上角(下图红色圈圈所圈的图案),引入 create-databases.sql 这个文件。

引入以后,需要先运行一下(点闪电)再刷新才会有schemas里面的东西。

 

三.选择语句

1.在单一表格中检索数据

mySQL中不区分大小写,建议关键字用大写的,数据内容用小写的。

* 代表everything ,想要什么就select什么。

2.选择子句

select 可以是任意表达式

加减乘除的优先级与数学中一样。as关键字是将某一列的名称改名,如下图

当state出现了两个VA,而我们只想要出现一个时,就使用distinct关键字。

练习:

SELECT name,
unit_price,
unit_price*1.1 AS 'new price'
FROM products

 

3.where关键字

练习:

假设我们现在在2019年,则代码如下:

SELECT *
FROM orders
WHERE order_date>='2019-01-01' AND order_date<='2019-12-30'

 

4.三个逻辑关键字

and -- &&

or -- ||

not -- !

 

5.in 关键字

多个元素选一个,只要有一个满足就是所选项

练习:

SELECT *
FROM products
WHERE quantity_in_stock IN (49,38,72) 
-- in后内容是字符或者字符型数字,那么每个字符都需要加上单引号。(这就像C当中的char型数据)

 

6.between 关键字

可以类比成定义域

练习:

SELECT *
FROM customers
WHERE birth_date BETWEEN '1990-01-01' AND '2000-01-01'

 

7.like 关键字

该关键字是用来获取符合某一字符特性数据的

'%b%' -- 只要有b字母就行

'brush%' -- brush开头

'%y' -- y结尾就行

'_y' -- y前面只能有1个字符 

'_____y' -- y前面有5个字符(前面5根下划线)

 

练习:

SELECT *
FROM customers
WHERE address LIKE '%TRAIL%' OR
      address LIKE '%avenue%'OR
      phone LIKE '%9'

 

8.regexp 关键字

关键字是regular expression的缩写,通常用来搜寻字符串。

WHERE address LIKE '%TRAIL%' 
WHERE address REGEXP 'TRAIL'

上面两条语句的作用是一模一样的。

'^x' -- 以x开头

'x$' -- 以x结尾

'x|y' -- 包含 x 或者 y    ( | 可以跟个好几个,并且 | 可以和 ^ 或者 $ 结合使用)

'[gim]e' -- 包含ge或ie或me的字符串

'[a-c]e' -- 包含ae或be或ce的字符串

 

 

9.is (not) null 关键字

表格中部分数据为空,该关键字就是用来把某些数据为空的信息提取出来,is not null 就是把某些数据非空的信息提取出来。

 

练习:

SELECT *
FROM orders
WHERE shipped_date IS NULL

 

10.order by 关键字

点击把手按钮,就可以跳转到设置页面。该页面可以设置默认的排序方式,删除某一列,添加新列等。最上面的那个图标是黄色的,因为它很特殊。它被叫做主键列,这一列中的值要能够唯一识别表中数据。(每个顾客的id只能是唯一的,因此id可以作为主键列)

order by xxx,yyy 以后,如果要让xxx降序排序的话可以在xxx后加上 desc,如果要让yyy降序排序的话可以在yyy后加上 desc

order by 也可以跟被as的元素(例如 select 10 as points,points也可以作为排序元素)

order by 1,2 -- 根据select关键字后紧跟着的第1个和第2个元素进行排序。(不推荐使用)

 

练习:

题目.在order_items中,只要order_id为2的,并且根据总价进行降序排序。

SELECT *
FROM order_items
WHERE order_id = 2
ORDER BY quantity*unit_price DESC

 

11.limit 子句

limit 3 -- 只提取整个数据库中的前3条信息

limit 6,3 -- 跳过数据库中前6条信息,提取后续3条信息

 

练习:

找到积分(points)最高的3位用户

SELECT *
FROM customers
ORDER BY points DESC 
LIMIT 3

 

四.内连接

1.在多张表格中检索数据

在customers和orders两个表中,都存在customer_id这一项,因此该项就能够作为连接2个表的链条。

SELECT *
FROM orders
JOIN customers ON customers.customer_id = orders.customer_id
-- JOIN 需要连接过来的表 ON 两个表的哪一列关系可以行行对应

没有后面的on,那么只是简单地将customers表黏贴到orders表右边(并且会出现下图的情况);如果有了后面的on,不满足该关系的都会被删除。

(会有10*10 = 100 条不同数据)

当 select customer_id 时,必须要声明是要 orders.customer_id 还是 customers.customer_id

在 from 关键字 与 on 关键字 后的表格名称后面可以直接加上一个缩写,简单方便

SELECT *
FROM orders o
JOIN customers c
ON  c.customer_id = o.customer_id

 

练习:

把products表连接到order_items表上,返回产品id、名字还有order_items表中的数量和单价。

SELECT name,oi.product_id,quantity,oi.unit_price
FROM order_items oi
JOIN products p
ON  p.product_id = oi.product_id

 

 

2.跨数据库连接

练习:

如何把sql.inventory数据库中的products表格,连接到sql.store数据库中的order_items表格呢?

USE sql_store;

SELECT *
FROM order_items oi
JOIN sql_inventory.products p
ON oi.product_id = p.product_id
USE sql_inventory;

SELECT *
FROM sql_store.order_items oi
JOIN products p
ON oi.product_id = p.product_id

 

3.自连接

该表中,可以发现有很多的 reports_to(报告对象)是37270,那id为37270的就是老板。假设我们现在是那个老板,此时需要搞出一个员工表格,那么就可以通过自连接来实现。

此处需要注意的是,自连接必须要给到同一张表2个不同的别名,如果尝试用表格名作为ON后跟着的判断条件,则会出现下列报错

 

4.多表连接

注意:表连接尽量不要超过3张,过多的表连接会影响查询速度(会致使列过多,找不到自己需要的信息)

多表连接就是多次使用 join on 语句,然后把需要连接上来的表都通过该语句连接到目标表格。

 

练习:

打开sql_invoicing,把payment_methods表、clients表连接到payment表。

USE sql_invoicing;

SELECT *
FROM payments p
JOIN payment_methods pm
	ON p.payment_method = pm.payment_method_id
JOIN clients c
	ON p.client_id = c.client_id

 

5.复合连接条件

就是在ON后面多加一个判断依据,用关键字and连接下一个判断依据。

JOIN xxx
    ON xxx.x = yyy.x
    AND xxx.y = zzz.y

 

6.隐式连接语法

起到的也是join on 语句一样的作用,只是写法不一样。

 

 

7.外连接(难点)

提示:有没有发现左表其实就是被from的表,右表就是被join的表?

通过左连接让没有order_id的customer_id也显示出来,可以理解成将整个customers表都提取了出来。

右连接与一般连接结果相同,可以视作将整个orders表数据提取出来。

技巧:画个文氏图,JOIN ON 的是两者的交集,LEFT JOIN 是交集+剩下的左半部分,RIGHT JOIN 是交集+剩下的右半部分,不加ON的JOIN就是左右两个表的所有数据(可以看成 左并右)

并且 LEFT JOIN 就是针对FROM后面那个表而言的,RIGHT JOIN 就是针对JOIN后面那个表而言的。

 

练习:

把products全都提取一遍,要有卖出多少份+名字+id 3部分,一件都没卖出的也需要打印。

SELECT 
	p.product_id, -- 这里千万不能是oi.product_id,在order_items里,products_id = 7不存在,那么在SELECT时也会为NULL
    p.name,
    oi.quantity
FROM products p
LEFT JOIN order_items oi
	ON oi.product_id = p.product_id

 

8.多表外连接

多表外连接就是多次使用外连接(e.g. left join + right join),同样不建议把太多表的数据外连接起来。

技巧:最好不要一会左连接,一会右连接,一会内连接。这会让自己和别人都看不懂写了点什么东西。

 

9.自外连接

自外连接就是在自连接的基础上,加上了外连接的。例如上一个自连接的例子,manager自己因为没有reports_to所以无法满足ON后条件,所以没有外连接的话就不会提取出来。用上left,就是把无论有没有reports_to都打印出来。

 

10.using子句

-- ON o.customer_id = c.customer_id
USING (customer_id)

上面两句代码的作用一模一样,using子句是用来简便代码的。(但需要确保两张表里都有using跟着的列名称)

如果要多个比较的话,就直接像下面一样即可。

USING (order_id,product_id)

 

11.自然连接

不太建议使用自然连接,因为时常会出现出乎意料的结果。

SELECT *
FROM orders o
NATURAL JOIN customers c

上面这条代码运行之后,数据库引擎会自己看着办,基于某条共同的列连接搞出一个表。

因为自然连接是把连接方式的权力交给了引擎,所以有点难以控制,因此不推荐使用。

 

12.交叉连接

SELECT *
FROM orders o
CROSS JOIN customers c

上述代码最终结果和只用join不加on的结果一样,也可以把cross join 的内容直接跟在from后面(如下所示)

SELECT *
FROM orders o
JOIN customers c


SELECT *
FROM orders o,customers c

 

13.联合(两面包夹芝士)

之前的连接都是结合多张表的列,联合是结合多张表的行。

练习:

假如我们把2019-01-01以后的order作为status=active的订单,把这之前的作为status=archived的订单,并且要把这两张表相结合起来。

首先进行第一次的select,把2019-01-01以后的订单提取出来

然后再把2019-01-01以前的提取出来,最后在两个select语句之间,加上一个union关键字,就能把两个表按行联合起来了。

全部代码如下:

USE sql_store;

SELECT 
	order_id,
    order_date,
    'Active' AS status
FROM orders
WHERE order_date >= '2019-01-01'
UNION
SELECT 
	order_id,
    order_date,
    'Archived' AS status
FROM orders
WHERE order_date < '2019-01-01'

注意:如果没有union关键字,两个select语句之间要有分号,因为这是两段不同的内容,如果有union关键字就不用。同时,select带的列必须是相同数量的,如果一个select了2列,一个select了1列,那么就会报错。最后,第一段查询了啥会决定最终的列名称(如下两图所示)。

 

 

 

五.列属性

1.列属性

点击三个按钮当中的工具按钮,就可以跳出该菜单。

表格介绍:

1.Column Name:列名称

2.Datatype:数据类型

INT(11) -- 整型数据,并且最多只能存放10位数字(11 - 1 = 10)

VARCHAR(50) -- 可变字符,存放字符数量会有不同,最多存放50个字符

CHAR(2) -- 不可变字符,存放字符数量需要相等,只能存放2个字符

假设现在有一列为CHAR(50),然后只用了5个字符,会自动插入45个空格符填满这列

3.PK:主键列,勾选项作为主键列存在。主键列的所有值只能是唯一的

4.NN:是否可以写入空值,未勾选项可以有空值

5.AI:自动递增,通常用在了主键列上

6.Default/Expression:当你没有提供任何值,会给有 'NULL'(表格中)的列直接填上空值NULL(数据表中),会给有 '0' (表格中)的列直接填上0

 

2.插入单行

INSERT INTO customers
VALUES( 
	DEFAULT,
    'John',
    'Smith',
    '1990-01-01',
    NULL, 
    'address',
    'city',
    'VA',
    default)

default:默认给个值,一般性会根据表中最大的一条数据递增给出(这边出现那么怪的数字是特例,因为mysql是根据存在过的数字最大的那条数据给出默认值的,即使数字最大的那条数据被删除了)

NULL:必须得满足NN才可以用

插入单行以后,需要刷新一下表格,那行数据才会出现

 

 3.插入多行

INSERT INTO shippers (name)
VALUES
	('shipper1'),
    ('shipper2'),
    ('shipper3')

在insert语句最后可以加个括号,里面填入需要程序员来填写的数据列名称。剩下的一些列,mysql引擎会自动给出默认值(default值)。

 

 4.插入分层行

INSERT INTO orders (customer_id,order_date,status)
VALUES(1,'2019-01-01',1);

INSERT INTO order_items
VALUES(LAST_INSERT_ID(),1,1,2),
      (LAST_INSERT_ID(),2,3,4)

不难发现,上面的代码实现了新插入的行中order_id也出现在了两张不同的表上。

LAST_INSERT_ID:mysql内置函数之一,获取最后一条插入数据的id。

 

5.创建表复制(重点)

该节内容是要创建一张新表,并将一张表的部分数据复制到新表当中。

CREATE TABLE orders_archived 
SELECT * FROM orders

通过上述代码,会创造出一个与orders完全一模一样的表格orders_archived

右键点击orders_archived表格,然后点击truncate table,会弹出上图窗口。接下来直接点击truncate,就能把orders_archived中的所有数据清空(如下图示)

我们现在要把2019-01-01以前的订单复制到新表中,代码如下:

INSERT INTO orders_archived
SELECT *
FROM orders
WHERE order_date < '2019-01-01'

同时,也可以在创建表格的时候直接将2019-01-01以后的订单排除掉,通过下述代码即可实现。

CREATE TABLE orders_archived2
SELECT *
FROM orders
WHERE order_date < '2019-01-01'

总结:创造新表然后复制进去的东西,其实就是query中select出来的东西。因此我们在进行复制前,可以先运行看看,看query表把什么东西提取出来了(因此外连接、内连接全都支持)。

 

6.更新单行

把invoices表中的第一条(invoice_id = 1)数据更新,代码如下

USE sql_invoicing;

UPDATE invoices 
SET payment_total = 10,payment_date = '2019-03-01'
WHERE invoice_id = 1

更新时,set的内容也没有任何限制(就和select一样)

 

7.更新多行

现在需要把 client_id = 3 的信息全部都修改掉。

在某些版本的mysql引擎中一个where条件修改多条语句会报错,解决方法如下:

在mysqlworkbench中找到preferences,然后出现窗口以后点击sql editor,划到最后取消safe updates 勾选。

 

8.在updates中使用子查询

UPDATE invoices
SET payment_total = 10
WHERE client_id = 
				(SELECT client_id
                FROM clients
                WHERE name = 'Myworks')

子查询相当于在select中套了一层select。

技巧:可以先把一层select写出来并运行看看,然后再在外面套一层select。

 

 

9.删除行

DELETE FROM invoices
WHERE invoice_id = 1

上面的代码就是delete的基本格式,如果没有where,那就会把一整张表的数据全都删除。

 

10.恢复数据库

在file菜单中选择open SQL script,然后选择同一文件并点击确认,然后点击闪电图标……(同原来的操作)。这相当于把整个数据库的表格全都重置了一遍。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的医院挂号管理系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)

目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…

3.2-A-L1-2-第15讲-冒泡排序 mochen @denglexi

博观而约取 厚积而薄发 Observe extensively but select wisely; accumulate deeply but release sparingly. 每次比较两个相邻的元素&#xff0c;如果它们的顺序错误就把它 们交换过来。 每一轮进行两两比较&#xff0c;将该轮中最大/最小的值冒出来。 冒泡程序核心代码&#…

25、泛型

十二章、泛型 12-1 为何要有泛型 1、泛型&#xff1a;是一种标签。把元素的类型设计成一个参数&#xff0c;这个类型参数就叫做泛型 2、所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中 某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在…

[KEIL]单片机技巧 01

1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义&#xff0c;可以解决90%以上的单纯的片内外设bug&#xff0c;学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步&#xff0c;一定要善于使用这个工具&#xff0c;而不是外设…

TCP/IP 5层协议簇:网络层(IP数据包的格式、路由器原理)

目录 1. TCP/IP 5层协议簇 2. IP 三层包头协议 3. 路由器原理 4. 交换机和路由的对比 1. TCP/IP 5层协议簇 如下&#xff1a; 2. IP 三层包头协议 数据包如下&#xff1a;IP包头不是固定的&#xff0c;每一个数字是一个bit 其中数据部分是上层的内容&#xff0c;IP包头最…

免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全

软件技术 今天要给大家分享一款超实用的 PDF 处理工具&#xff0c;它免费又轻巧&#xff0c;如同随时待命的得力小帮手&#xff0c;功能之强大超乎想象&#xff0c;真的值得大家收藏。 这款工具是绿色版软件&#xff0c;解压后开启&#xff0c;满满的 PDF 处理功能便映入眼帘…

基于微信小程序的疫情互助平台(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;从2019年底新型冠状肺炎疫情的爆发以来&#xff0c;使很多工作的管理工作难度再上一层楼。为了在疫情期间能更好的维护信息管理&#xff0…

飞致云开源社区月度动态报告(2025年2月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

数据库拓展操作

目录 一、截断表&#xff1a; 操作目的&#xff1a; 操作内容&#xff1a; 性能影响&#xff1a; 基本语法&#xff1a; 例子&#xff1a; 二、插入查询结果&#xff1a; 基本语法&#xff1a; 例子&#xff1a; 三、聚合函数&#xff1a; 常用函数&#xff1a; 基…

在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境

前言 只因为在mac上没有找到合适的PHP开发集成环境&#xff0c;之前有安装了Eserver&#xff0c;但是安装一些常用PHP扩展有时候还是需要手动去编译添加。phpStudy也没有找到适合Mac的版本&#xff0c;在后面安装了Parallels Desktop虚拟机 来运行Ubuntu系统搭建了一套LNMP环境…

Node.js二:第一个Node.js应用

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 创建的时候我们需要用到VS code编写代码 我们先了解下 Node.js 应用是由哪几部分组成的&#xff1a; 1.引入 required 模块&#xff1a;我们可以使用 requi…

Excel基础(详细篇):总结易忽视的知识点,有用的细节操作

目录 基础篇Excel主要功能必会快捷键LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式数字格式日期格式文本…

vue3:四嵌套路由的实现

一、前言 1、嵌套路由的含义 嵌套路由的核心思想是&#xff1a;在某个路由的组件内部&#xff0c;可以定义子路由&#xff0c;这些子路由会渲染在父路由组件的特定位置&#xff08;通常是 <router-view> 标签所在的位置&#xff09;。通过嵌套路由&#xff0c;你可以实…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

【Python 数据结构 2.时间复杂度和空间复杂度】

Life is a journey —— 25.2.28 一、引例&#xff1a;穷举法 1.单层循环 所谓穷举法&#xff0c;就是我们通常所说的枚举&#xff0c;就是把所有情况都遍历了的意思。 例&#xff1a;给定n&#xff08;n ≤ 1000&#xff09;个元素ai&#xff0c;求其中奇数有多少个 判断一…

计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

西北工业大学计算机复试上机真题

西北工业大学计算机复试上机真题 历年西北工业大学计算机复试上机真题 西北工业大学计算机考研复试上机真题 2023西北工业大学计算机复试上机真题 2022西北工业大学计算机复试上机真题 在线评测地址&#xff1a;传送门 数组排序 题目描述 一组整数&#xff0c;由小到大排序…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…

数据结构(初阶)(七)----树和二叉树(堆,堆排序)

八&#xff0c;树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀…