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 以及配置。
例如:SELECT
与 select
、Select
是相同的。
- 多条 SQL 语句必须以分号(
;
)分隔。 - SQL 语句可以写成一行,也可以分写为多行。
1 | -- 一行 SQL 语句 |
- SQL 支持三种注释
1 | ## 注释1 |
增删改查
增删改查,又称为 CRUD,数据库基本操作中的基本操作。
插入数据
1 | INSERT INTO 语句用于向表中插入新记录。 |
插入完整的行
1 | INSERT INTO user |
插入行的一部分
1 | INSERT INTO user(username, password, email) |
插入查询出来的数据
1 | INSERT INTO user(username) |
更新数据
UPDATE
语句用于更新表中的记录。
1 | UPDATE user |
删除数据
DELETE
语句用于删除表中的记录。TRUNCATE TABLE
可以清空表,也就是删除所有行。
删除表中的指定数据
1 | DELETE FROM user |
清空表中的数据
1 | TRUNCATE TABLE user; |
查询数据
1 | SELECT:语句用于从数据库中查询数据。 |
查询单列
1 | SELECT prod_name |
查询多列
1 | SELECT prod_id, prod_name, prod_price |
查询所有列
1 | ELECT * |
查询不同的值
1 | SELECT DISTINCT |
限制查询结果
1 | -- 返回前 5 行 |
子查询
子查询是嵌套在较大查询中的 SQL 查询。子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。
子查询可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 语句内或另一个子查询中。
子查询通常会在另一个 SELECT 语句的 WHERE 子句中添加。
您可以使用比较运算符,如 >,<,或 =。比较运算符也可以是多行运算符,如IN,ANY 或 ALL。
子查询必须被圆括号 () 括起来。
内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询。
子查询的子查询
1 | SELECT cust_name, cust_contact |
WHERE
WHERE
子句用于过滤记录,即缩小访问数据的范围。WHERE
后跟一个返回true
或false
的条件。WHERE
可以与SELECT
,UPDATE
和DELETE
一起使用。- 可以在
WHERE
子句中使用的操作符
SELECT
语句中的 WHERE
子句
1 | SELECT * FROM Customers |
UPDATE
语句中的 WHERE
子句
1 | UPDATE Customers |
DELETE
语句中的 WHERE
子句
1 | DELETE FROM Customers |
IN 和 BETWEEN
IN
操作符在WHERE
子句中使用,作用是在指定的几个特定值中任选一个值。BETWEEN
操作符在WHERE
子句中使用,作用是选取介于某个范围内的值。
IN 示例
1 | SELECT * |
BETWEEN 示例
1 | SELECT * |
AND、OR、NOT
AND
、OR
、NOT
是用于对过滤条件的逻辑处理指令。AND
优先级高于OR
,为了明确处理顺序,可以使用()
。AND
操作符表示左右条件都要满足。OR
操作符表示左右条件满足任意一个即可。NOT
操作符用于否定一个条件。
AND 示例
1 | SELECT prod_id, prod_name, prod_price |
OR 示例
1 | SELECT prod_id, prod_name, prod_price |
NOT 示例
1 | SELECT * |
LIKE
LIKE
操作符在WHERE
子句中使用,作用是确定字符串是否匹配模式。- 只有字段是文本值时才使用
LIKE
。 LIKE
支持两个通配符匹配选项:%
和_
。- 不要滥用通配符,通配符位于开头处匹配会非常慢。
%
表示任何字符出现任意次数。_
表示任何字符出现一次。
% 示例
1 | SELECT prod_id, prod_name, prod_price |
_ 示例
1 | SELECT prod_id, prod_name, prod_price |
连接和组合
连接(JOIN)
如果一个 JOIN 至少有一个公共字段并且它们之间存在关系,则该 JOIN 可以在两个或多个表上工作。
连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE。
JOIN 保持基表(结构和数据)不变。
JOIN 有两种连接类型:内连接和外连接。
内连接又称等值连接,使用 INNER关键字。在没有条件语句的情况下返回笛卡尔积。
自连接可以看成内连接的一种,只是连接的表是自身而已。
自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。
内连接 vs 自然连接
内连接提供连接的列,而自然连接自动连接所有同名列。
外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不支持)。
左外连接就是保留左表没有关联的行。
右外连接就是保留右表没有关联的行。
连接 vs 子查询
连接可以替换子查询,并且比子查询的效率一般会更快。
内连接(INNER JOIN)
1 | SELECT vend_name, prod_name, prod_price |
自连接
1 | SELECT c1.cust_id, c1.cust_name, c1.cust_contact |
自然连接(NATURAL JOIN)
1 | SELECT * |
左连接(LEFT JOIN)
1 | SELECT customers.cust_id, orders.order_num |
右连接(RIGHT JOIN)
1 | SELECT customers.cust_id, orders.order_num |
组合(UNION)
UNION
运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自UNION
中参与查询的提取行。
基本规则
所有查询的列数和列顺序必须相同。
每个查询中涉及表的列的数据类型必须相同或兼容。
通常返回的列名取自第一个查询。
默认会去除相同行,如果需要保留相同行,使用 UNION ALL。
只能包含一个 ORDER BY 子句,并且必须位于语句的最后。
应用场景
在一个查询中从不同的表返回结构数据。
对一个表执行多个查询,按一个查询返回数据。
组合查询
1 | SELECT cust_name, cust_contact, cust_email |
JOIN vs UNION
JOIN
中连接表的列可能不同,但在UNION
中,所有查询的列数和列顺序必须相同。UNION
将查询之后的行放在一起(垂直放置),但JOIN
将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。
函数
文本处理
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。
1 | SELECT * |
日期和时间处理
- 日期格式:
YYYY-MM-DD
- 时间格式:
HH:MM:SS
1 | mysql> SELECT NOW(); |
结果:
数值处理
汇总
AVG()
会忽略 NULL 行。
使用 DISTINCT 可以让汇总函数值汇总不同的值。
1 | SELECT AVG(DISTINCT col1) AS avg_col |
排序和分组
ORDER BY
- 用于对结果集进行排序。
ASC
:升序(默认)DESC
:降序- 可以按多个列进行排序,并且为每个列指定不同的排序方式
指定多个列的排序方向
1 | SELECT * FROM products |
GROUP BY
GROUP BY 子句将记录分组到汇总行中。
GROUP BY 为每个组返回一个记录。
GROUP BY 通常还涉及聚合:COUNT,MAX,SUM,AVG 等。
GROUP BY 可以按一列或多列进行分组。
GROUP BY 按分组字段进行排序后,ORDER BY 可以以汇总字段来进行排序。
分组
1 | SELECT cust_name, COUNT(cust_address) AS addr_num |
分组后排序
1 | SELECT cust_name, COUNT(cust_address) AS addr_num |
HAVING
HAVING
用于对汇总的GROUP BY
结果进行过滤。HAVING
要求存在一个GROUP BY
子句。WHERE
和HAVING
可以在相同的查询中。HAVING
vsWHERE
WHERE
和HAVING
都是用于过滤。HAVING
适用于汇总的组记录;而 WHERE 适用于单个记录。
使用 WHERE 和 HAVING 过滤数据
1 | SELECT cust_name, COUNT(*) AS num |