SQL基础应用+Infomatiom_Schema介绍
1.SQL介绍
#1.结构化查询语言。
SQL标准:SQL92 SQL99
5.7 版本, SQL_Mode 严格模式
2.SQL语句作用
SQL 用来管理和操作MySQL内部对象?
库:库名
表:表名,表属性,列 ,记录,列属性和约束
3.SQL语句的类型
DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据查询语言
4.数据类型
#4.1 作用?
控制数据的规范性,让数据有集体含义,在列上进行控制。
#4.2 种类
#(4.2.1)字符串:
char(32):定长长度为32的字符串。存储数据时,一次性提供32字符长度存储空间, 存不满用空格来填充。
varchar(32):可变长度的字符串类型。存数据时,首先进行字符串长度判断,比如需存储的字符串是10个字符,只会分配10个字符长度存储空间,并且会单独占用一个字符长度来记录此次的字符长度。超多255之后,需要两个字节长度记录字符长度。
enum 枚举类型
enum ('bj','sh','sz','cq','hb')
数据行较多时,会影响到索引的应用
注意:数字类禁止enum类型
面试题:
1.char和 varchar 的区别?
(1) 255 65535
(2) 定长(固定存储空间) 变长(按需求)
2.char和varchar 如何选择?
(1) char 类型,固定长度的字符串列,比如手机号,身份证,银行卡 ,性别 等
(2)varchar 类型,不确定长度的字符串,可以使用。
#(4.2.2)数字 :
1.tinyint : -128~127
2.int :-2^31~2^31-1
说明:手机号是无法存储到int的。一般是使用char类型来存储收集号
#(4.2.3)时间 :
1. DATETIME
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
2. TIMESTAMP
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
#(4.2.4)二进制
(了解)
5. 表属性
存储引擎 : engine = InnoDB
字符集 : charset = utf8mb4
utf8 中文 三个字节长度
utf8mb4 中文 四个字节长度 才是真正的utf8
支持emoji 字符
每个字符集 都有排序规则(校对规则)collation
针对英文字符串大小写问题
6.列属性和约束
主键: primary key (PK)
将来的值必须唯一 非空
数字列,整数列,无关列,自增的
聚集索引列?
是一种约束,也是一种索引类型,在一张表中只能有一个主键。
非空: Not NULL
建议,对于普通列来讲,尽量设置not null
默认值:数字列的默认值 使用0 ,字符串列, 设置为一个nil null
唯一:unique
不能重复
========================================================
自增:auto_increment
针对数字列 ,自动生成顺序值
无符号: unsigned
针对数字列
注释: comment
7.SQL语句应用
7.1 DDL: 数据定义语言
7.1.1库:
(1)建库 :
mysql> create database xiaozhi charset utf8mb4;
查看库:
mysql> show create databaes xiaozhi;
mysql> show databases;
(2)改库
mysql> alter database xiaozhi1 charset utf8mb4;
(3)删库
mysql> drop database xiaozhi1;
7.1.2表:
建表建库规范:
1、必须是小写字母
开发和生产平台可能会出现问题。
2、不能以数字开头
3、不支持- 支持_
4、内部函数名不能使用
5、名字和业务功能有关(his,jf,yz,oss,erp,crm...)
(1) 建表
create table oldgou (
id int not null primary key AUTO_INCREMENT comment '学号',
name varchar(255) not null comment '姓名' ,
age tinyint unsigned not null default 0 comment '年龄',
gender enum('m','f','n') not null default 'n' comment '性别'
)charset=utf8mb4 engine=innodb;
(2) 改表
改表结构
-- 添加一个状态列
alter table oldguo add state tinyint not null default 1 comment '状态列';
--添加一个手机号的列
alter table oldgou add telnum char(11) not null unique comment '手机号'; *****
-- online-DDL : pt-osc (自己研究)
-- 在name 后面添加一个qq列
alter table oldgou add qq varchar(255) not null UNIQUE COMMENT 'qq' AFTER NAME;
-- 在name 之前添加wechat列
alter table oldgou add wechat varchar(255) not null UNIQUE COMMENT '微信' AFTER id
-- 在首列上添加 学号: sid(linux58_00001)
ALTER TABLE oldgou add sid varchar(255) not null UNIQUE COMMENT '学号' FIRST;
-- 修改sname 数据类型的属性
alter table oldgou MODIFY name varchar(128) not null
-- 将gender 改为 gg 数据类型改为 char 类型
ALTER TABLE oldgou CHANGE gender gg CHAR(1) NOT NULL DEFAULT 'n';
(3) 删表
-- 删除 state列(不代表生产操作)
alter table oldgou drop state;
-- 切换到zhihu
use zhihu;
-- 查看列表信息
desc oldgou;
-- 查看建表语句
show create table oldgou;
-- 创建一个相同表结构空表
create table oguo like oldgou;
-- 删除列
alter table oldgou drop gg;
7.2 DML 数据操作语言
-- insert 语句
-- 查看表信息
-- desc oldgou;
-- INSERT
-- 最简单的方法插入数据
-- INSERT into oldgou VALUES('3','xiaozh','85343724','20')
-- 最规范的方法插入数据
-- insert into oldgou(name,qq,age) values ('duanyang','3243543543','20');
-- 查看表数据(不代表生产操作)
-- SELECT * FROM oldguo;
-- update 语句 (注意谨慎操作!!!!!)
-- UPDATE oldgou set qq='123456' WHERE id=2;
-- delete (谨慎操作!!!!)
-- delete from oldgou where id=3;
-- 需求:将一个大表全部数据清空
-- delete from oldgou;
-- TRUNCATE TABLE oldgou;
-- delete 和 truncate 区别
-- 1.delete 逻辑逐行删除,不会降低自增长的起始值。
-- 效率很低,碎片较多,会影响到性能
-- 2.truncate ,属于物理删除,将表段中的区进行清空,不会产生碎片。性能较高
-- 需求: 使用update 代替delete ,进行伪删除
-- 1. 添加状态列state(0代表存在,1代表删除)
-- alter table oldgou add state tinyint not null default 0;
-- 2. 使用update 模拟 delete
-- delete from oldgou where id=2;
-- 替换为
-- update oldgou set state=1 where id=2;
-- select * from oldgou;
-- 3.业务语句修改
-- select * from oldgou;
-- 改为
-- select * from oldgou where state=0;