MySQL-SQL基础应用+Infomation_Schema介绍-Day3

MySQL-SQL基础应用+Infomation_Schema介绍-Day3

1、SQL 介绍

结构化查询语言
SQL标准:SQL 92     SQL 99(两者变化不大)
5.7 以后符合SQL92严格模式,通过sql_mode参数来控制


2、SQL 作用

SQL 用来管理和操作MySQL内部的对象
对象?
库:库名,库属性
表:表名,表属性,列名,记录(行),数据类型,列属性和约束


3、SQL语句的类型

DDL:数据定义语言          data definition language
DCL:数据控制语言          data control language
DML:数据操作语言          data manipulation language
DQL:数据查询语言          data query language


4、数据类型

官方文档

https://dev.mysql.com/doc/refman/5.7/en/data-types.html

4.1、作用?

保证数据的规划性,让数据具有具体的含义,在列上进行控制

字符类型表

image

数值类型表

image

时间类型表

image

4.2、种类

#4.2.1、字符串
1、char(32)
定长长度为32的字符串。
存储数据时,一次性提供32字符长度的存储空间,存不满用空格填充。

2、varchar(32)
可变长度的字符串类型(最多是32位字符)。
存数据时,首先先对字符串长度判断,按需分配存储空间会单独占用一个字符长度来记录此次字符长度,按需进行存储空间分配。
超过255之后,需要两个字节长度记录字符长度。

面试题:
1、char和varchar的区别?
(1)255  65535
(2)定长(固定存储空间)变长(按需)

2、char和varchar如何选择?
(1)char类型,固定长度的字符串列,比如说手机号,身份证号,银行卡号,性别
(2)varchar类型,不确定长度的字符串,可以使用。

悬念:
为什么呢?影响到索引的高度?

3、enum 枚举类型
enum('bj','sh','cq','hb',.......)
       1    2    3    4 ..........
数据行比较多时,会影响到索引的应用
切记:数据类型禁止使用enum类型

#4.2.2、数字
1、tinyint: -128~127  也可理解为(0-255)
2、int:     -2^31~2^31-1
说明:手机号是无法存储到int的。一般是使用char、varchar类型来存储收集号
====================================================

#4.2.3、时间
1、timestamp
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
2、datetime
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
timestamp会受到时区的影响
====================================================

二进制
====================================================


5、表属性

存储引擎:engine 
 InnoDB(默认的)

字符集:eharset
字符集和排序规则:
utf8       
utf8mb4 (企业中常用)

utf8和utf8mb4的区别?
utf8          中文  三个字节长度
utf8mb4       中文  四个字节长度  才是真正的utf8   支持emoji字符

排序规则(校队规则)collation
针对英文字符串大小写问题

字符集,排序规则,Unicode官方文档

https://dev.mysql.com/doc/refman/5.7/en/charset.html


6、列的属性和约束

1、**主键:primary key(PK)**
数字列、整数列、无关列、自增列、
聚集索引列?
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
====================================================

2、**非空:Not NULL**
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
说明:
我们建议,对于普通列来讲,尽量设置not null 
默认值 default : 数字列的默认值使用0 ,字符串类型,设置为一个nil null
====================================================

3、**唯一:unique**
列值不能重复
====================================================

4、自增:auto_increment
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
====================================================

5、无符号:unsigned
针对数字列,非负数。
====================================================

6、注释:comment


7、SQL语句应用

官方文档

http://dev.mysql.com/doc/refman/5.7/en/create-database.html

7.1、DDL:数据定义语言

DDL
建库语法:
create table stu(
列1  属性(数据类型、约束、其他属性) ,
列2  属性,
列3  属性
)

库:
(1)建库
mysql> create database bbs charset utf8mb4;
mysql> show databases;
mysql> show create database bbs;

(2)改库
mysql> alter database bao charset utf8mb4;

(3)删库(不代表生产环境,生产环境禁止)
mysql> drop database bbs;
====================================================

表:
建表建库规范;
1、库名,表名是小写字母
为啥?
开发和生产平台会出现问题
2、不能以数字开头、特殊符号
3、不支持中划线、支持下划线
4、内部函数名不能使用
5、名字和业务功能有关(his,jf,yz,oss,erp,crm...)

(1)建表
create table oldguo (
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)改表(重点)
在上表中添加一个手机号列+86156123298765
alter table duanyang add telnum char(14) not null unique comment '手机号';

(3)删表上述telnum列
alter TABLE duanyang DROP telnum;

(4) 查看列的信息(重点)
DESC duanyang;
====================================================

练习:
-- 在上表中加一个状态列state,非空,默认值为1.
alter table duanyang add state tinyint  unsigned not null default 1 comment '状态';

-- 删除state列(不代表生成操作)
alter TABLE duanyang DROP state;

-- 查看列的信息
DESC duanyang;

-- 在name后添加QQ列 varchar(255)
alter TABLE duanyang add qq VARCHAR(255) NOT NULL UNIQUE  COMMENT '在name后面添加qq列' AFTER name;

-- 在name之前添加wechat列
alter TABLE duanyang add wechat VARCHAR(255) NOT NULL UNIQUE  COMMENT '在name之前添加微信列' AFTER id;

-- 在首页列上添加 学号:sid(linux_00001)
ALTER TABLE duanyang add sid VARCHAR(255) not null UNIQUE COMMENT '学生好' FIRST;

-- 修改name数据类型的属性
ALTER TABLE duanyang MODIFY name VARCHAR(128)  NOT NULL ;

-- 将name改为sname  数据类型改为CHAR类型
ALTER TABLE duanyang CHANGE name sname CHAR(1) NOT NULL DEFAULT 'n';

-- 删除以上添加的列(不代表生产环境)
mysql > show create table duanyang; 
USE duanyang;                         #切换到duanyang表;
DESC duanyang;                        #查看表列信息
SHOW CREATE TABLE duanyang;             #查看建表的语句
CREATE TABLE duanyan LIKE duanyang;     #创建一个相同表结构空表    

ALTER TABLE duanyang DROP sid;
ALTER TABLE duanyang DROP wechat;
ALTER TABLE duanyang DROP gender;
ALTER TABLE duanyang DROP telnum;
ALTER TABLE duanyang DROP state; 
====================================================


7.2、DML 数据操作语言

DML
-- INSERT
-- 最简单的方法插入数据
INSERT INTO duanyang VALUES(1,'1454028762','1454028762','18');
-- 最规范的方法插入数据
insert into duanyang(wechat,qq,age) values ('14540287621','14540287621','100');
-- 查看表信息
DESC duanyang;
-- 查看表数据(不代表生产环境)
SELECT * FROM duanyang;

-- UPDATE(注意谨慎操作)
UPDATE duanyang SET qq='654866250' WHERE id=1;

-- DELETE
DELETE FROM duanyang WHERE id=1;
====================================================

需求:将一个大表格全部数据清空
DELETE FROM duanyang;
TRUNCATE TABLE duanyang;

DELETE 和 TRUNCATE 区别
1、DELETE 逻辑逐行删除,不会降低自增长得起始值。
效率很低,碎片较多,会影响到性能
2、TRUNCATE,属于物理删除,将表段的区进行清空,不会产生碎片,性能较高。

生产需求:使用update替代delete,进行伪删除
1、添加状态列state(0代表存在,1代表不存在)
ALTER TABLE oldguo ADD state TINYINT NOT NULL DEFAULT 0 ;

2. 使用update模拟delete 
DELETE FROM oldguo WHERE id=6;
替换为
UPDATE oldguo SET state=1 WHERE id=6;
SELECT * FROM oldguo ;

3. 业务语句修改
SELECT * FROM oldguo ;
改为 
SELECT * FROM oldguo WHERE state=0;
====================================================


案例

按需求创建一下表结构:

use school
student :学生表
sno:    学号
sname:学生姓名
sage: 学生年龄
ssex: 学生性别

teacher :教师表
tno:     教师编号
tname:教师名字

course :课程表
cno:  课程编号
cname:课程名字
tno:  教师编号

score  :成绩表
sno:  学号
cno:  课程编号
score:成绩
====================================================

-- 项目构建
mysql > create database school charset utf8mb4;  
USE school

-- 创建seacher表
create table student (
sno int not null primary key AUTO_INCREMENT comment '学号',
sname varchar(255) not null comment '姓名', 
sage tinyint unsigned not null default 0 comment '年龄',
ssex enum('m','f','n') NOT null default 'n' comment '性别'
)charset=utf8mb4 engine=innodb;

-- 创建teacher表
create table teacher (
tno int not null primary key AUTO_INCREMENT comment '教师编号',
tname varchar(255) not null comment '教师姓名'
)charset=utf8mb4 engine=innodb;

-- 创建course 课程表
create table course (
cno int not null primary key AUTO_INCREMENT comment '课程编号',
cname varchar(255) not null comment '教师名字',
tno int not null comment '教师编号'
)charset=utf8mb4 engine=innodb;

-- 创建score 成绩表
create table score (
sno int not null  comment '学号',
cno int not null comment '课程编号',
score TINYINT not null DEFAULT 0 COMMENT '成绩'
)charset=utf8mb4 engine=innodb;
====================================================

SELECT * FROM course;
insert into course(cno,cname,tno)
values 
('1001','linux','101'),
('1002','python','102'),
('1003','mysql','103');
====================================================

SELECT * FROM score;
INSERT INTO score(sno,cno,score)
VALUES
(1,1001,80),
(1,1002,59),
(2,1002,90),
(2,1003,100),
(3,1001,99),
(3,1003,40),
(4,1001,79),
(4,1002,61),
(4,1003,99),
(5,1003,40),
(6,1001,89),
(6,1003,77),
(7,1001,67),
(7,1003,82),
(8,1001,70),
(9,1003,80),
(10,1003,96);
====================================================

show tables;
SELECT * FROM student;
INSERT INTO student(sno,sname,sage,ssex)
VALUES (1,'zhang3',18,'m');

INSERT INTO student(sname,sage,ssex)
VALUES
('zhang4',18,'m'),
('li4',18,'m'),
('wang5',19,'f'),
('zh4',18,'m'),
('zhao4',18,'m'),
('ma6',19,'f'),
('oldboy',20,'m'),
('oldgirl',20,'f'),
('oldp',25,'m');

====================================================

show tables;
SELECT * FROM teacher;
INSERT INTO teacher(tno,tname)
VALUES
(101,'oldboy');

INSERT INTO teacher(tname) VALUES
('hesw'),
('oldguo');
====================================================
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容