- 1、数据库简介
- 2、数据库管理软件的分类
- 3、MySQL简介
- 4、部署MySQL
- 5、MySQL数据库基本管理
- 6、SQL语言
- 7、Mysql数据中的数据类型
- 8、MySQL数据表
- 9、数据表约束
- 10、增加字段
- 11、连表查询
- 12、子查询
1、数据库简介
1.数据:事物的状态
2.记录:事物的每一个状态
3.表:存放数据的载体
4.库:存放表的载体
5.数据库管理系统:DataBase Management System 简称DBMS,即管理所有的数据的库
6.数据库服务器:用来部署数据库管理系统软件的服务器
2、数据库管理软件的分类
1.关系型数据库(又称RDBMS:Relational Database Management System)
SQL Server、Oracle、MySQL、MariaDB、
2.非关系型数据库
Mongodb、Redis、Memcache
3、MySQL简介
1.MySQL是一个关系型数据库管理系统,关系数据库将数据保存在不同的表中,增加了速度并提高了灵活性。
2.由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
4、部署MySQL
三种方式部署MySQL,连接地址:https://www.cnblogs.com/90s-blog/p/15937673.html
5、MySQL数据库基本管理
5.1 设置Mysql初始密码
# 设置初始密码:首次登录的原密码为空,设置初始密码为123
[root@localhost ~]# mysqladmin -uroot password "123"
5.2 MySQL连接工具与方式
5.2.1 mysql自带工具:mysql
1. 常见的特定于客户机的连接选项:
-u: 指定用户 # mysql -uroot
-p: 指定密码 # mysql -uroot -pTest123! 或 mysql -uroot -p后输入密码
-h: 指定主机域 # mysql -uroot -pTest123! -h127.0.0.1
-P: 指定端口 # mysql -uroot -pTest123! -h127.0.0.1 -P3307
-S: 指定socket文件 # mysql -uroot -pTest123! -S /tmp/mysql.sock
-e: 指定SQL语句(库外执行SQL语句) # mysql -uroot -pTest123! -e "show databases;"
--protocol: 指定连接方式 # mysql --protocol=TCP --protocol=socket
2. 登录Mysql服务器
[root@mysql03 ~]# mysql -uroot -pTest123!
# 如果直接在命令行-p后面接密码,-p选项与密码之间不要有空格
3.连接方式
方式 1. TCP/IP的连接方式,通常登录带有-h选项
方式 2. 套接字连接方式,socket连接(默认使用socket方式连接)
# 查看连接方式: 连接页面输入命令 status;
5.3 第三方工具连接
我们最常用的数据库连接工具是navicat来连接数据库,这个数据库连接工具的功能非常强大,非常适合用来操作数据库。
在链接之前,必须在mysql中创建远程连接用户:
# 步骤1:创建
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'Oldboy@666' WITH GRANT OPTION;
# 步骤2:刷新权限
FLUSH PRIVILEGES;
创建连接用户后,在navicat菜单栏点connect下拉选项选择MySQL连接,输入相关内容测试连接通过后OK即可。
5.4 MySQL配置文件
MySQL配置文件的作用是配置MySQL,使MySQL按照我们指定的方式健康运行。
# 配置文件中的注释可以有中文,但是配置项中不能出现中文。
[root@mysql03 data]# vim /etc/my.cnf
[mysqld]
# 安装目录
basedir=/usr/local/mysql-5.7.36
# 存放数据的目录
datadir=/usr/local/mysql-5.7.36/data
# 指定端口号
port=3306
# 指定Socket文件存放路径
socket=/usr/local/mysql-5.7.36/data/mysql.sock
# 指定默认的字符集编码
character-set-server=utf8
# MySQL错误日志路径
log-error=/var/log/mysqld.log
# 指定MySQL pid文件路径
pid-file=/usr/local/mysql-5.7.36/data/mysqld.pid
[mysql]
socket=/usr/local/mysql-5.7.36/data/mysql.sock
[client]
socket=/usr/local/mysql-5.7.36/data/mysql.sock
5.5 统一字符集编码
1.在mysql中创建数据库指定字符集和校验规则:
create database db1 charset utf8mb4 collate utf8mb4_general_ci;
2.修改配置文件后重启mysqld服务再登录查看:
[root@mysql03 data]# vim /etc/my.cnf # 修改配置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[root@mysql03 data]# systemctl restart mysqld # 重启
[root@mysql03 data]# mysql -uroot -pTest123! # 登录
mysql> show VARIABLES like '%char%';
5.6 修改MySQL root密码
1.使用grant修改密码后再刷新权限:
mysql> grant all privileges on *.* to root@'%' identified by '123456';
mysql> flush privileges;
2.mysqladmin命令修改密码:
[root@mysql03 data]# mysqladmin -uroot -pTest123! password 'Test1234!'
3.通过password命令生成密码密文后去注册表修改密码:
mysql> select password('Test123!');
+-------------------------------------------+
| password('Test123!') |
+-------------------------------------------+
| *48B1BB7AD34484EF0632D4B9A748CC861DFBE88B |
+-------------------------------------------+
4.使用Alter修改密码:
mysql> alter user root@mysql03 identified by '密码';
5.通过打开注册表的方式跳过密码(慎用):
[root@mysql03 data]# vim /etc/my.cnf
skip-grant-tables # 打开注册表
[root@mysql03 data]# systemctl restart mysqld
6、SQL语言
6.1 SQL是什么
SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。与其他程序设计语言(如 C语言、Java 等)不同的是,SQL 由很少的关键字组成,每个 SQL 语句通过一个或多个关键字构成。
1)数据定义语言(Data Definition Language,DDL)
用来创建或删除数据库以及表等对象,主要包含以下几种命令:
● DROP:删除数据库和表等对象
● CREATE:创建数据库和表等对象
● ALTER:修改数据库和表等对象的结构
2)数据操作语言(Data Manipulation Language,DML)
用来变更表中的记录,主要包含以下几种命令:
● SELECT:查询表中的数据
● INSERT:向表中插入新数据
● UPDATE:更新表中的数据
● DELETE:删除表中的数据
3)数据查询语言(Data Query Language,DQL)
用来查询表中的记录,主要包含 SELECT 命令,来查询表中的数据。
4)数据控制语言(Data Control Language,DCL)
用来确认或者取消对数据库中的数据进行的变更。除此之外,还可以对数据库中的用户设定权限。主要包含以下几种命令:
● GRANT:赋予用户操作权限
● REVOKE:取消用户的操作权限
● COMMIT:确认对数据库中的数据进行的变更
● ROLLBACK:取消对数据库中的数据进行的变更
6.2 SQL的基本规则
1.SQL 语句要以分号(;)或\G结尾:区别是展示结果不一样,
2.SQL 语句不区分大小写 # 插入到表中的数据是区分大小写的
3.SQL的注释(破折号后面有一个空格): -- 注释内容
6.3 查看数据库
1.查看所有数据库:show databases;
2.查看数据库创建:show create database mysql;
3.查看正在使用的数据库:use mysql;select database();
6.4 创建数据库
mysql> CREATE DATABASE IF NOT EXISTS test01 CHARACTER SET utf8 COLLATE utf8_general_ci;
6.5 修改数据库
mysql> ALTER DATABASE test01 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
6.6 指定数据库
mysql> use test01;
6.7 删除数据库
mysql> DROP DATABASE test01;
6.8 数据库注释
1.单行注释(2种方式):#注释内容 或 -- 注释内容
2.多行注释:
/*
第一行注释内容
第二行注释内容
*/
7、Mysql数据中的数据类型
数据类型(data_type)是指系统中所允许的数据的类型。MySQL 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。MySQL 的数据类型有大概可以分为 5 种,分别是整数类型、浮点数类型和定点数类型、日期和时间类型、字符串类型、二进制类型等。
7.1 MySQL整数类型
整数类型又称数值型数据,数值型数据类型主要用来存储数字。
MySQL 提供了多种数值型数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。
MySQL 主要提供的整数类型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其属性字段可以添加 AUTO_INCREMENT 自增约束条件。下图中列出了 MySQL 中的数值类型及相关说明。
从图中可以看到,不同类型的整数存储所需的字节数不相同,占用字节数最小的是 TINYINT 类型,占用字节最大的是 BIGINT 类型,占用的字节越多的类型所能表示的数值范围越大。
根据占用字节数可以求出每一种数据类型的取值范围。例如,TINYINT 需要 1 个字节(8bit)来存储,那么 TINYINT 无符号数的最大值为 28-1,即 255;TINYINT 有符号数的最大值为 27-1,即 127。其他类型的整数的取值范围计算方法相同,如图所示。
# 案例:
# 1. 创建数据库ceshi
mysql> create database ceshi charset utf8mb4;
# 2. 查看创建完成
mysql> show databases;
# 3. 指定数据库ceshi
mysql> use ceshi;
# 4. 在ceshi库中创建表t1:id指定int,name指定varchar,age指定tinyint存储)
mysql> create table t1(id int ,name varchar(64) ,age tinyint);
7.2 MySQL小数类型
MySQL 中使用浮点数和定点数来表示小数。
浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE);定点类型只有一种,就是 DECIMAL。
浮点类型和定点类型都可以用(M, D)来表示,其中M称为精度,表示总共的位数;D称为标度,表示小数的位数。
浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10。下图中列出了 MySQL 中的小数类型和存储需求。
DECIMAL 类型不同于 FLOAT 和 DOUBLE。DOUBLE 实际上是以字符串的形式存放的,DECIMAL 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。
从图中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。
FLOAT 类型的取值范围如下:
● 有符号的取值范围:-3.402823466E+38~-1.175494351E-38。
● 无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38。
DOUBLE 类型的取值范围如下:
● 有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。
● 无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
7.3 MySQL字符串类型
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。
MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
下图中列出了 MySQL 中的字符串数据类型,括号中的M表示可以为其指定长度。
VARCHAR 和 TEXT 类型是变长类型,其存储需求取决于列值的实际长度(在前面的表格中用 L 表示),而不是取决于类型的最大可能尺寸。
例如,一个 VARCHAR(10) 列能保存一个最大长度为 10 个字符的字符串,实际的存储需要字符串的长度 L 加上一个字节以记录字符串的长度。对于字符 “abcd”,L 是 4,而存储要求 5 个字节。
# 案例:
mysql> CREATE TABLE test05 (
-> name VARCHAR(255)
-> );
mysql> CREATE TABLE test06( name ENUM("1","2","3") );
7.4 MySQL日期和时间类型
MySQL 中有多处表示日期的数据类型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。当只记录年信息的时候,可以只使用 YEAR 类型。
每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将“零”值插入数据库中。
下图中列出了 MySQL 中的日期与时间类型。
# 案例:
# 创库:
mysql> CREATE DATABASE db1 charset utf8;
# 指定库
mysql> use db1;
# 创表
mysql> create TABLE t1(id int, name VARCHAR(18), date1 DATE, date2 time, date3 datetime, date4 timestamp, date5 YEAR);
# 添数据
mysql> insert into t1 VALUES (1,'1', '2021-09-09','12:12:12','2021-09-09','2021-09-09','2021');
# 查看表数据
mysql> SELECT * from t1;
7.5 MySQL二进制类型
MySQL 中的二进制字符串有 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
下图中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。
# 案例:
import pymysql
class BlobDataTestor:
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1', user='root', passwd='123456', db='db1', port=3306)
def __del__(self):
try:
self.conn.close()
except:
pass
def closedb(self):
self.conn.close()
def setup(self):
cursor = self.conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS `Dem_Picture` (
`ID` int(11) NOT NULL auto_increment,
`PicData` mediumblob,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
""")
def testRWBlobData(self):
# 读取源图片数据
f = open("D:\\1.jpg", "rb")
b = f.read()
f.close()
# 将图片数据写入表
cursor = self.conn.cursor()
cursor.execute("INSERT INTO Dem_Picture (PicData) VALUES (%s)", (pymysql.Binary(b)))
# self.conn.commit()
# 读取表内图片数据,并写入硬盘文件
cursor.execute("SELECT PicData FROM Dem_Picture ORDER BY ID DESC limit 1")
d = cursor.fetchone()[0]
cursor.close()
f = open("D:\\1.jpg", "wb")
f.write(d)
f.close()
# 下面一句的作用是:运行本程序文件时执行什么操作
if __name__ == "__main__":
test = BlobDataTestor()
try:
test.setup()
test.testRWBlobData()
# test.teardown()
finally:
test.closedb()
7.6 MySQL系统变量
在 MySQL 数据库,变量分为系统变量和用户自定义变量。系统变量以 @@ 开头,用户自定义变量以 @ 开头。
服务器维护着两种系统变量,即全局变量(GLOBAL VARIABLES)和会话变量(SESSION VARIABLES)。全局变量影响 MySQL 服务的整体运行方式,会话变量影响具体客户端连接的操作。
每一个客户端成功连接服务器后,都会产生与之对应的会话。会话期间,MySQL 服务实例会在服务器内存中生成与该会话对应的会话变量,这些会话变量的初始值是全局变量值的拷贝。
1.查看系统变量:
mysql> show global variables;
2.查看与当前会话相关的所有会话变量以及全局变量:
mysql> show session variables;
8、MySQL数据表
数据表是数据库的重要组成部分,每一个数据库都是由若干个数据表组成的。换句话说,没有数据表就无法在数据库中存放数据。
8.1 创建数据表
在创建数据库之后,接下来就要在数据库中创建数据表。所谓创建数据表,指的是在已经创建的数据库中建立新表。
创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。接下来我们介绍一下创建数据表的语法形式。
在 MySQL 中,可以使用 CREATE TABLE 语句创建表。
其语法格式为:CREATE TABLE <表名> ([字段1][字段类型1],[字段2][字段类型2],...);
# 案例:
mysql> create table t2 (id int,name varchar(20),age tinyint);
8.2 修改数据表
修改数据表的前提是数据库中已经存在该表。修改表指的是修改数据库中已经存在的数据表的结构。修改数据表的操作也是数据库管理中必不可少的,就像画素描一样,画多了可以用橡皮擦掉,画少了可以用笔加上。
不了解如何修改数据表,就相当于是我们只要画错了就要扔掉重画,这样就增加了不必要的成本。
1.修改表名:MySQL 通过 ALTER TABLE 语句来实现表名的修改。
语法格式为:ALTER TABLE <旧表名> RENAME [TO] <新表名>;
# 案例:
mysql> alter table t2 rename to t1;
2.修改表字符集:MySQL 通过 ALTER TABLE 语句来实现表字符集的修改。
语法格式为:ALTER TABLE 表名 [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名>;
# 案例:
mysql> show collation; # 查看字符集编码
mysql> ALTER TABLE t1 CHARACTER set utf8mb4 COLLATE utf8mb4_general_ci;
mysql> show create table t1;
3.修改表字段:在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列或表等。
其语法格式为:ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
# 案例:
mysql> alter TABLE t1 change age nianling int;
4.修改字段数据类型:修改字段的数据类型就是把字段的数据类型转换成另一种数据类型。
语法格式为:ALTER TABLE <表名> MODIFY <字段名> <数据类型>
# 案例:
mysql> alter table t1 modify nianling tinyint;
8.3 删除数据表
在 MySQL 数据库中,对于不再需要的数据表,我们可以将其从数据库中删除。
在删除表的同时,表的结构和表中所有的数据都会被删除,因此在删除数据表之前最好先备份,以免造成无法挽回的损失。
下面我们来了解一下 MySQL 数据库中数据表的删除方法。
1.删除数据表
基础语法:使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式为:DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]
# 案例:
mysql> drop table t1;
2.删除字段:删除字段是将数据表中的某个字段从表中移除,语法格式:ALTER TABLE <表名> DROP <字段名>;
mysql> alter table t2 drop age;
8.4 表数据的增删改查
1.增加表数据:增加数据其实就是向表中插入数据,或者是向表中添加数据。
语法格式:INSERT INTO <表名> (字段1,字段2,...字段n) VALUES (数据1,数据2...数据n);
# 案例:
mysql> insert into t2 (id,name,age) values (1,'qql'),(2,'xx'),(3,'yy');
mysql> insert into t2 values (4,'zz'),(5,'aa'),(6,'tt');
2.查询数据:表中保存了很多数据,其目的就是为了使用的时候可以立即查询出来,所以数据库的查询语句的使用率是其他语句的数倍。语法格式为:SELECT [查询字段] FROM [表名] [条件语句] [显示规则] [规则条件]
# 案例:
mysql> SELECT * from t2;
mysql> SELECT name from t2;
3.条件语句(where):条件语句是用来筛选数据的,主要用于查询某些数据
判断条件包含:
> :大于
< : 小于
= :等于
!= 和 <> : 不等于
>= : 大于等于
<= : 小于等于
like : 模糊查询
and : 并且
or :或者
# 案例:
mysql> SELECT * from t2 where id>4;
mysql> SELECT * FROM t2 WHERE id >= 1 OR name = zz;
4.排序(order by): 顾名思义就是按照某种规则查询出数据,默认情况下是按照从前到后查询数据,但是也可以通过排序语法查询出相关的数据。语法格式:SELECT [查询字段] FROM [表名] [显示规则]
-- 排序的规则
ASC :默认,正向排序
DESC :反向排序
# 案例:
mysql> select * from t2 order by id desc;
5.去重(DISTINCT):去重,顾名思义就是在查询的数据中过滤掉重复数据,默认会显示所有的数据,可以使用出重语法实现去掉重复数据。语法格式为:SELECT DISTINCT [字段] FROM [表名];
# 案例:
mysql> select distinct name from t2;
6.别名:顾名思义就是将字段设置一个新的名字。
# 案例:
mysql> select count(id) '行数' from t2;
7.常用函数:在数据库中使用函数就是通过函数实现某种具体的功能。
# 案例:计算个数
mysql> SELECT count(id) FROM t2;
# 案例:求和
mysql> select sum(id) from t2;
# 案例:求平均值
mysql> select avg(id) from t2;
8.having语句:having也是一个条件判断语句,是作用于查询之后的语句。
# 案例:
mysql> SELECT * FROM t2 WHERE id >2 HAVING name='zz';
9.分组:按照某种要求进行分组查询
# 案例:
mysql> SELECT SUM(id) FROM t2 GROUP BY name;
8.5 修改表数据
在数据表中存储的数据时常都会有所更改,例如:是否单身,是今天是否国庆。所以,怎么会随着一些事务的推移从而需要修改表数据,这个时候我们就需要用到MySQL UPDATE语句。
语法格式为:UPDATE <表名> SET [修改的内容] [条件];
# 案例:
mysql> UPDATE t2 SET name = 'cc',id = 7 where name='aa';
mysql> UPDATE t2 SET name = 'ww',id = 7 where name='cc';
8.6 删除表数据
删除表数据,就是当数据表中有错误或者没有任何价值的数据时,通过SQL语句去将这部分数据删除。
语法格式为:DELETE FROM <表名> [条件];
# 案例:
mysql> DELETE FROM t2;
mysql> DELETE FROM t2 WHERE id = 2;
mysql> TRUNCATE TABLE t2;
9、数据表约束
索引约束和数据类型约束,从字段名字上可以知道,它是为了控制数据而生的。
9.1 主键索引约束
所谓的主键约束就是在数据表中(一般是id字段),选择一个字段充当索引角色。强烈建议一个表中至少要有一个主键索引约束。主键是一个字段的类型,不能够单独的存在。主键索引的数据库底层的数据是按照一定顺序进行排序的,取数的时候效率更高。
# 案例:创建一个具有主键索引的数据表
mysql> -- 创建一个具有主键索引的数据表
mysql> CREATE TABLE IF NOT EXISTS t1(
id int PRIMARY KEY,
name VARCHAR(20)
);
mysql> -- 插入数据
mysql> INSERT INTO t1 (id, name) VALUES (1, '小仙女'),(2,"小帅哥");
1.自增长:在日常使用数据库的时候常常不知道当天数据的主键索引的编号属于哪一个,这个时候我们就很需要一个自动为我们填充主键编号的功能即为:自增长。
# 案例:自动填充主键
mysql> -- 创建一个具有主键索引的数据表
mysql> CREATE TABLE IF NOT EXISTS t3(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
mysql> -- 查看表信息
mysql> SHOW CREATE TABLE t3\G
mysql> -- 多次插入数据查看id会不会自增长
mysql> INSERT INTO t3 (name) VALUES ( '小仙女'),("小帅哥");
mysql> INSERT INTO t3 (name) VALUES ( '小仙女'),("小帅哥");
mysql> INSERT INTO t3 (name) VALUES ( '小仙女'),("小帅哥");
mysql> SELECT * FROM t3;
# 案例2:设置自动增长的起始值
mysql> -- 创建一个具有主键索引的数据表
CREATE TABLE IF NOT EXISTS t4(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
) ENGINE=INNODB AUTO_INCREMENT=10000;
mysql> -- 填入输入
mysql> insert into t4 (name) values ('小仙女'),("小帅哥");
mysql> insert into t4 (name) values ('小仙女'),("小帅哥");
mysql> insert into t4 (name) values ('小仙女'),("小帅哥");
mysql> select * from t4;
9.2 添加主键
当数据表已经创建完毕了,我们需要为该表添加主键,如何添加呢?
语法格式:ALTER TABLE <数据表> ADD PRIMARY KEY(字段名称);
# 案例:
mysql> -- 创建一个没有主键索引的数据表
mysql> CREATE TABLE IF NOT EXISTS t5(
id int ,
name VARCHAR(20)
);
mysql> DESC t5;
mysql> -- 添加主键
mysql> alter table t5 add primary key(id);
mysql> DESC t5;
9.3 删除主键
当数据表不需要主键时,我们可以尝试将其删除.
语法格式为:ALTER TABLE <数据表名> DROP PRIMARY KEY;
# 案例:
mysql> alter table t5 drop primary key;
mysql> desc t5;
9.4 唯一索引约束
唯一索引约束跟主键索引类似,也是要求不允许重复,但是主键索引一般作用于id, 唯一索引可以作用于所有的字段。同理唯一索引也是依赖于字段,能够单独存在。唯一索引不能代替主键索引,不能直接去数据库底层取数,主键索引的数据库底层存储数据是无序的,因此取数的时候速度时快时慢,抖动较大。
# 案例:
mysql> create table if not exists t6(id int primary key,name varchar(20) unique key)engine=innodb;
mysql> desc t6;
mysql> insert into t5 (id,name) values (1,"小仙女");
mysql> insert into t6 (id,name) values (1,"小仙女");
mysql> insert into t6 (id,name) values (2,"小仙女");
9.5 检查索引
检查索引,顾名思义就是通过设置范围,来管控数据。
# 案例:
mysql> CREATE TABLE IF NOT EXISTS t7(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) ,
code tinyint(2) CHECK( code > 100 AND code < 200 )
) ENGINE=INNODB;
mysql> desc t7;
mysql> INSERT INTO t7 (name, code) VALUES ("小仙女", 20);
mysql> INSERT INTO t7 (name, code) VALUES ("小仙女", 2000);
9.6 外键索引(不推荐使用)
外键索引顾名思义就是依赖别的表的数据的一种索引。
# 案例:
mysql> CREATE TABLE city(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
mysql> CREATE TABLE city2(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
fid int ,
FOREIGN KEY(fid) REFERENCES city(id)
);
mysql> DESC city;
mysql> DESC city2;
mysql> INSERT INTO city2 (name,fid) VALUES ("青浦区", 1);
mysql> INSERT INTO city (name) VALUES ("上海市");
mysql> INSERT INTO city2 (name,fid) VALUES ("青浦区", 1);
mysql> SELECT * FROM city;
mysql> SELECT * FROM city2;
# city2变依赖于city变数据,当city表中没有相关数据时,则不能够添加数据到city2。
10、增加字段
MySQL数据表是由行和列构成的,通常把表的“列”称为字段(Field),把表的“行”称为记录(Record)。随着业务的变化,可能需要在已有的表中添加新的字段。
10.1 在开头位置添加字段
MySQL 默认在表的最后位置添加新字段,如果希望在开头位置(第一列的前面)添加新字段,那么可以使用 FIRST 关键字。
语法格式:ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] FIRST;
# 案例:
mysql> DESC t7;
mysql> ALTER TABLE t7 ADD address VARCHAR(20) FIRST;
mysql> DESC t7;
10.2 在中间位置添加字段
MySQL 除了允许在表的开头位置和末尾位置添加字段外,还允许在中间位置(指定的字段之后)添加字段,此时需要使用 AFTER 关键字。
语法格式为:ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] AFTER <已经存在的字段名>;
# 案例:
mysql> DESC t7;
mysql> ALTER TABLE t7 ADD hobby VARCHAR(20) after name;
mysql> DESC t7;
10.3 在末尾位置添加字段
一个完整的字段包括字段名、数据类型和约束条件。
语法格式:ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件];
# 案例:
mysql> DESC t7;
mysql> ALTER TABLE t7 ADD city VARCHAR(20);
mysql> DESC t7;
10.4 字段的琐碎内容
1、是否允许为空:设置是否允许字段为空。其格式是:NOT NULL
# 案例:
mysql> CREATE TABLE IF NOT EXISTS t8(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
) ENGINE=INNODB;
mysql> CREATE TABLE IF NOT EXISTS t9(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
) ENGINE=INNODB;
mysql> INSERT INTO t9 (id) VALUES (10);
mysql> INSERT INTO t8 (id) VALUES (10);
mysql> INSERT INTO t8 (name) VALUES ( '小仙女');
2.默认值: DEFAULT '默认值'
# 案例:
默认值,顾名思义就是给字段设置一个默认值,当字段没有添加任何值的时候,使用默认值进行填充。
mysql> CREATE TABLE IF NOT EXISTS t10(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) DEFAULT "小仙女"
) ENGINE=INNODB;
mysql> DESC t10;
mysql> INSERT INTO t10 (id) VALUES (10);
mysql> SELECT * FROM t10;
3.字段注释:给字段一个注释,有利于后期维护的时候快速理解字段含义
# 案例:
mysql> CREATE TABLE IF NOT EXISTS pm11(
id int PRIMARY KEY AUTO_INCREMENT COMMENT "主键字段",
name VARCHAR(20) DEFAULT "小仙女" COMMENT "名字"
) ENGINE=INNODB;
mysql> SHOW CREATE TABLE pm11\G
11、连表查询
两个或多个表至之间通过某种关系,按照某种规则合并起来查询出来的数据即为连表查询,连表查询是企业中常用一种查询数据方式,在关系型数据库中连表查询是很常见的。但是连表查询仅仅限于同一个数据库内多张数据表相互链接,不同数据库中的数据便无法使用连表查询。
11.1 内连接(INNER JOIN )
把两个数据表中的所有的数据一次性按照某种条件一次性查询出来。
# 案例:
mysql> create database ceshi character set utf8 collate utf8_general_ci;
mysql> use ceshi;
mysql> CREATE TABLE IF NOT EXISTS student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT "学生名称",
age TINYINT(2) NOT NULL DEFAULT 18 COMMENT "年龄"
);
mysql> CREATE TABLE IF NOT EXISTS major (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT "专业名称"
);
mysql> CREATE TABLE IF NOT EXISTS student_major(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT NOT NULL COMMENT "学生表ID",
m_id INT NOT NULL COMMENT "专业表ID"
);
mysql> CREATE TABLE IF NOT EXISTS teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT "老师名称"
);
mysql> CREATE TABLE IF NOT EXISTS tearch_major(
id INT PRIMARY KEY AUTO_INCREMENT,
tea_id INT NOT NULL COMMENT "老师表ID",
m_id INT NOT NULL COMMENT "专业表ID"
);
mysql> INSERT INTO student (name,age) VALUES ("小明", 18),("小红", 17),("小花", 16);
mysql> INSERT INTO major (name) VALUES ("数学"),("英语"),("毛概");
mysql> INSERT INTO teacher (name) VALUES ("李铁锤"),("石林"),("为李飞");
mysql> select * FROM teacher;
mysql> select * FROM student;
mysql> select * FROM major;
mysql> INSERT INTO student_major (stu_id, m_id) VALUES (1, 1),(1,2);
mysql> INSERT INTO student_major (stu_id, m_id) VALUES (2, 1),(2,3);
mysql> INSERT INTO student_major (stu_id, m_id) VALUES (3, 1),(3,2),(3,3);
mysql> INSERT INTO tearch_major (tea_id, m_id) VALUES (1,3),(2,1),(3,2);
mysql> select * FROM tearch_major;
# 1、查询出小明选修哪几门课?
mysql> SELECT student.id,student.name,student.age, major.name FROM student INNER JOIN student_major ON student.id = student_major.stu_id INNER JOIN major ON student_major.m_id = major.id WHERE student.id = 1;
# 2、查询出小花选修的课的老师有哪些?
mysql> SELECT student.id,student.name,student.age, major.name,teacher.name FROM student INNER JOIN student_major ON student.id = student_major.stu_id INNER JOIN major ON student_major.m_id = major.id INNER JOIN tearch_major ON tearch_major.m_id = major.id INNER JOIN teacher ON teacher.id = tearch_major.tea_id WHERE student.id = 3;
11.2 左连接(LEFT JOIN)
左连接顾名思义就是以左边的表为主表,其他的表为副表;也就是说会把左边表中所有的符合条件的数据全部查询出来,至于后面的表有没有内容不管,没有内容则用空来代替。
# 案例:
-- 插入一个学生数据
mysql> INSERT INTO student (name, age) VALUES ("铁锤", 18);
mysql> SELECT * FROM student LEFT JOIN student_major ON student.id = student_major.stu_id ;
mysql> SELECT * FROM student INNER JOIN student_major ON student.id = student_major.stu_id;
mysql> SELECT * FROM student LEFT JOIN student_major ON student.id = student_major.stu_id ;
mysql> SELECT * FROM student INNER JOIN student_major ON student.id = student_major.stu_id;
11.3 右链接(Right JOIN)
右链接顾名思义就是用右边表作为主表,其他表作为副表。也就是说,右链接是会把右边的表中的所有的数据全部都查询出来,至于左边的表如果没有数据既用空代替。
# 案例:
mysql> INSERT INTO student_major (stu_id,m_id) VALUES (4, 5);
mysql> SELECT * FROM major LEFT JOIN student_major ON major.id = student_major.m_id;
+----+--------+------+--------+------+
| id | name | id | stu_id | m_id |
+----+--------+------+--------+------+
| 1 | 数学 | 1 | 1 | 1 |
| 2 | 英语 | 2 | 1 | 2 |
| 1 | 数学 | 3 | 2 | 1 |
| 3 | 毛概 | 4 | 2 | 3 |
| 1 | 数学 | 5 | 3 | 1 |
| 2 | 英语 | 6 | 3 | 2 |
| 3 | 毛概 | 7 | 3 | 3 |
| 4 | Linux | NULL | NULL | NULL |
+----+--------+------+--------+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM major RIGHT JOIN student_major ON major.id = student_major.m_id;
+------+--------+----+--------+------+
| id | name | id | stu_id | m_id |
+------+--------+----+--------+------+
| 1 | 数学 | 1 | 1 | 1 |
| 1 | 数学 | 3 | 2 | 1 |
| 1 | 数学 | 5 | 3 | 1 |
| 2 | 英语 | 2 | 1 | 2 |
| 2 | 英语 | 6 | 3 | 2 |
| 3 | 毛概 | 4 | 2 | 3 |
| 3 | 毛概 | 7 | 3 | 3 |
| NULL | NULL | 8 | 4 | 5 |
+------+--------+----+--------+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM major INNER JOIN student_major ON major.id = student_major.m_id;
+----+--------+----+--------+------+
| id | name | id | stu_id | m_id |
+----+--------+----+--------+------+
| 1 | 数学 | 1 | 1 | 1 |
| 2 | 英语 | 2 | 1 | 2 |
| 1 | 数学 | 3 | 2 | 1 |
| 3 | 毛概 | 4 | 2 | 3 |
| 1 | 数学 | 5 | 3 | 1 |
| 2 | 英语 | 6 | 3 | 2 |
| 3 | 毛概 | 7 | 3 | 3 |
+----+--------+----+--------+------+
7 rows in set (0.00 sec)
11.4 合并数据
顾名思义就是将多个SQL语句查询出来的数据合并一次性查询出来。需要注意的是,两边的字段必须一致。
# 案例:
mysql> SELECT name,age FROM student UNION SELECT * FROM teacher;
+--------+-----------+
| name | age |
+--------+-----------+
| 小明 | 18 |
| 小红 | 17 |
| 小花 | 16 |
| 铁锤 | 18 |
| 1 | 李铁锤 |
| 2 | 石林 |
| 3 | 为李飞 |
+--------+-----------+
7 rows in set (0.00 sec)
12、子查询
子查询顾名思义就是在SQL中依赖于另一个SQL语句的结果来共同查询一个结果。每一个子查询语句只能够返回一条数据。在工作用极其不建议使用子查询,因为子查询的性能非常低。
# 案例:
mysql> SELECT * FROM student WHERE id = (SELECT DISTINCT stu_id FROM student_major LIMIT 1);
+----+--------+-----+
| id | name | age |
+----+--------+-----+
| 1 | 小明 | 18 |
+----+--------+-----+
1 row in set (0.00 sec)