牛客题收获
基础
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>
执行顺序:
1.from 2.where 3.group by 4.having 5.select 6.order by 7.limit..
2 .数据操纵语言DML
数据操纵语言==DML== 主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象—–表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的!不能rollback
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚—ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
3) COMMIT [WORK]:提交。在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。
删除
delete 可以精确删除,只删除表的数据,不会删除结构。
truncate 能删除表的数据,也能删除表的结构
drop 完全删除表
联结
Mysql(版本8.0.25)不支持full join
on中相同的key匹配上时会产生笛卡尔积
inner join会忽略null值,right/left join则不会忽略null值
左右联结
下面就左联结和右联结进行详细区分:
- 左联结(LEFT JOIN):左联结检索两个表中的所有行,同时只返回在左表中存在的行和与右表中匹配的行。左联结总是包含左边的表中的所有行,即使没有任何匹配。
在下面的例子中,我们使用LEFT JOIN将两个表中的数据连接起来:
1
2
3
4SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;在这个例子中,所有table1中的记录都将包括在内。如果table2中不存在相应的ID,则将返回NULL值。
- 右联结(RIGHT JOIN):右联结与左联结相似,它返回右表中的所有行和与左表中匹配的行,如果左表中没有匹配项,则返回NULL。
在下面的例子中,我们使用RIGHT JOIN将两个表中的数据连接起来:
1
2
3
4SELECT *
FROM table1
RIGHT JOIN table2
ON table1.id = table2.id;与左联结不同,右联结总是包含右边的表中的所有行,即使没有任何匹配。
简而言之,使用左联结和右联结在将两个表中的数据组合起来时有不同的重点。关于union all合并同类项能解释解释吗。选择左联结还是右联结,应该根据实际情况来确定。
UNION 联结与 UNION ALL联结
- MySQL 中的 UNION 操作符会将多个 SELECT 语句的结果合并成一个结果集,但会自动去除重复的行。具体地说,当 UNION 合并两个或多个结果集时,会对结果集中的每一行进行比较,如果两行的值完全相同,则只保留其中的一行,其它重复的行都被过滤掉。
- UNION ALL 是将多个 SELECT 语句的结果合并成一个结果集的操作符。与 UNION 不同的是,UNION ALL 不会移除重复的行,即保留所有的行而不进行去重。因此,它可以用来合并同类项。
- 在使用 UNION ALL 来模拟 FULL OUTER JOIN 的时候,我们应该非常注意 WHERE 子句的使用,确保只包含我们需要的记录,并且不会包含不存在的记录。
函数
SUBSTRING_INDEX
是 MySQL 中一个常用的字符串函数,用于获取一个字符串中指定分隔符出现的次数之前或之后的子串。该函数的语法如下:1
SUBSTRING_INDEX(str, delim, count)
其中:
str
:要操作的字符串。delim
:分隔符。count
:需要返回的子串在被分隔符分隔后的位置。如果count
为正数,则返回分隔符之前的子串,如果count
为负数,则返回分隔符之后的子串。
以下是一些示例:
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 1);
,结果为'www'
,因为它是第一个.
之前的子串。SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
,结果为'www.mysql'
,因为它是第二个.
之前的子串。SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
,结果为'mysql.com'
,因为它是倒数第二个.
之后的子串。
需要注意的是,如果要获取到分隔符本身,还需要自行处理一下。例如,如果要获取第一个
.
之后的子串,可以使用以下查询:1
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -1);
但如果要同时获取分隔符,可以使用以下查询:
1
SELECT CONCAT('.', SUBSTRING_INDEX('www.mysql.com', '.', -1));
MySQL 中使用 REGEXP 来操作正则表达式的匹配。其中
^ 该符号表示匹配输入字符串的开始位置;
$表示匹配输入字符串的末尾位置;
[…] 表示匹配所包含的任意一个字符;
[^…]表示不能匹配括号内的任意单个字符;
x|y 这条竖线表示匹配x 或匹配y。
通过
CHARINDEX
如果能够找到对应的字符串,则返回该字符串位置i(有效位置范围为1<= i <= length(input)),否则返回0。注意位置是从1开始\。
基本语法如下:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
expressionToFind :目标字符串,就是想要找到的字符串,最大长度为8000 。
expressionToSearch :用于被查找的字符串。
start_location:开始查找的位置,为空时默认从第一位开始查找。
游标
游标是一种从包括多条数据记录的结果集中每次提取一条记录以便处理的机制,可以看做是查询结果的记录指针。
- 游标允许定位在结果集的特定行;
- 从结果集的当前位置检索一行或一部分行;
- 支持对结果集中当前位置的行进行数据修改。
- 为由其他用户对显示在结果集中的数据所做的更改提供不同级别的可见性支持
事务
事务是最小的执行单位,不允许分割;原子性
执行事务前后,数据保持一致,对同一数据读取的结果相同;一致性
一个事务被提交后对数据库中数据的改变是持久的。持久性
并发访问数据库时,各并发事务之间数据库是独立的。隔离性
锁
- ==共享锁== 用于不更改或不更新数据的读取操作 ,如SELECT语句
- ==更新锁== 用于可更新的资源中,防止当多个会话在读取、锁定以及随后可能进行的资源更换时发生常见形式的死锁
- ==排它锁== 用于数据修改操作,确保不会同时对同一资源进行多重更新
- ==架构锁== 在执行依赖于表架构的操作时使用
- A选项,用于不更改或不更新数据的读取操作,如SELECT语句;B选项,用于可更新的资源中,防止当多个会话在读取、锁定以及随后可能进行的资源更换时发生常见形式的死锁;D选项,在执行依赖于表架构的操作时使用。