MYSQL学习笔记

这篇博客详细介绍了MySQL数据库的基本操作,包括登录、查询、创建与删除数据表,以及数据类型。此外,还讨论了主键、唯一性、非空、默认和外键约束。博客还涵盖了数据表设计的范式,如1NF、2NF和3NF。通过一系列查询练习,深入讲解了SQL查询技巧,包括各种连接查询和事务处理。
摘要由CSDN通过智能技术生成

MYSQL 学习笔记

一、终端操作 MYSQL数据库

1.基本操作

登录数据库服务器

在MySQL安装目录的 bin 目录下执行命令:

mysql -u root -p
查询数据库服务器中所有的数据库
show databases;
选中某一个数据库进行操作
use mysql;
查询数据库中所有的数据表
show tables;
退出服务器
exit;
在数据库服务器创建数据库
create database qiyi;
创建数据表
mysql> create table pet(  
 	-> name VARCHAR(20),
    -> sex CHAR(1),
    -> birth DATE);

mysql> show tables;
+----------------+
| Tables_in_qiyi |
+----------------+
| pet            |
+----------------+
1 row in set (0.00 sec)

mysql> describe pet;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(20) | YES  |     | NULL    |       |
| sex   | char(1)     | YES  |     | NULL    |       |
| birth | date        | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
删除数据表
drop table user2;
向数据表中添加记录
insert into pet values('cat','m','1899-03-30');
删除数据表中记录
delete from pet where name='cat';
修改数据表中记录
update pet set sex='m' where name='rabit';
查找数据表中记录
select * from user;

select * from city where ID=1;
MYSQL常见数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-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) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 字节 (-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) 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的值 小数值
日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 (字节) 范围 格式 用途
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:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

2.约束

分类
  • 主键约束(primary key) PK

    PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空

  • 自增约束(auto increment)

  • 外键约束(foreign key) FK

    FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
    在从表添加外键约束,用于引用主表中某列的值
    比如学生表的专业编号,员工表的部门编号,员工表的工种编号

  • 唯一性约束(unique)

    UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
    比如座位号

  • 非空约束(not null)

    NOT NULL:非空 ,用于保证该字段的值不能为空 比如姓名、学号等

  • 默认约束(default)

    DEFAULT:默认,用于保证该字段有默认值
    比如性别

  • 检查约束(目前MySQL不支持、Oracle支持)

    CHECK:检查约束【mysql中不支持】
    比如年龄、性别

    PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空

主键约束(primary key) PK

它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得改字段不重复且不为空。比如学号、员工编号等

create table user(id int primary key, name varchar(20));

mysql> describe user;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into user values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> select * from user;
+----+------+
| id | name |
+----+------+
|  1 | 张三 |
+----+------+
1 row in set (0.00 sec)

mysql> insert into user values(1,'fg');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> insert into user values(NULL,'fg');
ERROR 1048 (23000): Column 'id' cannot be null
复合主键

只要复合的主键值加起来不重复就可以,但复合组件内任何组件都不能为空。

create table user2(
id int, name varchar(20), password varchar(20), primary key(id,name)
);

mysql> describe user2;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   | PRI | NULL    |       |
| password | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

mysql> insert into user2 values(1,'abd','521334');
mysql> insert into user2 values(2,'abd','521334');
mysql> insert into user2 values(1,'abc','521334');

mysql>  select * from user2;
+----+------+----------+
| id | name | password |
+----+------+----------+
|  1 | abc  | 521334   |
|  1 | abd  | 521334   |
|  2 | abd  | 521334   |
+----+------+----------+

自增约束(auto increment)
create table user3(
	id int primary key auto_increment,
    name varchar(20),
    Password varchar(20)
);

insert into user3 (name) value('zhsng');

insert into user3 (name,Password) value('zhsndsgdnmg','53121534');

select * from user3;
+----+-------------+----------+
| id | name        | Password |
+----+-------------+----------+
|  1 | zhsng       | NULL     |
|  2 | zhsndsgdnmg | 53121534 |
+----+-------------+----------+
建表后添加/删除/修改主键
create table user4(
	id int,
    name varchar(20),
    Password varchar(20)
);
##添加主键约束
alter table user4 add primary key (id);

desc user4;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| Password | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

##删除主键约束
alter table user4 drop primary key;

##修改主键约束
alter table user4 modify id int primary key;
唯一性约束(unique)

UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
比如座位号


create table user5(
	id int,
    name varchar(20) unique,
    Password varchar(20)
);
##或者
create table user5(
	id int,
    name varchar(20),
    Password varchar(20)
);
alter table user5 add unique(name);
##或者
create table user6(
	id int,
    name varchar(20),
    password varchar(20),
    unique (id, name)##类似于复合主键
);


insert into user5 values(1,'abd','521334');
insert into user5 values(2,'abd','521334');


##删除唯一约束
alter table user5 drop index id;

##修改主键约束
alter table user5 modify id int unique;

非空约束(not null)

NOT NULL:非空 ,用于保证该字段的值不能为空 比如姓名、学号等

create table user6(
	id int,
    name varchar(20) not null,
    Password varchar(20)
);

 insert into user6 (id) value (1);
## ERROR 1364 (HY000): Field 'name' doesn't have a default value

insert into user6 (id,name) value (1,'dgsdkl');

mysql> select * from user6;
+------+--------+----------+
| id   | name   | Password |
+------+--------+----------+
|    1 | dgsdkl | NULL     |
+------+--------+----------+

默认约束(default)

DEFAULT:默认,用于保证该字段有默认值
比如性别

create table user7(
	id int,
    name varchar(20),
    age int default 10,
    Password varchar(20)
);

 desc user7;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | YES  |     | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| age      | int(11)     | YES  |     | 10      |       |
| Password | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

insert into user7 (id,name) value(1,'zhakgn');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user7;
+------+--------+------+----------+
| id   | name   | age  | Password |
+------+--------+------+----------+
|    1 | zhakgn |   10 | NULL     |
+------+--------+------+----------+
1 row in set (0.00 sec)
外键约束(foreign key) FK

FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值
比如学生表的专业编号,员工表的部门编号,员工表的工种编号

##班级
create table classes(
	id int primary key auto_increment,
    name varchar(20)
);

##学生
create table students(
	id int primary key auto_inrement,
    name varchar(20),
    class_id int,
    foreign key(class_id) references classes(id)
);

insert into classes (name) value('一班');
insert into classes (name) value('二班');
insert into classes (name) value('三班');
insert into classes (name) value('四班');

 select * from classes;
+----+------+
| id | na
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值