SQL基本操作
基本操作: CRUD.
将SQL 的基本操作根据操作对象进行分类: 分为三类: 库操作, 表操作(字段), 数据操作.
库操作:
对数据库的增删改查.
新增数据库
Create database 数据库名字 [库选项];
库选项: 用来约束数据库,分为两个选项
字符集设定: charset/character set 具体字符集 (数据存储的编码格式).
校对级设定: collate 具体校对集(数据比较的规则)
其中:数据库名字不能用关键字或者保留字
如果非要使用关键字 或者保留字, 那么必须使用 反引号(esc键下面的键在 英文状态下的)
中文数据库是可以的,但是有前提条件: 但是保证服务器能够识别 (不建议使用)
当创建数据库的SQL语句执行之后,发生了什么?
1. 在数据库系统中,增加了对应的数据库信息.
2. 会在保存数据的文件夹下: Data 目录,创建一个对应数据库名字的文件夹
3. 每个数据库下都有一个 opt 文件,
查看数据库
- 查看所有数据库: show databases;
- 查看指定部分的数据库: 模糊查询
Show databases like ‘pattern’; – pattern 是匹配模式
%: 表示匹配多个字符
_ ; 表示匹配单个字符, _ 需要被转义
- 查看数据库的创建语句:: 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(或其他编程语言)来做.