MySQL数据库-day-3 2019-06-17

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;

你可能感兴趣的:(MySQL数据库-day-3 2019-06-17)