SQL

参考博客(史上最简单的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)

--------------------- 

SQL 基本操作

基本操作: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 层,分别为1NF2NF3NF4NF5NF6NF,每一层都比上一层严格,若要满足下一层范式,其前提是先满足上一层范式。其中,1NF是最底层的范式,6NF为最高层的范式,也最严格。

范式在数据库的设计中是有指导意义的,但不是强制规范

--------------------- 

数据的删除是不会改变表结构的。如果想要还原自增长属性,思路是:先删除表,然后重新建表

  • 基本语法truncate + 表名;

--------------------- 

1、函数group_concat(字段名)可以对分组的结果中的某个字段值进行字符串连接,即保留该组某个字段的所有值。

2、回溯统计,利用with rollup关键字(书写在 SQL 语句末尾),可以在每次分组过后,根据当前分组的字段进行统计,并向上一级分组进行汇报。例如:

9

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,而anysome用于否定时却有些区别;
  • all表示等于全部。

字段处理:enclosed by:指定字段用什么内容包裹,默认是,空字符串;
terminated by:指定字段以什么结束,默认是\t,Tab键;
escaped by:指定特殊符号用什么方式处理,默认是\\,反斜线转义。
行处理:starting by:指定每行以什么开始,默认是,空字符串;
terminated by:指定每行以什么结束,默认是\r\n,换行符。

4
--------------------- 

--------------------- 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值