参考博客(史上最简单的mysql教程):https://blog.csdn.net/qq_35246620/article/details/70823903
SQL:Structured Query Language,结构化查询语言(数据以查询为主,99% 都是在进行查询操作)。
SQL 主要分为三种:
DDL:Data Definition Language,数据定义语言,用来维护存储数据的结构(数据库、表),代表指令为create、drop和alter等。
DML:Data Manipulation Language,数据操作语言,用来对数据进行操作(表中的内容)代表指令为insert、delete和update等,不过在 DML 内部又单独进行了一个分类,即 DQL(Data Query Language),数据查询语言,代表指令为select.
DCL:Data Control Language,数据控制语言,主要是负责(用户)权限管理,代表指令为grant和revoke等。
SQL 是关系型数据库的操作指令,是一种约束,但不强制,类似于 W3C,因此这意味着:不同的数据库产品(如 Oracle 和 MySQL)内部可能会有一些细微的区别。
---------------------
由于没办法完全了解服务器内部的结构,因此只能粗略的分析数据库服务器的内部结构。
一般来说,将 MySQL 数据库服务器的内部对象分为四层,分别为:数据管理系统(DBMS)–> 数据库(DB)–> 表(Table)–> 字段(Filed)
---------------------
基本操作:CURD,即增删改查。
根据操作对象的不同,咱们可以将 SQL 的基本操作分为三类,分别为:库操作、表(字段)操作和数据操作。
现阶段,只有 InnoDB 和 BDB 两个存储引擎是支持事务安全机制的,其中 InnoDB 免费,BDB 收费。因此,InnoDB 使用的最为广泛。事务安全,是一种保护连续操作同时实现(完成)的机制。事务安全的意义就是,保证数据操作的完整性。
1、开启事务:start transaction; 可以设置回滚点:
2、执行语句,实际不直接修改表结构,而是先存入事务日志。
3、提交事务:commit,回滚事务:rollback。(只能在事务提交前回滚事务,提交后不可再回滚)
原子性:Atomic,表示事务的整个操作是一个整体,是不可分割的,要么全部成功,要么全部失败;
一致性:Consistency,表示事务操作的前后,数据表中的数据处于一致状态;
隔离性:Isolation,表示不同的事务操作之间是相互隔离的,互不影响;
持久性:Durability,表示事务一旦提交,将不可修改,永久性的改变数据表中的数据。
---------------------
唯一键与主键本质相同,区别在于:唯一键允许字段值为空,并且允许多个空值存在。
---------------------
sql优化:
1、索引。
2、在内连接的时候可以使用where
关键字代替on
,但不建议这么做,因为where
没有on
的效率高。
---------------------
范式:Normal Farmat
,是为了解决数据的存储和优化问题。
范式是一种分层结构的规范,共 6 层,分别为1NF
、2NF
、3NF
、4NF
、5NF
和6NF
,每一层都比上一层严格,若要满足下一层范式,其前提是先满足上一层范式。其中,1NF
是最底层的范式,6NF
为最高层的范式,也最严格。
范式在数据库的设计中是有指导意义的,但不是强制规范。
---------------------
数据的删除是不会改变表结构的。如果想要还原自增长属性,思路是:先删除表,然后重新建表。
truncate + 表名;
---------------------
1、函数group_concat(字段名)
可以对分组的结果中的某个字段值进行字符串连接,即保留该组某个字段的所有值。
2、回溯统计,利用with rollup
关键字(书写在 SQL 语句末尾),可以在每次分组过后,根据当前分组的字段进行统计,并向上一级分组进行汇报。例如:
3、
---------------------
limit
子句limit
子句:是一种限制结果的语句,通常来限制结果的数量。
limit + [offset] + length;
其中,offset
为起始值;length
为长度。可用于分页。
---------------------
自然连接(nature join)自动使用同名字段作为连接条件,而且在连接完成之后合并同名字段。
---------------------
1)在 student 表中,按年龄,男升女降
(select * from student where gender = "boy" order by age asc limit 666)
union
(select * from student where gender = "girl" order by age desc limit 666);
2)-- 列子查询 -- 其中,(age, height) 称之为行元素
select * from student where (age, height) = (select max(age), max(height) from student);
3)需求:找出每个班身高最高的学生。
思路:1、先确定数据源,将学生按身高进行降序排序。 select * from student order by height desc;
2、从每个班级选出第一个学生。 select * from student group by c_id;
在这里,我们可能会有些疑问:为什么要将学生表降序排序?为什么从每个班级选出第一个学生就可以?这是因为group by(分组)只会取表中分组字段的第一条记录,而当我们将学生表按身高降序排序时,(每组)身高最高的学生就会出现在第一位。
执行如下 SQL 语句,进行测试:
-- 表子查询
select * from
-- 关键字 from 后面接表名
(select * from student order by height desc) as student
-- 按 c_id 进行分组
group by c_id;
4)exists子查询
exists:表示是否存在的意思,因此exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后,其返回的结果为1或0,满足条件为1,反之为0.
需求:在班级存在的前提下,查询所有的学生。
思路:先确定数据源。
select * from student where ?;
然后确定条件是否满足。
exists(select * from class);
---------------------
---------------------
子查询:
any
等价于in
,表示其中一个;any
等价于smoe
,而any
和some
用于否定时却有些区别;all
表示等于全部。字段处理:enclosed by:指定字段用什么内容包裹,默认是,空字符串;
terminated by:指定字段以什么结束,默认是\t,Tab键;
escaped by:指定特殊符号用什么方式处理,默认是\\,反斜线转义。
行处理:starting by:指定每行以什么开始,默认是,空字符串;
terminated by:指定每行以什么结束,默认是\r\n,换行符。
---------------------