MySQL学习笔记(一):DDL和DML

MirrorYuChen
MirrorYuChen
发布于 2024-11-12 / 13 阅读
0
0

MySQL学习笔记(一):DDL和DML

内容概览:

1.语法特点

  • SQL对关键字大小写不敏感;
  • SQL语句可以用单行活多行书写,以分号结束;
  • SQL注释:
-- 单行注释,-- 后面一定要加一个空格
# 单行注释,#后面可加可不加空格
SELECT * FROM emp; -- 这里是注释

/*
 多行注释
 多行注释
*/

2.数据库系统

  • 数据库(Database)是一个以某种组织方式存储在磁盘上数据的集合;
  • 数据库应用系统指基于数据库的应用软件;
  • 数据库分类:关系型数据库(RDBMS)和非关系型数据库(NoSQL);

​ 常见关系型数据库:存的数据是一张张表,表与表之间存在关系

1.Oracle数据库(老大,最赚钱的数据库)
2.MySQL数据库(最流行的中型数据库)
3.SQL Server数据库(Windows上最好的数据库)
4.PostgreSQL(功能最强大的开源数据库)
5.SQLite(最流行的嵌入式数据库)

​ 常见非关系型数据库

1.redis(最好的缓存数据库)
2.MongoDB(最好的文档型数据库)
3.Elasticsearch(最好的搜索数据库)
4.Cassandra(最好的列式数据库)
5.HBase(优秀的分布式、列式数据库)

3.SQL和数据库管理系统的关系

  • SQL是一种用于操作数据库的语言,SQL适用于所有关系型数据库;
  • MySQL、Oracle、SQLServer是一个数据库软件,这些数据库软件支持标准SQL,通过SQL可以使用这些软件,不过每个数据库系统会在标准的SQL基础上扩展自己的SQL语法;
  • 大部分NoSQL数据库有自己的操作语言,对SQL支持的并不好。

4.关系型数据库管理系统组成

  • 数据库管理系统(DBMS)主要由数据库(Database)和表(Table)组成,一个系统可以由很多数据库,每个数据库可以由很多表。

5.常用图形化界面

  • Navicat:一套快速、可靠的数据库管理工具,Navicat是以直觉化的图像用户界面而建的,可以兼容多种数据库,支持多种操作系统。
# 1.新建连接
“文件” -> “新建连接” -> “MySQL” -> 填写“连接名”、“用户名”和“密码” -> “测试连接” -> “确定”
# 2.执行命令
“新建查询” -> 输入SQL语句 -> 左键单击选中要执行SQL语句 -> “运行已选择的”
  • SQLyog:一个快速而简洁的图形化管理MySQL数据库工具,它能够在任何地点有效地管理你地数据库,由业界著名地Webyog公司出品。
  • MySQL Workbench:官方提供的图形化管理工具,分为社区版和商业版,社区版完全免费,商业版则是按年收费,支持数据库创建、涉及、迁移、备份、导出和导入功能,并支持主流操作系统。
  • DataGrip:由JetBrains公司出品,是一款数据库管理客户端工具,方便连接到数据库服务器、执行SQL、创建表、创建索引及导出数据库等。

6.DDL数据定义语言

  • DDL(Data Definition Language),数据定义语言,该语言包括以下内容:

​ 对数据库的常用操作:

功能 SQL
查看所有数据库 show databases;
创建数据库 create database [if not exists] mydb [chaset=utf8]
切换(选择要操作的)数据库 use mydb;
删除数据库 drop database [if exists] mydb;
修改数据库编码 alter database mydb character set utf8;

​ 对表结构的常用操作

  • 创建表
create table [if not exists] 表名 (
	字段1 类型[(宽度)] [约束条件] [comment '字段说明'],
  字段2 类型[(宽度)] [约束条件] [comment '字段说明'],
  字段3 类型[(宽度)] [约束条件] [comment '字段说明']
) [表的一些设置];

​ 创建表是创建一张空表,指定表名,有几列,每列叫什么名字,及每列存储的数据类型:

use mydb;
create table if not exists student (
	sid int,
  name varchar(20),
  gender varchar(20),
  age int,
  birth date,
  address varchar(20)
);
  • 其它操作:
功能 SQL
查看当前数据库所有表名 show tables;
查看指定某个表的创建语句 show create table 表名;
查看表结构 desc 表名;
删除表 drop table 表名;

​ 修改表结构

alter table 表名 add 列名 类型(长度) [约束];
  • 例如:
# 为student表添加一个新字段:系别dept,类型为varchar(20)
alter table student add dept varchar(20);

​ 修改列名和类型

alter table 表名 change 旧列名 新列名 类型(长度) 约束;
  • 例如:
alter table student change dept department VARCHAR(30);

​ 删除列

alter table 表名 drop 列名;
  • 例如:
alter table student drop department;

​ 修改表名

rename table 旧表名 to 新表名
  • 例如:
rename table student to stu;

7.DML数据操作语言

  • DML是指数据操作语言,英文全称Data Manipulation Language,用来对数据库中表的数据记录进行更新。

​ 插入insert

  • 数据插入
# 向表中插入某些列数据
insert into 表(列名1, 列名2, 列名3, ...) values (值1, 值2, 值3, ...);
# 向表中插入所有列数据
insert into 表 values(值1, 值2, 值3, ...);
  • 例如:
insert into student(sid, name, gender, age, birth, address) 
	values(1001, '张三', '男', 18, '1996-12-23', ‘北京’);

insert into student values(1002, '李四', '男', 19, '1995-11-22', '湖北');
insert into student values(1003, '赵六', '男', 21, '1994-11-22', '湖北'),
                          (1004, '钱七', '男', 22, '1993-9-22', '广州');

​ 删除delete

# 从表中删除满足指定条件的行,不加条件就是删除所有表内容
# 只删除表内容,不删除表
delete from 表名 [where 条件];
# 清空表数据:类似于drop table,先将整个表删了,再创建该表
truncate table 表名或truncate 表名;   
  • 例如:
delete from student where sid = 1004;

​ 更新update

update 表名 set 字段名=值, 字段名=值...;
update 表名 set 字段名=值, 字段名=值... where 条件;
  • 例如:
# 将所有学生的地址都修改为重庆
update student set address = '重庆';

# 将id为1002的学生地址修改为北京
update student set address = '北京' where sid > 1002;

# 将id为1004学生地址修改为北京,年龄修改为23,生日修改为1992-10-22
update student set address='北京', age = age + 1, birth = '1992-10-22' where sid = 1004

8.约束

  • 概念:constraint,实际上就是表中数据的限制条件
  • 作用:表在设计时加入约束的目的是为了保证表中记录完整性和有效性,如,用户表有哪些列的值(如:手机号)不能为空,有些列的值(如:身份证号)不能重复。
  • 分类

​ (1) 主键约束(primary key) PK

​ (2) 自增长约束(auto_increment)

​ (3) 非空约束(not null)

​ (4) 唯一性位数(unique)

​ (5) 默认约束(default)

​ (6) 零填充约束(zerofill)

​ (7) 外键约束(foreign key) FK

8.1 主键约束

  • 概念:

​ MySQL主键约束时一个列或多个列的组合,其值能唯一地标识表中每一行,方便再RDBMS中尽快找到某一行,主键约束相当于唯一约束+非空约束的组合,主键约束不允许重复,也不允许出现空值;每个表最多允许一个主键,主键约束的关键字为 primary key,当创建主键约束时,系统默认会再所在列和列祝贺上建立对应的唯一索引。

  • 操作:

​ 添加单列主键

# 方式一:
create table 表名(
	...
  <字段名> <数据类型> primary key
  ...
);

# 方式二:
create table 表名(
	...
  [constraint <约束名>] primary key [字段名]
);
  • 例如:
# 方式一:
create table empl(
	eid int primary key,
  name VARCHAR(20),
  deptId int,
  salary double
);
# 方式二:
create table employee (
	eid int,
  name varchar(20),
  deptId int,
  salary double,
  constraint pk1 primary key(eid)  -- constraint pk1可以省略
);

​ 添加多列联合主键

  • 联合主键就是这个主键由一张表中多个字段组成,需要注意,当主键由多个字段组成时,不能直接再字段名后面声明主键约束,与此同时,一张表只能有一个主键,联合主键也是一个主键
create table 表名(
	...
  primary key(字段1, 字段2, ..., 字段n)
);
  • 例如:
create table employ(
	name varchar(20),
  deptId int,
  salary double,
  primary key(name, deptId)
);

​ 还可以通过修改表结构来添加主键

create table 表名(
	...
);
alter table <表名> add primary key(字段列表);
  • 例如:
create table emp(
	eid int,
  name varchar(20),
  deptId int,
  salary double
);

# 1.添加单列主键
alter table emp add primary key (eid);
# 2.添加多列主键
alter table emp add primary key (eid, name);

​ 删除主键

  • 一个表中不需要主键约束时,就需要从表中将其删除,删除主键约束的方法比创建主键约束容易多。
alter table <表名> drop primary key;
  • 例如:
alter table emp drop primary key;

8.2 自增长约束

  • 概念:在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库根据定义自动赋值,没增加一条记录,主键就会自动以相同步长进行增长。可以给字段添加 auto_increment属性来实现主键的自增长。
字段名 数据类型 auto_increment
  • 例如:
create table user1(
	id int primary key auto_increment,
	name varchar(20)
);

# 向表中插入数据
insert into user1 values(NULL, '张三');
insert into user1(name) values('李四');
  • 特点:(a) 默认情况下,auto_increment初始值为1,每新增一条记录,字段值自动加1;(b)一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分);(c) auto_increment约束必须具备Not NULL属性;(d) auto_increment约束字段只能是整数类型(TINYINT,SMALLINT,INT,BIGINT等);(e) auto_increment约束字段的最大值受该字段数据类型约束,如果达到上限,auto_increment就会失效。

​ 指定自增字段初始值

# 方法一:
create table user2(
	id int primary key auto_increment,
  name varchar(20)
) auto_increment=100;

insert into user2 values(NULL, '张三');
insert into user2(name) values('李四');

# 方法二:
create table user3(
	id int primary key auto_increment,
  name varchar(20)
);
alter table user3 auto_increment=100;
insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');

​ delete和truncate在删除后自增列变化

  • delete数据后,自增长从断点开始;
delete from user3;

insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');
  • truncate数据后,自增在从默认起始值(设置的默认初始值也被重置为1)开始;
truncate user3;

insert into user3 values(NULL, '张三');
insert into user3(name) values('李四');

8.3 非空约束

  • 概念:MySQL非空约束(not null)指字段不能为空,对于使用了非空约束的字段,用户添加数据时每有指定值时,数据库系统会报错。
# 方式一:
<字段名> <数据类型> not null,

# 方式二:
alter table 表名 modify 字段 类型 not null;
  • 例如:
# 方式一:
create table user4(
	id int,
  name varchar(20) not null,
  address varchar(20) not null
);

# 方式二:
create table user5(
	id int,
  name varchar(20),
  address varchar(20)
);
alter table user5 modify name varchar(20) not null;
alter table user5 modify address varchar(20) not null;
  • **删除非空约束:**将后面的 not null去掉
alter table user4 modify name varchar(20);
alter table user4 modify address varchar(20);

8.4 唯一约束

  • 概念:唯一约束(unique key)是指所有记录中字段值不能出现重复,例如,为id字段加上唯一性约束后,每条记录id都是唯一的,不能出现重复的情况。
# 方式一:
<字段名> <数据类型> unique,
# 方式二:
alter table 表名 add constraint 约束名 unique(列);
  • 例如:
# 方式一:
create table user6(
	id int,
  name varchar(20),
  phone_number varchar(20) unique
);
# 方式二:
create table user7(
	id int,
  name varchar(20),
	phone_number varchar(20)
);

alter table user7 add constraint unique_pn unique(phone_number);
  • 删除约束
# 方式一对应删除操作:名字为对应列的名字
alter table user7 drop index phone_number;

# 方式二对应删除操作:
alter table user7 drop index unique_pn;

8.5 默认约束

  • MySQL默认值约束用来指定某列的默认值。
# 方式一
<字段名> <数据类型> default <默认值>

# 方式二:
alter table 表名 modify 列名 类型 default 默认值;
  • 例如:
# 方式一:
create table user8(
	id int,
  name varchar(20),
  address varchar(20) default '北京'
);

insert into user8(id, name) values(12, '张三');

# 方式二:
create table user9(
	id int,
  name varchar(20),
	address varchar(20)
);

alter table user9 modify address varchar(20) default '北京';
insert into user9(id, name) values(12, '张三');
  • 删除默认值约束
alter table user9 modify address varchar(20) default null;

8.6 零填充约束

  • 概念:插入数据时,当该字段值小于定义长度时,会在该值的前面补上相应的0,zerofill默认int(10),当使用zerofill时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原来的两倍,如有符号[-128, 127] -> 无符号 [0, 256]。
# 操作:
create table user10(
	id int zerofill,
  name varchar(20)
);
# 删除
alter table user10 modify id int;

9.数据类型

​ 数据类型指在创建表的时候,为表中字段指定数据类型,只有数据符合类型要求才能存储起来,使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用打的,这样就能节省存储空间。

  • 数值类型
类型 大小 范围(无符号,unsigned) 范围(有符号) 用途
TINYINT 1 byte (0, 255) (-128, 127) 小整数值
SMALLINT 2 bytes (0, 65535) (-32768, 32767) 大整数类型
MEDIUMINT 3 bytes (0, 16777215) (-8388608, 8388607) 大整数类型
INT或INTEGER 4 bytes (0, 4294967295) (-2147483648, 2147283647) 大整数类型
BIGINT 8 bytes (0,18446744073709551615) (-9223372036854775808, 922372036854775807) 极大整数
FLOAT 4 bytes 0,(1.175 494 351 E-38,3.402 823 466 E+38) (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 单精度浮点类型
DOUBLE 8 bytes (2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0, (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值类型
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
  • 日期和时间类型
类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP 4 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳
  • 字符串类型
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

10.参考资料


评论