获取中...

-

Just a minute...

mysql基础

sql简介

​ SQL(Structured Query Language 结构化查询语句)是一种特定目的程序语言,用于管理关系数 据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。 SQL基于关系代数和元组关系演算,包括一个数据定义语言和数据操纵语言。SQL的范围包括数据 插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

sql作用

•SQL 面向数据库执行查询

•SQL 可从数据库取回数据

•SQL 可在数据库中插入新的记录

•SQL 可更新数据库中的数据

•SQL 可从数据库删除记录

•SQL 可创建新数据库

•SQL 可在数据库中创建新表

•SQL 可在数据库中创建存储过程

•SQL 可在数据库中创建视图

•SQL 可以设置表、存储过程和视图的权限

sql的优点

1.SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支诗SQL,所以学习 此语言使你几乎能与所有数据库打交道。

2.SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。

3.SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非 常复杂和高级 的数据库操作

sql语法简介

数据库术语

  • 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。

  • 数据表(table) - 某种特定类型数据的结构化清单。

  • 模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。

  • 列(column) - 表中的一个字段。所有表都是由一个或多个列组成的。

  • 行(row) - 表中的一个记录。

  • 主键(primary key) - 一列(或一组列),其值能够唯一标识表中每一行。

SQL 语法

语法结构

  • 子句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。)

  • 表达式 - 可以产生任何标量值,或由列和行的数据库表

  • 谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。

  • 查询 - 基于特定条件检索数据。这是 SQL 的一个重要组成部分。

  • 语句 - 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。

语法要点

  • SQL 语句不区分大小写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。

例如:SELECTselectSelect 是相同的。

  • 多条 SQL 语句必须以分号(;)分隔
  • SQL 语句可以写成一行,也可以分写为多行。
1
2
3
4
5
6
7
-- 一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';

-- 多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
  • SQL 支持三种注释
1
2
3
## 注释1
-- 注释2
/* 注释3 */

增删改查

增删改查,又称为 CRUD,数据库基本操作中的基本操作。

插入数据
1
INSERT INTO 语句用于向表中插入新记录。
插入完整的行
1
2
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com');

插入行的一部分

1
2
INSERT INTO user(username, password, email)
VALUES ('admin', 'admin', 'xxxx@163.com');
插入查询出来的数据
1
2
3
INSERT INTO user(username)
SELECT name
FROM account;
更新数据
  • UPDATE 语句用于更新表中的记录。
1
2
3
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
删除数据
  • DELETE 语句用于删除表中的记录。
  • TRUNCATE TABLE 可以清空表,也就是删除所有行。

删除表中的指定数据

1
2
DELETE FROM user
WHERE username = 'robot';

清空表中的数据

1
TRUNCATE TABLE user;
查询数据
1
2
3
4
5
SELECT:语句用于从数据库中查询数据。
DISTINCT:用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。
LIMIT:限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。
ASC :升序(默认)
DESC :降序

查询单列

1
2
SELECT prod_name
FROM products;

查询多列

1
2
SELECT prod_id, prod_name, prod_price
FROM products;

查询所有列

1
2
ELECT *
FROM products;

查询不同的值

1
2
SELECT DISTINCT
vend_id FROM products;

限制查询结果

1
2
3
4
5
-- 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
-- 返回第 3 ~ 5 行
SELECT * FROM mytable LIMIT 2, 3;
子查询

子查询是嵌套在较大查询中的 SQL 查询。子查询也称为内部查询内部选择,而包含子查询的语句也称为外部查询外部选择

  • 子查询可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 语句内或另一个子查询中。

  • 子查询通常会在另一个 SELECT 语句的 WHERE 子句中添加。

  • 您可以使用比较运算符,如 >,<,或 =。比较运算符也可以是多行运算符,如IN,ANY 或 ALL。

  • 子查询必须被圆括号 () 括起来。

  • 内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询。

子查询的子查询

1
2
3
4
5
6
7
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'RGAN01'));
WHERE
  • WHERE 子句用于过滤记录,即缩小访问数据的范围。
  • WHERE 后跟一个返回 truefalse 的条件。
  • WHERE 可以与 SELECTUPDATEDELETE 一起使用。
  • 可以在 WHERE 子句中使用的操作符

image-20230810135733501

SELECT 语句中的 WHERE 子句

1
2
SELECT * FROM Customers
WHERE cust_name = 'Kids Place';

UPDATE 语句中的 WHERE 子句

1
2
3
UPDATE Customers
SET cust_name = 'Jack Jones'
WHERE cust_name = 'Kids Place';

DELETE 语句中的 WHERE 子句

1
2
DELETE FROM Customers
WHERE cust_name = 'Kids Place';
IN 和 BETWEEN
  • IN 操作符在 WHERE 子句中使用,作用是在指定的几个特定值中任选一个值。
  • BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于某个范围内的值。

IN 示例

1
2
3
SELECT *
FROM products
WHERE vend_id IN ('DLL01', 'BRS01');

BETWEEN 示例

1
2
3
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
AND、OR、NOT
  • ANDORNOT 是用于对过滤条件的逻辑处理指令。
  • AND 优先级高于 OR,为了明确处理顺序,可以使用 ()
  • AND 操作符表示左右条件都要满足。
  • OR 操作符表示左右条件满足任意一个即可。
  • NOT 操作符用于否定一个条件。

AND 示例

1
2
3
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;

OR 示例

1
2
3
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

NOT 示例

1
2
3
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
LIKE
  • LIKE 操作符在 WHERE 子句中使用,作用是确定字符串是否匹配模式。
  • 只有字段是文本值时才使用 LIKE
  • LIKE 支持两个通配符匹配选项:%_
  • 不要滥用通配符,通配符位于开头处匹配会非常慢。
  • % 表示任何字符出现任意次数。
  • _ 表示任何字符出现一次。

% 示例

1
2
3
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '%bean bag%';

_ 示例

1
2
3
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '__ inch teddy bear';

连接和组合

连接(JOIN)
  • 如果一个 JOIN 至少有一个公共字段并且它们之间存在关系,则该 JOIN 可以在两个或多个表上工作。

  • 连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。

  • JOIN 保持基表(结构和数据)不变。

  • JOIN 有两种连接类型:内连接和外连接。

  • 内连接又称等值连接,使用 INNER关键字。在没有条件语句的情况下返回笛卡尔积。

  • 自连接可以看成内连接的一种,只是连接的表是自身而已。

  • 自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。

  • 内连接 vs 自然连接

  • 内连接提供连接的列,而自然连接自动连接所有同名列。

  • 外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不支持)。

  • 左外连接就是保留左表没有关联的行。

  • 右外连接就是保留右表没有关联的行。

  • 连接 vs 子查询

  • 连接可以替换子查询,并且比子查询的效率一般会更快。

内连接(INNER JOIN)
1
2
3
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自连接
1
2
3
4
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
自然连接(NATURAL JOIN)
1
2
3
SELECT *
FROM Products
NATURAL JOIN Customers;
左连接(LEFT JOIN)
1
2
3
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
右连接(RIGHT JOIN)
1
2
3
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
组合(UNION)
  • UNION 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 UNION 中参与查询的提取行。

基本规则

  • 所有查询的列数和列顺序必须相同。

  • 每个查询中涉及表的列的数据类型必须相同或兼容。

  • 通常返回的列名取自第一个查询。

  • 默认会去除相同行,如果需要保留相同行,使用 UNION ALL。

  • 只能包含一个 ORDER BY 子句,并且必须位于语句的最后。

应用场景

  • 在一个查询中从不同的表返回结构数据。

  • 对一个表执行多个查询,按一个查询返回数据。

组合查询

1
2
3
4
5
6
7
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';
JOIN vs UNION
  • JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。
  • UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。

函数

文本处理

image-20230810141620234

其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。

1
2
3
SELECT *
FROM mytable
WHERE SOUNDEX(col1) = SOUNDEX('apple')
日期和时间处理
  • 日期格式:YYYY-MM-DD
  • 时间格式:HH:MM:SS

image-20230810141727595

1
mysql> SELECT NOW();

结果:

image-20230810141812496

数值处理

image-20230810141919006

汇总

image-20230810141941889

AVG() 会忽略 NULL 行。

使用 DISTINCT 可以让汇总函数值汇总不同的值。

1
2
SELECT AVG(DISTINCT col1) AS avg_col
FROM mytable;

排序和分组

ORDER BY
  • 用于对结果集进行排序。
  • ASC:升序(默认)
  • DESC :降序
  • 可以按多个列进行排序,并且为每个列指定不同的排序方式

指定多个列的排序方向

1
2
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
GROUP BY

GROUP BY 子句将记录分组到汇总行中。

GROUP BY 为每个组返回一个记录。

GROUP BY 通常还涉及聚合:COUNT,MAX,SUM,AVG 等。

GROUP BY 可以按一列或多列进行分组。

GROUP BY 按分组字段进行排序后,ORDER BY 可以以汇总字段来进行排序。

分组

1
2
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;

分组后排序

1
2
3
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
HAVING
  • HAVING 用于对汇总的 GROUP BY 结果进行过滤。

  • HAVING 要求存在一个 GROUP BY 子句。

  • WHEREHAVING 可以在相同的查询中。

  • HAVING vs WHERE

  • WHEREHAVING 都是用于过滤。

  • HAVING 适用于汇总的组记录;而 WHERE 适用于单个记录。

使用 WHERE 和 HAVING 过滤数据

1
2
3
4
5
SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;
相关文章
评论
分享
  • sqlmap

    sqlmap简介SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL S...

    sqlmap
  • php基础

    PHP基础PHP,全称 “Hypertext Preprocessor”,是一种流行的服务器端编程脚本语言,被广泛用于Web开发。 这里也不得不介绍phpstudy,phpstudy是一个PHP调试环境的程序集成包。该程序包集成最新的...

    php基础
  • 数据库基础

    数据库基础什么是数据库?​ 数据库(database,又名电子化的文件柜)就是存储数据的仓库。数据库是一个以某种有结构的有顺序存储的 数据集合,理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个 存放数据的物理位置,...

    数据库基础
  • 计算机基础之操作系统常用命令

    windows操作系统常用命令1.目录操作命令:cd:改变当前目录 例:cd c:\test dir:显示目录中的文件和子目录列表 type:显示文本文件中的内容 例:type test.txt echo:显示消息 用echo 将内...

    计算机基础之操作系统常用命令
  • 计算机基础之HTTP

    HTTPHTTP,即超文本传输协议,是一种实现客户端和服务器之间通信的响应协议,它是用作客户端和服务器之间的请求。 客户端(浏览器)会向服务器提交HTTP请求;然后服务器向客户端返回响应;其中响应包含有关请求的状态信息,还可能包含请求...

    计算机基础之HTTP
  • markdown语法

    Markdown基本语法1.分级标题示例:1234567# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题这个写法和 **文字**效果是一样的 输出的结果: 一级标题二级标题三级标...

    markdown语法
  • 图床搭建

    使用Github+picGo搭建图床引子:图床是互联网中存储图片的空间,别人通过互联网看到你在博客里边分享的图片,肯定不是直接去访问你电脑相册,分享的图片得先上传到博客的服务器,博客为你生成一个独一无二的访问链接,这个链接指向的空间就...

    图床搭建
  • 信息收集

    首先,我们得先了解信息收集是什么?​ 信息收集(Information Gathering)是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步,也是关键的一步。信息收集工作的好坏,直接关系到整个信息管理工作...

    信息收集
  • 如何配置主题

    有了博客以后,就需要对博客进行美化,所以有一个美观、个性的主题是必不可少的主题配置流程 可以在HEXO官网(https://hexo.io/themes)上找一款自己喜欢的主题 把主题压缩下载,下载完成后解压到blog/t...

    如何配置主题
  • 做一个只属于自己的博客

    利用github搭建hexo博客准备前提 提前安装好(node.js),打开[https://nodejs.org/en],选择左边那个 提前安装好(Git)[https://git-scm.com/downloads] ...

    做一个只属于自己的博客