Mysql数据类型与CRUD操作详细讲解

目录
  • 基本数据类型
  • 数据库命令
  • 建表与约束
    • 建表
    • 约束
  • 基本数据操作(CRUD)

基本数据类型

整数:可选择unsigned修饰

intyint 8位 (-128 - 127)

smallint 16位 (-32768 - 32767)

mediumint 24位 (-8388608 - 8388607)

int 32位 大约正负21亿

bigint 64位

实数(带有小数点):使用标准的浮点运算进行近似计算

float 4个字节

double 8个字节

decimal 最多允许65个数字

示例:decimal(5,2),说明:5位长度,2位小数精度,如果整数部分+2位小数超长,则报错,如果只是小数部分超出2两位,则四舍五入到两位小数

字符串

char:定长:msql根据定义字符串的长度一次分配足够的空间

适用场景:较短的字符串,且所有值接近同一长度

varchar 变长字符串

  • ​​​​​​比定长类型节约空间
  • 但是ROW_FOMAT=FIXED每行使用定长
  • 适用场景:字符串的最大长度比评估长度大很多,列的更新较少
  • 缺点:频繁修改,且字符串的长度变化大时,可能出现页分 裂
  • 不要盲目的给过大的长度
  • 在临时表或排序时可能遭遇最大长度分配内存问题

Text、Blob

1.都为存放很大的数据而设计

2.与其他数据不同,都作为独立的对象存储

3.当值太大时,使用外部存储区存储,每行只要使用1-4字节存放一个指针

text存储字符数据:

  • tinytext
  • smalltext
  • text
  • mediumtext
  • longtext

Blob存储二进制数据:

  • tinyblob
  • smallblob
  • blob
  • mediumblob
  • longblob

日期时间

datetime

  • 精度:秒
  • 与时区无关,8个字节存储空间
  • 范围:1001 至 9999 年

timestamp

  • 保存1970年1月1日午夜以来的秒数
  • 占用4个字节存储空间
  • 范围:1970年 至 2038年
  • 与时区有关
  • 默认为NOT NULL
  • 通常尽量使用timestamp
  • 精度:秒

date

  • yyyy-MM-dd

time

  • HH:mm:ss

选择标识符

  1. 用来进行关联操作
  2. 在其他表中作为外键
  3. 整型通常是标识列的最好选择
  4. 相关的表中使用相同的数据类型
  5. 尽量避免字符串作为标识列,尤其是随机生成的字符串,(如:uuid)导致insert与select都很慢
  6. 插入值被随机写到索引的不同位置,insert慢,容易导致页分 裂,磁盘随机读取
  7. 逻辑上相邻的行被分布在磁盘和内存的不同地方,select慢
  8. 使mysql查询缓存失效
  9. 如果需要存储uuid,则应将“-”去除

(插入值被随机写到索引的不同位置,insert慢,容易导致页分 裂,磁盘随机读取

逻辑上相邻的行被分布在磁盘和内存的不同地方,select慢 使mysql查询缓存失效 如果需要存储uuid,则应将“-”去除)

数据库命令

创建数据库:

create database 数据库名
create database if not exists 数据库名 default charset utf8 collate utf8_general_ci;
//默认的数据库编码集:utf8
//collate表示校验规则为utf8_general_ci
	//常用排序类型
		//utf8_general_cs(区分大小写)
		//utf8_genera_ci(不区分大小写)

查看所有数据库:

show databases

删除数据库:

drop database 数据库名

注意:删除数据库是一个危险操作,如要删除建议先备份

建表与约束

建表

命令格式:

create table 表名称(

列名称1 数据类型not null,

列名称2 数据类型,

列名称3 数据类型,

unique(列名称1[,列名称2,...,列名称N])

)

示例:

create table t_student
(
   sid int not null comment '学号',
   sname varchar(60) not null comment '姓名',
   sex tinyint not null default 1 comment '性别:1男, 2女',
   age tinyint not null comment ' 年龄',
   icard varchar(18) not null comment '身份证,唯一约束',
   primary key (sid),
   unique key AK_Key_2 (icard)
) comment '学生信息表';

约束

主键约束:

primarykey

增加主键(alter table 表名 add primary key(主键名称))

删除主键(alerttable 表名dropprimarykey) 非空约束:

sid int not null comment'学号',

外键约束:

create table t_score
(
   id int not null comment'记录流水号',
   sid int not null comment'学号',
   cid int not null comment'课程ID',
   score float comment'成绩',
   primary key(id),
   foreign key(sid) references t_student (sid) on delete restrict on update redtrict ,
   unique key ak_key_2(sid, cid)
);
//说明: sid为本表的外键,关联t_student表中的的sid主键,on delete restrict on update redtrict说明在本表有数据的情况下,主表的关联键不能删除或更新。

增加主键(alerttable 表名 add foreign key(外键名称) references 主表名称(主键名称))

删除主键(alerttable 表名drop foreign key约束名)

唯一约束:uniquekey约束名 (字段)

创建唯一约束:alert table 表名 add unique(列名称1[,列名称2,..])

create unique index UserNameIndex on 't_user' ('username')

删除唯一约束:alerttable 表名dropindex 唯一约束缩影名称

默认值约束:default

基本数据操作(CRUD)

数据准备

create database db_t281
use db_t281
-- 1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
create table t_student
(
	sid int not null  auto_increment comment '学号',
	sname varchar(40) not null comment '名称',
	birthday date not null comment '年龄',
	ssex tinyint not null default 1 comment '1男,2女',
	primary key (sid)
);
INSERT INTO t_student VALUES(1, '赵雷' , '1990-01-01' , 1);
INSERT INTO t_student VALUES(2 , '钱电' , '1990-12-21' , 1);
INSERT INTO t_student VALUES(3 , '孙风' , '1990-12-20' , 1);
INSERT INTO t_student VALUES(4 , '李云' , '1990-12-06' , 1);
INSERT INTO t_student VALUES(5 , '周梅' , '1991-12-01' , 2);
INSERT INTO t_student VALUES(6 , '吴兰' , '1992-01-01' , 2);
INSERT INTO t_student VALUES(7 , '郑竹' , '1989-01-01' , 2);
INSERT INTO t_student VALUES(9 , '张三' , '2017-12-20' , 2);
INSERT INTO t_student VALUES(10 , '李四' , '2017-12-25' , 2);
INSERT INTO t_student VALUES(11 , '李四' , '2012-06-06' , 2);
INSERT INTO t_student VALUES(12 , '赵六' , '2013-06-13' , 2);
INSERT INTO t_student VALUES(13 , '孙七' , '2014-06-01' , 2);
-- 2.教师表-t_teacher
-- tid 教师编号,tname 教师名称
CREATE TABLE t_teacher
(
	tid INT NOT NULL AUTO_INCREMENT COMMENT '教师ID',
	tname VARCHAR(40) NOT NULL COMMENT '教师名称',
	PRIMARY KEY (tid)
);
INSERT INTO t_teacher VALUES(1 , '张五哥');
INSERT INTO t_teacher VALUES(2 , '李卫');
INSERT INTO t_teacher VALUES(3 , '年羹尧');
-- 3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称
CREATE TABLE t_course
(
	cid INT NOT NULL COMMENT '课程ID',
	cname VARCHAR(50) COMMENT '课程名称',
	tid INT COMMENT '教师id',
	PRIMARY KEY (cid)
);
INSERT INTO t_course VALUES(1 , '语文' , 2);
INSERT INTO t_course VALUES(2 , '数学' , 1);
INSERT INTO t_course VALUES(3 , '英语' , 3);
-- 4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩
CREATE TABLE t_score
(
	sid INT NOT NULL COMMENT '学号,外键',
	cid INT NOT NULL COMMENT '课程id',
	score decimal(5,2) COMMENT '成绩',
	UNIQUE KEY ak_key_sid_cid (sid, cid)
);
INSERT INTO t_score VALUES(1 , 1 , 80);
INSERT INTO t_score VALUES(1 , 2 , 90);
INSERT INTO t_score VALUES(1 , 3 , 99);
INSERT INTO t_score VALUES(2 , 1 , 70);
INSERT INTO t_score VALUES(2 , 2 , 60);
INSERT INTO t_score VALUES(2 , 3 , 80);
INSERT INTO t_score VALUES(3 , 1 , 80);
INSERT INTO t_score VALUES(3 , 2 , 80);
INSERT INTO t_score VALUES(3 , 3 , 80);
INSERT INTO t_score VALUES(4 , 1 , 50);
INSERT INTO t_score VALUES(4 , 2 , 30);
INSERT INTO t_score VALUES(4 , 3 , 20);
INSERT INTO t_score VALUES(5 , 1 , 76);
INSERT INTO t_score VALUES(5 , 2 , 87);
INSERT INTO t_score VALUES(6 , 1 , 31);
INSERT INTO t_score VALUES(6 , 3 , 34);
INSERT INTO t_score VALUES(7 , 2 , 89);
INSERT INTO t_score VALUES(7 , 3 , 98);
select * from t_student;
select * from t_teacher;
select * from t_course;
select * from t_score;

数据表如下:

t_student学生表 t_teacher教师表

t_course课程表 t_score成绩表

1)查询" 1 "课程比" 2 "课程成绩高的学生的信息及课程分数

 SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score
   FROM t_student stu
        INNER JOIN  (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid
        INNER JOIN  (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid
 WHERE c1.score > c2.score

2)查询同时选修" 1 "课程和" 2 "课程的学生信息

//方法一
SELECT stu.sid,stu.sname,stu.ssex,c1.cid, c1.score, c2.cid, c2.score
   FROM t_student stu
        INNER JOIN  (SELECT t1.sid, t1.cid, t1.score FROM t_score t1 WHERE t1.cid = 1 ) c1 ON stu.sid = c1.sid
        INNER JOIN  (SELECT t2.sid, t2.cid, t2.score FROM t_score t2 WHERE t2.cid = 2) c2 ON stu.sid = c2.sid
//方法二
SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN
   (
     SELECT t.`sid`,
            SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num,
            SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid`
   ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num > 0;

3)查询选修" 1 "课程但没有选修" 2 "课程的情况

SELECT stu.* FROM t_student stu
  WHERE stu.sid IN(SELECT t1.sid FROM t_score t1 WHERE t1.cid = 1)
	AND stu.sid NOT IN (SELECT t1.sid FROM t_score t1 WHERE t1.cid = 2)
SELECT stu.`sid`,stu.`sname`, stu.`ssex`, tmp.c1num, tmp.c2num FROM t_student stu INNER JOIN
   (
     SELECT t.`sid`,
            SUM(CASE WHEN t.cid = 1 THEN t.`score` ELSE 0 END) c1num,
            SUM(CASE WHEN t.cid = 2 THEN t.`score` ELSE 0 END) c2num FROM t_score t GROUP BY t.`sid`
   ) tmp ON stu.sid = tmp.sid AND tmp.c1num > 0 AND tmp.c2num = 0;

4)查询不存在" 1 "课程但存在" 2 "课程的情况

 SELECT t1.sid,t1.cid,t1.score
    FROM t_score t1
  WHERE t1.cid = 2 AND t1.sid NOT IN (SELECT t2.sid FROM t_score t2 WHERE t2.cid = 1);

查询各科成绩最高分、最低分和平均分:

1)显示列:课程ID,课程名称,最高分,最低分,平均分,选修人数,及格率,中等率,优良率 2)优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 3)要求查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT t2.cid '课程ID',
       t2.cname '课程名称',
       MAX(t1.score) '最高分',
       MIN(t1.score) '最低分',
       ROUND(AVG(t1.score), 2) '平均分',
       COUNT(t1.sid) '选修人数',
       ROUND(SUM(CASE WHEN t1.score >= 60 THEN 1 ELSE 0 END) / COUNT(t1.sid), 2) '及格率',
       ROUND(SUM(CASE WHEN t1.score >=70 AND t1.score < 80 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '中等率',
       ROUND(SUM(CASE WHEN t1.score >=80 AND t1.score < 90 THEN 1 ELSE 0 END)/COUNT(t1.sid),2) '优良率',
       ROUND(SUM(CASE WHEN t1.score >= 90 THEN 1 ELSE 0 END)/COUNT(t1.sid), 2) '优秀率'
 FROM t_score t1
      INNER JOIN t_course t2 ON t1.cid = t2.cid
  GROUP BY t2.cid, t2.cname
  ORDER BY COUNT(t1.sid) DESC, t2.cid ASC;

到此这篇关于Mysql数据类型与CRUD的文章就介绍到这了,更多相关Mysql数据类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中BIGINT数据类型如何存储整数值

    目录 前言 MySQL BIGINT 例子 示例 1 示例 2 示例 3 示例 4 结论 前言 本文重点介绍 MySQL BIGINT 数据类型,并研究我们如何使用它来存储整数值.我们还将了解它的范围.存储大小和各种属性,包括有符号.无符号和零填充. 整数类型(精确值) - INTEGER.INT.SMALLINT.TINYINT.MEDIUMINT.BIGINT MySQL 支持 SQL 标准整数类型 INTEGER(或INT)和 SMALLINT. 作为标准的扩展,MySQL 还支持整数类型

  • (MariaDB)MySQL数据类型和存储机制全面讲解

    1.1 数据类型概览 数据类型算是一种字段约束,它限制每个字段能存储什么样的数据.能存储多少数据.能存储的格式等.MySQL/MariaDB大致有5类数据类型,分别是:整形.浮点型.字符串类型.日期时间型以及特殊的ENUM和SET类型. 这5种数据类型的意义.限制和相关说明如下图所示: 各数据类型占用字节数,参见mariadb官方手册. 1.2 存储机制和操作方式 数据类型之所以能限定字段的数据存储长度,是因为在创建表时在内存中严格划定了地址空间,地址空间的长度是多少就能存储多少字节的数据.当然

  • Mysql表的约束超详细讲解

    目录 约束的概念 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 约束的概念 约束:通过限制用户操作的方式,来达到维护数据本身安全,完整性的一套方案. 为什么要有约束? Mysql是一套整体的数据存储解决方案,除了解决数据存储功能,还要保证数据的安全,减少用户的误操作. 表的约束有很多,主要介绍:null/not null,default, comment, zerofill,primary key, auto_increment,unique key . 空属性 数据库默

  • MySQL数据类型优化原则

    MySQL支持的数据类型很多,选择正确的数据类型对于高性能至关重要.下面几个简单的原则都有助于做出更好的选择. 更小的通常更好 应该尽量使用可以正确储存数据的最小数据类型.更小的数据类型通常更快,因为它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少.如果无法确定哪个数据类型时最好的,就选择你认为不会超过范围的最小类型. 简单就好 简单数据类型的操作通常需要更少的CPU周期.例如,整形比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整形更复杂.比如用MySQ内

  • MySQL数据类型全解析

    数据类型:定义列中可以存储什么数据以及该数据实际怎样存储的基本规则. 数据类型用于以下目的: 1.允许限制可存储在列中的数据.如:数值数据类型列只能接受数值. 2.允许在内部更有效地存储数据.如:用比文本串更简洁的格式存储数值和日期时间值. 3.允许变换排序顺序.如:数据都作为串处理,则1位于10前,10位于2前(串以字典顺序排序,从左边开始比较,一次一个字符):作为数值数据类型,数值才能正确排序. 一.串数据类型 最常用的数据类型,存储串,如名字.地址.电话号码等. 两种基本的串类型:定长串和

  • MySQL之information_schema数据库详细讲解

    1. 概述 information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库.其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名.表名.列的数据类型.访问权限等. information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件. mysql> use information_schema;

  • Mybatis-Plus 通用CRUD的详细操作

    目录 1.插入操作 1.1 方法定义 1.2 测试用例 1.3 测试 1.4 @TableField 2.更新操作 2.1 根据id更新 2.2 根据条件更新 3.删除操作 3.1 deleteById 3.2 deleteByMap 3.3 delete 3.4 deleteBatchIds 4.查询操作 4.1 selectById 4.2 selectBatchIds 4.3 selectOne 4.4 selectCount 4.5 selectList 4.6 selectPage 5

  • Mysql超详细讲解死锁问题的理解

    目录 1.什么是死锁? 2.Mysql出现死锁的必要条件 资源独占条件 请求和保持条件 不剥夺条件 相互获取锁条件 3. Mysql经典死锁案例 3.1 建表语句 3.2 初始化相关数据 3.3 正常转账过程 3.4 死锁转账过程 3.5 死锁导致的问题 4.如何解决死锁问题? 4.1 打破请求和保持条件 4.2 打破相互获取锁条件(推荐) 5.总结 1.什么是死锁? 死锁指的是在两个或两个以上不同的进程或线程中,由于存在共同资源的竞争或进程(或线程)间的通讯而导致各个线程间相互挂起等待,如果没

  • MySQL详细讲解变量variables的用法

    目录 变量 variables 1.系统变量 1.1.查看系统变量 1.2.修改系统变量 2.会话变量 3.局部变量 4.变量作用域 4.1.局部作用域 4.2.会话作用域 4.3.全局作用域 变量 variables MySQL本质是一种编程语言 1.系统变量 对所有用户客户端都有效 1.1.查看系统变量 1.方式一 show variables [like 'pattern']; 示例 mysql> show variables like 'autocommit'; +-----------

  • Docker超详细讲解镜像操作

    目录 1. 镜像简介 2. 获取镜像 3. 查看镜像信息 4. 搜索镜像 5. 创建镜像 5.1 基于已有镜像创建 5.2 使用Dockerfile 新建镜像 6. 删除镜像 1. 镜像简介 Docker 镜像(Image)是用于创建 Docker 容器的模板.Docker 镜像相当于一个 root 文件系统,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统.在实际使用中,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖

  • MySql超详细讲解表的用法

    目录 1. 建表的语法 2. mysql中的数据类型 3. 模拟表 4. 创建一个学生表 1. 创建表(create-DDL) 2. 插入数据(insert-DML) 3. 插入日期 4. date和datetime的区别 5. 更新(update-DML) 6. 删除(delete-DML) 5. 快速创建表(复制表) 6. 快速删除表中数据 1. 建表的语法 建表属于 DDL 语句,DDL 语句包括:create.drop.alter… create table 表名(字段1 数据类型, 字

随机推荐