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
网友评论