SQL 的基本操作CRUD

SQL基本操作

基本操作: CRUD.
将SQL 的基本操作根据操作对象进行分类: 分为三类: 库操作, 表操作(字段), 数据操作.

库操作:

对数据库的增删改查.

新增数据库

Create database 数据库名字 [库选项];
库选项: 用来约束数据库,分为两个选项
字符集设定: charset/character set 具体字符集 (数据存储的编码格式).
校对级设定: collate 具体校对集(数据比较的规则)

这里写图片描述
其中:数据库名字不能用关键字或者保留字
这里写图片描述

如果非要使用关键字 或者保留字, 那么必须使用 反引号(esc键下面的键在 英文状态下的)
这里写图片描述
中文数据库是可以的,但是有前提条件: 但是保证服务器能够识别 (不建议使用)
这里写图片描述

当创建数据库的SQL语句执行之后,发生了什么?
1. 在数据库系统中,增加了对应的数据库信息.
2. 会在保存数据的文件夹下: Data 目录,创建一个对应数据库名字的文件夹
这里写图片描述
3. 每个数据库下都有一个 opt 文件,
这里写图片描述

查看数据库

  1. 查看所有数据库: show databases;这里写图片描述
  2. 查看指定部分的数据库: 模糊查询
    Show databases like ‘pattern’; – pattern 是匹配模式
    %: 表示匹配多个字符
    _ ; 表示匹配单个字符, _ 需要被转义
    这里写图片描述
  3. 查看数据库的创建语句:: show create database 数据库名字;这里写图片描述

更新数据库(修改数据库)

数据库名字不可以修改.

数据库的修改仅限库选项: 字符集 和校对集 (校对集依赖字符集.)
Alter database 数据库名字 [库选项];
Chartset / character set [=] 字符集
Collate 校对集
这里写图片描述

删除数据库

所有的操作中删除最简单.
Drop database 数据库的名字;
这里写图片描述
当删除数据库执行语句之后,发生了设么?
1.在数据库内部看不到该数据库了
2.在对应的数据库存储的文件夹内: 数据库的名字的文件夹也被删除(级联删除:里面的数据表全部被删除.)
注意: 数据库的删除危害很大,不要随意删除,应该先备份后再操作,(删除不可逆.)

表操作

表与字段是密不可分的,

新增数据表

Create table [if not exist] 表名(
字段名字 数据类型,
字段名字 数据类型 - - 最后一行不需要逗号
)[表选项];

If not exist: 若果表名不存在,那么创建,否则不执行创建代码: 具有检查功能
表选项: 控制表的表现
字符集: charset / character set 集体字符集; - - 保 证表中数据存储的字符集.
校对集: collate 具体校对集;
存储引擎: engine 具体的存储引擎(innodb 和 myisam)
这里写图片描述
任何一个表的设计都必须指定数据库.
方案1. 显示的指定表所属的数据库
Create table 数据库.表名(); - - 将当前数据库创建到 指定的数据库下.

方案2: 隐式的指定表所属数据库: 先进入到某个数据库环境,再执行创建语句.
Use database 数据库名称;

当创建数据库表的SQL指令执行之后到底发生了什么?
1. 指定数据库下已经存在指定的表
2. 在数据库对应的文件夹下,会产生对应的结构文件(跟存储引擎有关系).这里写图片描述

查看数据表:

数据库能查看的方式,表都可以查看
1>查看所有表: show tables;
这里写图片描述

2>查看部分表: 模糊匹配: show tables like ‘pattern’;
表的模糊匹配

3> 查看表的创建语句: show create table 表名;
这里写图片描述

4> 查看表结构: 查看表中的字段信息
Desc 表名/describe 表名/ show columns from表名;
这里写图片描述

修改数据表

表本身存在,还包含字段: 表的修改分为两个部分: 修改表本身 和 修改字段.

修改表本身

表本身可以修改: 表名 和 表选项.
修改表名: rename table 老表名 to 新表名;
这里写图片描述
修改选项: rename table 老表名 to 新表名;
Alter table 表名 表选项 [=] 值;
这里写图片描述

修改字段

字段操作很多: 新增, 修改, 重命名, 删除

新增字段
Alter table 表名 add[column] 字段名 数据类型 [列属性] [位置];
位置: 字段名可以存放表中的任意位置.
First: 第一个位置.
after: 在那个字段之后: after 字段名; 默认的是在最后一个字段之后.
这里写图片描述

修改字段:
修改通常是修改属性 或者数据类型
Alter table 表名 modify 字段名 数据类型 [属性][位置];
这里写图片描述

重命名字段:
Alter table 表名 change 旧字段 新字段名 数据类型[属性][位置];
这里写图片描述

删除字段:
Alter table 表名 drop 字段名;
这里写图片描述
小心: 如果表中已经存在数据,那么删除字段会清空该字段的所有数据(不可逆).

删除数据表

Drop table 表名1, 表名2….; – 可以一次性删除多张表

当删除 数据表的指令执行之后发生了什么?

1> 在表空间中,没有了指定的表(数据也没有了).
2> 在数据库对应的文件下,表对应的文件(与存储引擎有关)也会被删除.
注意:删除有危险,操作需谨慎.(不可逆.).

数据操作

新增数据

有两种方案:
方案1: 给全表字段插入数据, 不需要指定字段列表: 要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致: 凡是非数值数据,都需要用引号(建议是单引号)包裹.
Insert into 表名 values(值列表)[,(值列表)]; – 可以一次性插入多条记录.
这里写图片描述

方案2: 给部分字段插入数据,需要选定字段列表: 字段列表出现的顺序与字段顺序无关;
但是值列表的顺序,必须与选定的字段列表的顺序一致.
Insert into 表名 (字段列表) values (值列表) [,(值列表)];
这里写图片描述

查看数据

Select */字段列表 from 表名 [where 条件];
– 查看所有数据
select * from my_student;

查看指定字段,指定条件的数据
– 查看指定字段,指定条件数据
select id,number,sex,name from my_student where id = 1; –id为1的对应字段数据

更新数据

Update 表名 set 字段 = 值 [where 条件]; – 建议都有where;要不是更新全部..
更新不一定会成功:如没有要真正更新的数据..

删除数据

删除是不可以逆的: 需谨慎删除
Delete from 表名 [where条件].

中文数据问题

中文数据问题本质是字符集问题.
计算机只识别二进制,: 人类更多的是识别符号: 需要有一个二进制与字符的对应关系(字符集.).
客户端向服务器插入中文数据: 没有成功.
这里写图片描述
原因:\XD5\XC5\XD4\XBD 代表的是’张悦’在当前编码(字符集)下对应的二进制编码转化而成的;
十六进制:两个汉字对应 ===> 四个字节.
这里写图片描述

报错: 服务器没有识别对应的四个字节: 服务器认为数据是utf8, 一个汉字有三个字节;
读取三个字节.转换成汉字(失败),剩余的再读三个字节(不够);所以最终失败.

所有的数据库服务器认为(表现)的一些特性都是通过服务器端的变量来保存:系统先读取自己的变量,看看应该怎么表现.

// 查看服务器到底识别哪些字符集
Show character set;
这里写图片描述

基本上:服务器是万能的,什么字符集都支持.

//既然服务器识别这么多: 总有一种是服务器默认的跟客户端打交道的字符集
Show variables like ‘character_set%’;
这里写图片描述
问题根源:客户端数据只能是GBK,而服务器认为是utf8; 矛盾产生;

解决方案: 改变服务器,默认, 默认的接收字符集为GBK;
Set character_set_client = GBK;
这里写图片描述
插入中文的效果
这里写图片描述

查看数据效果: 依然是乱码
这里写图片描述

原因: 数据来源是服务器,解析数据是客户端 (而客户端值识别GBK: 只会两个字节一个汉字): 但是事实服务器给的是数据却是utf8,三个字节一个汉字,所以出现乱码

解决方案:修改服务器给客户端的数据字符集为GBK;
Set character_set_results = GBK;
这里写图片描述
再查看数据效果:
这里写图片描述

Set 变量 = 值; 修改只是会话级别(当前客户端,当次连接有效: 关闭失效.), 关闭对话框再重新打开后显示 客户端字符集 和 结果集的字符集恢复原状.
这里写图片描述

设置服务器对客户端的字符集的认识: 可以使用快捷方式: set names 字符集.

Set names gbk; =======>character_set_client, character_set_results, character_set_connection.

Set names gbk; 执行后如下图.
这里写图片描述

connection: 连接层:是字符集转变的中间者,如果统一了效率更高, 不统一也没有问题.

校对集

校对集: 数据比较的方式;
校对集有三种形式
_bin; binary, 二进制比较,取出二进制位,一位一位的比较,区分大小写.
_cs: case sensitive, 大小写敏感.区分大小写
_ci: case insensitive 大小写不敏感, 不区分大小写.

查看数据库所支持的校对集: show collation;
这里写图片描述
校对集的应用:只有当数据产生比较的时候,校对集才会生效.
这里写图片描述

对比: 使用utf8的_bin 和 _ci 来验证两种不同的校对集的效果.
1. 创建不同校对集对应的表
create table my_collate_bin(
name char(1)
)charset utf8 collate utf8_bin;
create table my_collate_ci(
name char(1)
)charset utf8 collate utf8_general_ci;
这里写图片描述
2. 插入数据:
这里写图片描述
3. 比较:根据某个字段进行排序: order by 字段名[asc|desc]; asc升序; desc 降序;
默认是升序..
这里写图片描述

校对集: 必须在没有数据之前声明好,如果有了数据,再修改校对集,则修改无效.

web乱码问题

动态网站由三部分组成: 浏览器, Apache服务器, 数据库服务器, 三个部分都有自己的字符集(中文),. 数据需要在三个部分之间来回传递, 很容易产生乱码.
如何解决乱码问题: 统一编码(三码合一)

但是事实上不可能: 浏览器是用户管理(根本不可能控制),
但是必须要解决这些问题: 主要靠PHP(或其他编程语言)来做.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yangyang_A/article/details/80286846