Mysql语法(2)

字段属性

主键, 唯一键和自增长.

主键

主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.

一张表只能有最多一个主键.

增加主键

SQL操作中有多种方式可以给表增加主键: 大体分为三种.

方案1: 在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)

优点: 非常直接; 缺点: 只能使用一个字段作为主键

方案2: 在创建表的时候, 在所有的字段之后, 使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)

方案3: 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加.
Alter table 表名 add primary key(字段列表);

更新主键 & 删除主键

没有办法更新主键: 主键必须先删除,才能增加.

Alter table 表名 drop primary key;

主键分类

在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号); 大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段主键称之为逻辑主键.

Create table my_student(
Id int primary key auto_increment comment ‘逻辑主键: 自增长’,  -- 逻辑主键
Number char(10) not null  comment ‘学号’,
Name varchar(10) not null
)

自动增长

自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发, 系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段.

自增长通常是跟主键搭配.

新增自增长

自增长特点: auto_increment
1.任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值)
2.自增长字段必须是数字(整型)

3.一张表最多只能有一个自增长

自增长使用

当自增长被给定的值为NULL或者默认值的时候会触发自动增长.

自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最大值+1)

如何确定下一次是什么自增长呢? 可以通过查看表创建语句看到.

修改自增长

自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)

修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效)
Alter table 表名 auto_increment = 值;
思考: 为什么自增长是从1开始?为什么每次都是自增1呢?
所有系统的变现(如字符集,校对集)都是由系统内部的变量进行控制的.
查看自增长对应的变量: show variables like ‘auto_increment%’;

可以修改变量实现不同的效果: 修改是对整个数据修改,而不是单张表: (修改是会话级)

    Set auto_increment_increment = 5; -- 一次自增5

删除自增长

自增长是字段的一个属性: 可以通过modify来进行修改(保证字段没有auto_increment即可)
Alter table 表名 modify 字段 类型;

唯一键

一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.

唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

增加唯一键

方案1: 在创建表的时候,字段之后直接跟unique/ unique key
方案2: 在所有的字段之后增加unique key(字段列表); – 复合唯一键
方案3: 在创建表之后增加唯一键

更新唯一键 & 删除唯一键

更新唯一键: 先删除后新增(唯一键可以有多个: 可以不删除).

删除唯一键
Alter table 表名 drop unique key; – 错误: 唯一键有多个
Alter table 表名 drop index 索引名字; – 唯一键默认的使用字段名作为索引名字

索引

几乎所有的索引都是建立在字段之上.
索引: 系统根据某种算法, 将已有的数据(未来可能新增的数据),单独建立一个文件: 文件能够实现快速的匹配数据, 并且能够快速的找到对应表中的记录.

索引的意义

1.提升查询数据的效率
2.约束数据的有效性(唯一性等)

增加索引的前提条件: 索引本身会产生索引文件(有时候有可能比数据文件还大) ,会非常耗费磁盘空间.

如果某个字段需要作为查询的条件经常使用, 那么可以使用索引(一定会想办法增加);
如果某个字段需要进行数据的有效性约束, 也可能使用索引(主键,唯一键)

Mysql中提供了多种索引

1.主键索引: primary key
2.唯一索引: unique key
3.全文索引: fulltext index
4.普通索引: index

全文索引: 针对文章内部的关键字进行索引
全文索引最大的问题: 在于如何确定关键字

英文很容易: 英文单词与单词之间有空格
中文很难: 没有空格, 而且中文可以各种随意组合(分词: sphinx)

新增数据
基本语法

Insert into 表名 [(字段列表)] values (值列表);

在数据插入的时候, 假设主键对应的值已经存在: 插入一定会失败!

更新数据

基本语法

Update 表名 set 字段 = 值 [where条件];

高级新增语法

Update 表名 set 字段 = 值 [where条件] [limit 更新数量];

删除数据

与更新类似: 可以通过limit来限制数量

Delete from 表名 [where条件] [limit 数量];

查询数据

基本语法
Select 字段列表/* from 表名 [where条件];

完整语法
Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句] [limit 子句];

Where子句

Where子句: 用来判断数据,筛选数据.
Where子句返回结果: 0或者1, 0代表false,1代表true.

判断条件:
比较运算符: >, <, >=, <= ,!= ,<>, =, like, between and, in/not in
逻辑运算符: &&(and), ||(or), !(not)

Where原理: where是唯一一个直接从磁盘获取数据的时候就开始判断的条件: 从磁盘取出一条记录, 开始进行where判断: 判断的结果如果成立保存到内存;如果失败直接放弃.

Group by子句

Group by:分组的意思, 根据某个字段进行分组(相同的放一组,不同的分到不同的组)

分组的意思: 是为了统计数据(按组统计: 按分组字段进行数据统计)
SQL提供了一系列统计函数

Count(): 统计分组后的记录数: 每一组有多少记录
    Max():  统计每组中最大的值
    Min(): 统计最小值
    Avg(): 统计平均值
    Sum(): 统计和

分组会自动排序: 根据分组字段:默认升序
Group by 字段 [asc|desc]; – 对分组的结果然后合并之后的整个结果进行排序
Having子句
Having子句: 与where子句一样: 进行条件判断的.

Where是针对磁盘数据进行判断: 进入到内存之后,会进行分组操作: 分组结果就需要having来处理.

Having能做where能做的几乎所有事情, 但是where却不能做having能做的很多事情.

1.分组统计的结果或者说统计函数都只有having能够使用.

Order by子句

Order by: 排序, 根据某个字段进行升序或者降序排序, 依赖校对集.

使用基本语法
Order by 字段名 [asc|desc]; – asc是升序(默认的),desc是降序

Limit子句

Limit子句是一种限制结果的语句: 限制数量.

Limit有两种使用方式

Limit方案2主要用来实现数据的分页: 为用户节省时间,提交服务器的响应效率, 减少资源的浪费.
对于用户来讲: 可以点击的分页按钮: 1,2,3,4
对于服务器来讲: 根据用户选择的页码来获取不同的数据: limit offset,length;

Length: 每页显示的数据量: 基本不变
Offset: offset = (页码 - 1) * 每页显示量

连接查询

连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)

连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

连接查询: join, 使用方式: 左表 join 右表
左表: 在join关键字左边的表
右表: 在join关键字右边的表

内连接

内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

基本语法
左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

外连接

外连接: outer join, 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能比配,正确保留; 不能匹配,其他表的字段都置空NULL.

外连接分为两种: 是以某张表为主: 有主表
Left join: 左外连接(左连接), 以左表为主表
Right join: 右外连接(右连接), 以右表为主表

基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

猜你喜欢

转载自blog.csdn.net/qq_35433716/article/details/82469235
今日推荐