The Road of DBA 3_MySQL_SQL基础应用

1.SQL介绍

结构化查询语言
SQL标准:SQL 92 SQL 99
5.7以后符合SQL92标准的严格模式
通过sql_mode控制住
1.1SQL作用
SQL用来管理和操作MySQL内部的对象
对象即库和表
库:库名,属性
表:表名,表属性,列,记录,列属性和约束  
1.2 SQL语句的类型
DDL(data definition language):数据定义语言
DCL(data control language):数据控制语言
DML(data manipulation language):数据操作语言
DQL(data query language):数据查询语言
1.3 数据类型
1.3.1 作用

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

1.3.2种类

字符串

char
    char(20)
    定长长度,上限20
    存储数据时,一次性提供20字符长度的存储空间,磁盘空间固定,如果数据未占满20位,则剩余由空格填充
varchar
    varchar(20)
     可变长度的字符串类型
     存数据时,按需进行存储空间分配。
     存数据时, 首先进行字符串长度判断,
     比如需存储的字符串是10个字符,只会分配10个字符长度的存储空间,并且会用单独占用一个字符长度来记录此次数据的字符长度
     字符长度超过255之后,需要两个字节长度记录字符长度
enum
     enum('monday','tuesday','sunday',........)
     枚举
     枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
数据行较多时,会影响到索引的应用
注意:数字类禁止使用enum类型!!
image

数字

tinyint  : -128~127
int       :-2^31~2^31-1
说明:手机号是无法存储到int的。一般是使用char类型来存储收集号
image

时间

DATETIME 
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
TIMESTAMP 
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响
image

二进制

#有但是此处不研究
image.png

面试题:

1.char和varchar的区别
char        |    varchar
255         |    65535
定长        |     变长
固定存储空间|按需分配
2.char和varchar的选择
(1)char类型,固定长度的字符串列,比如手机号,身份证,银行卡号,性别等
(2)varchar类型,不确定长度的字符串,可以使用
悬念:为什么影响索引高度?

2.表属性

存储引擎: engine=InnoDB
(5.1版本为MyISAM)
字符集:charset=utf8mb4
utf8 中文占3字节
utf8mb4 中文占4字节
utf8mb4是utf8的严格超集
utf8mb4支持emoji
排序规则(校对规则)collation
主要是针对英文字符串大小写问题

3.列的属性和约束

<1>PK
      主键:(Primary key)
概念 :
主关键字(主键,primary key)是被挑选出来,作表的行的惟一标识的候选关键字。一个表只有一个主关键字。
主关键字又可以称为主键。主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。 
作用:
1)保证实体的完整性; 
2)加快数据库的操作速度 
特点:
1) 一个表中只能有一个主键。如果在其他字段上建立主键,则原来的主键就会取消。在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键。 
2)主键的值不可重复,也不可为空(NULL)。

3)主键值不能被重用

提示:虽然并不总是需要主键,但是多数数据库设计者都会保证他们创建的每个表具有一个主键,以便以后的数据库的操作和管理。
数字列,整数列,无关列,自增的,聚集索引列
是一种约束,也是一种索引类型,在一个表中只能有一个主键。

<2>非空 Not NULL
我们建议,对于普通列来讲,尽量设置not null
默认值(default):数字列的默认值使用0,字符串类型的设置为null字符串或者nil
<3>唯一 unique
    不能重复
###<4>索引  key
<4>default 默认
<5>自增 auto_increment
    针对数字列
    可以设置起点和偏移量
<6>无符号 unsigned
    针对数字列,必须跟在定义数据类型后面
<7>注释 comment

5.SQL语句应用

DDL 数据定义语言

建表建库规范
1.库名,表名必须是小写
为啥?开发和生产平台可能会出问题
2.不能以数字开头
3.不支持  -   支持   _
4.内部函数名不能使用
5.名字和业务功能有关(his,)

建库
mysql> create database xxxx charset utf8mb4;
Query OK, 1 row affected (0.05 sec)
mysql> show create database xxxx;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| xxxx     | CREATE DATABASE `xxxx` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> create database oldguo1;
Query OK, 1 row affected (0.01 sec)

mysql> show create database oldguo1;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oldguo1            |
| performance_schema |
| sys                |
| world              |
| xxxx               |
| zhihu              |
+--------------------+
8 rows in set (0.00 sec)


改库
mysql> show create database oldguo1;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter database oldguo1 charset utf8;
Query OK, 1 row affected (0.00 sec)

mysql> show create database oldguo1;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| oldguo1  | CREATE DATABASE `oldguo1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

删库(生产禁用)
mysql> drop database oldguo1;
Query OK, 0 rows affected (0.05 sec)


建表
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;
改表
1.改表结构
例子:
添加列:
--在上表中添加手机号列 +86 
alter table stu add telnum char(14) not null unique default +86 comment '手机号';
添加状态列
alter table stu add state tinyint  unsigned not null default 1 comment '状态列';
删除列
alter table stu drop state;
查看列信息:
desc stu;
在name行后面加QQ列
alter table stu add  qq varchar(20) unique not null  comment 'QQ' after name;
 desc stu;
在name行之前加wechat列
alter table stu add  wechat varchar(20) unique not null  comment '微信' after id;
在第一列加
alter table stu add sid varchar(20) unique not null comment 'sid' FIRST;
修改某一列属性modify
alter table stu modify name char(20) not null comment '名字';  
 删除以上添加的列(不代表生产操作)
切到oldboy
USE oldboy;
查看表列信息
DESC oldguo;
查看建表语句
SHOW CREATE TABLE 
建个一模一样的表
CREATE TABLE oguo LIKE oldguo;

从数据库找表
mysql> SELECT table_schema ,table_name  FROM information_schema.tables  WHERE table_name='stu';
+--------------+------------+
| table_schema | table_name |
+--------------+------------+
| xxxx         | stu        |
+--------------+------------+
1 row in set (0.00 sec)

mysql> 

online-ddl:pt-osc
删表

alter table stu drop xxxx列名;

DML数据操作语言

insert插入

最简单的插入数据方法
INSERT INTO stu VALUES(1,'zyl','1234','18');
最规范的插入数据方法
insert into stu(name,qq,age) VALUES('zyl','123456','12');
查看表数据(不代表生产操作)
mysql> select * from stu;
+----+------+--------+-----+
| id | name | qq     | age |
+----+------+--------+-----+
|  1 | zyl  | 1234   |  18 |
|  2 | zyl  | 123456 |  12 |
+----+------+--------+-----+
2 rows in set (0.00 sec)

<*>书写规范:字符串加‘’,数字不加,根据定义类型进行区分

<*>报错分析:列定义有unique,重复插入数据会报下列错误。
[SQL] insert into stu(name,qq,age) VALUES('ss','123459',16);
[Err] 1062 - Duplicate entry '123459' for key 'qq'

update(操作有分享)

替换第二行的qq号码
update stu set qq='123' where id=2;

delete

需求1:将一个大表清空
delete from stu;
delete from stu where id=2;
物理层次删除,删除区
truncate table stu;
面试题:delete和truncate区别
1.delete是逻辑删除,逐行删除,而且不会降低自增长的起始值,
效率很低,碎片很多,会 影响到性能
2.truncate属于物理删除,原理是将表段中的区进行清空,不会产生碎片,且性能较高,
但是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;

DQL

select
show

你可能感兴趣的:(The Road of DBA 3_MySQL_SQL基础应用)