MySQL
SQL 语句 孰能生巧
DDL
对数据库 表结构 增加、修改 删除操作
DML
表结构中的数据 增加( insert
)、修改( update
) 删除( delete
) 查询( select
)
DQL
用来查询所需要的信息
1 . 安装
- 下载
启动
初始化 :
mysqld --initialize --user=mysql --console
账号 : root 密码 : re0oGwlny9_r(随机)
- 添加服务 :
mysqld -install
- 启动服务 :
net start mysql
- 登录 :
mysql -u root -p
- 改密码 : ALTER USER root@localhost IDENTIFIED BY 'xxxx';
通过Navicat来连接和管理
报错的话 :
2 . DDL
1 . 基本操作
查询
-- 查询所有数据库名称 show databases; -- 查询正在使用的数据库 select database() -- 使用数据库 use xxx;
创建
-- 创建数据库 create database xxx; -- 先判断再创建 create database if not exists xxx; -- 创建并指定字符集 create database xxx character set 字符集名;
删除
drop database xxx; -- 判断删除 drop database if exists xxx;
2 . 表结构创建
先指定表结构在哪个数据库中
创建表
create table if not exists xxx( 列名1 数据类型[长度] [字段约束], 列名2 数据类型[长度] [字段约束], 列名3 数据类型[长度] [字段约束] ); eg: create database if not exists Atanycosts; use Atanycosts; create table if not exists Atanycosts( id int, name varchar(20), create_time date, QQ int(10); );
修改表
-- 修改表名称 alter table xxx rename to xxx;
删除表
drop table xxx; drop table if exists xxx;
3 . 数据类型
三种 : 数值
、日期/时间
和字符串(字符)
类型
1 . 数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
FLOAT | 4 Bytes | (-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 Bytes | (-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) | 双精度 浮点数值 |
其他不管
2 . 字符串类型
char(n)
和 varchar(n)
中括号中 n 代表字符的个数,并不代表字节个数,比如 char(30)
就可以存储 30 个字符
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TEXT | 0-65 535 bytes | 长文本数据 |
其他不管
3 . 日期和时间类型
表示时间值的日期和时间类型为 year
、date
、time
、datetime
和 timestamp
。
类型 | 大小(bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
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 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
2 . DML
数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert
、delete
、udpate
和select
等
insert
-- INSERT INTO 语句用于向表格中插入新的行 -- 语法格式: -- 插入数据列与值的顺序需要一一对应 INSERT INTO 表名称 (列名1,列名2 ...) VALUES (值1, 值2,....) -- 向表中插入所有列 INSERT INTO 表名称 VALUES (值1, 值2,....) --eg: INSERT INTO `Atanycosts` (`id`, `name`, `age`, `addres`, `create_time`) VALUES (1, 'mm', 1, '1', '2022-01-20 03:51:54'); INSERT INTO `Atanycosts` VALUES (1, 'mm', 1, '1', '2022-01-20 03:51:54');
update
-- 语法格式: -- 直接修改整张表的所有行数据 update 表名称 set 字段=值,字段=值,...; -- 根据条件查找到对应行数据 修改 update 表名称 set 字段=值,字段=值,... where 条件 -- 例子: UPDATE Atanycosts ` SET `name` = 'mm', `age` = 25 WHERE `id` = 1; -- 修改所有 UPDATE Atanycosts ` SET `name` = 'mm', `age` = 25
delete
-- 语法格式: -- 根据条件删除表中的数据 delete from 表名称 where 条件 -- 清空表中所有的数据 TRUNCATE Atanycosts; -- eg: --根据条件id=1 删除id=1 行数据 delete from Atanycosts where where id=1; -- 清空表中所有的数据 delete from Atanycosts; --清空表中所有的数据 TRUNCATE Atanycosts;
TRUNCATE
与delete
不同?truncate
: 会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;delete
: 逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
3 . 约束
用于限制表中的数据,为了保证表中数据的准确性和可靠性
约束分类
- PRIMARY KEY :主键,用于保证该字段的值具有唯一性并且非空
- AUTO_INCREMENT : 自动增长约束
- NOT NULL :非空,用于保证该字段的值不能为空
- UNIQUE :唯一,用于保证该字段的值具有唯一性,可以为空
- DEFAULT :默认值,用于保证该字段有默认值
- CHECK :检查约束(MySql不支持),检查字段的值是否为指定的值。
- FOREIGN KEY :外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值
1 . 主键约束
1 . 单列主键
-- 语法格式:
CREATE TABLE 表的名称 (
<字段名> <数据类型> PRIMARY KEY
}
-- eg:
CREATE TABLE `Atanycosts` (
`id` int PRIMARY KEY ,
`name` varchar(255) ,
`age` int
) ;
2 . 联合主键
联合主键(复合主键),由多个列(字段组成)
-- PRIMARY key (主键列);
CREATE TABLE `Atanycosts` (
`id` int,
`name` varchar(255),
`age` int ,
`phone` varchar(11) ,
PRIMARY KEY (id,phone)
);
2 . 自动增长约束
注意:
1.一张表中只能有一个自动增长的字段
2.配合主键一起使用 并且只适用于整数类型
3.自动增长默认的初始值1,每增加一条记录,该字段的值会增加1
-- 语法格式如下:
-- 字段名 数据类型 AUTO_INCREMENT
CREATE TABLE `Atanycosts` (
`id` int PRIMARY KEY AUTO_INCREMENT ,
`name` varchar(255),
`age` int ,
`phone` varchar(11)
)AUTO_INCREMENT=1000; -- 指定初始值,可不指定
-- 创建之后指定
alter table Atanycosts AUTO_INCREMENT 2000;
3 . 非空约束
创建表的时候
<字段名><数据类型>NOT NULL;
-- not null 非空约束用于确保当前列的值不为空
CREATE TABLE `Atanycosts` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int NOT NULL,
`phone` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
);
4 . 唯一约束
所有记录中该字段的值不能重复出现
可以有多个唯一约束
CREATE TABLE `Atanycosts` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`age` int DEFAULT NULL,
`phone` varchar(11) ,
PRIMARY KEY (`id`),
UNIQUE KEY `test` (`phone`) -- 指定约束名称和约束字段
);
-- UNIQUE KEY 约束名称 (约束字段)
-- 添加约束名称是为了方便 直接删除
-- 在修改表时添加唯一约束
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE (<列名>);
ALTER TABLE Atanycosts ADD CONSTRAINT test UNIQUE(phone);
-- 删除约束
ALTER TABLE Atanycosts DROP INDEX test;
5 . 默认约束
在创建表时设置默认值约束
<字段名> <数据类型> DEFAULT <默认值>;
CREATE TABLE `Atanycosts` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT 'Atanycosts',
`age` int DEFAULT 1,
`phone` varchar(11) ,
PRIMARY KEY (`id`)
);change column
-- 在修改表时添加默认值约束
ALTER TABLE <数据表名>
CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
ALTER TABLE Atanycosts
CHANGE COLUMN phone varchar(11) DEFAULT '1111';
6 . 零填充约束
create table 表名称
(
字段名称 int zerofill,
...
);
-- eg:
-- id int(10)
-- id=1
-- 0000000001
7 . delete与truncate 删除数据区别
区别 :
delete
删除数据之后,自动增长还是从最后一个删除数据的id基础上做自增;
逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
truncate
清空数据之后 自动增长是从初始值1开始
会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;
-- 清空表数据
delete from Atanycosts;
truncate Atanycosts;
4 . DQL
1 . 如何使用
-- 创建数据库 ddl
create DATABASE if not EXISTS test;
-- 使用mayikt数据库
use test;
drop table Atanycosts;
-- 创建mayikt_student学生表
CREATE TABLE `Atanycosts` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(10) not null COMMENT '姓名',
`age` tinyint COMMENT '年龄',
`address` varchar(255) COMMENT '地址',
`class_id` int COMMENT '班级id',
PRIMARY KEY (`id`)
);
-- 新增测试数据 dml
INSERT INTO Atanycosts VALUES(NULL,'余胜军',28,'湖北武汉','01');
INSERT INTO Atanycosts VALUES(NULL,'小哈',21,'上海','01');
INSERT INTO Atanycosts VALUES(NULL,'张三',17,'北京','02');
INSERT INTO Atanycosts VALUES(NULL,'李四',22,'山东','02');
INSERT INTO Atanycosts VALUES(NULL,'王麻子',11,'四川','02');
-- 1.查询所有的学生
select * from Atanycosts;
-- 2.查询学生的姓名和年龄
select name,age from Atanycosts;
-- 3.别名称查询 使用关键字as
select * from Atanycosts as student;
-- 4.列别名称
select name as 姓名,age 年龄 from Atanycosts as student;
-- 5.去重复值
select DISTINCT class_id from Atanycosts;
-- 6.查询结果是表达式(运算值);将所有的学生年龄+5岁
select name,age+5 as age from Atanycosts;
2 . 运算符
3 . 排序
asc
代表 升序排列desc
代表降序排列 默认是为升序;order by
可以支持单个字段,多个字段 ;order by
放在查询语句最后面,limit
分页除外;-- 1.根据学生年龄从小到大; SELECT * from Atanycosts order by age; -- 2.根据学生年龄从大到小; SELECT * from Atanycosts order by age desc; -- 3.判断学生的年龄大于18岁,在从小到大排序 SELECT * from Atanycosts where age>18 order by age ; -- 4.根据学生的年龄从大到小排序,以班级id 从小到大排序 当年龄相同 则根据 班级id从小到大排序 SELECT * from Atanycosts order by age desc ,class_id desc ; -- 5.根据班级id去重,根据班级id从大到小排序 SELECT DISTINCT class_id from Atanycosts ORDER BY class_id desc;
一般的情况下我们使用数字排序,从小到大 或者从大到小
如果是字母排序 则 根据字母的顺序 从A到Z排序 或者Z到A顺序
如果是汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序
4 . 分页
-- 方式1:显示前n条
select 字段1,字段2 ... from Atanycosts limit n
-- 方式2:分页显示
select 字段1,字段2 ... from Atanycosts limit m,n
SELECT * from Atanycosts limit 5; -- 前5条数据
SELECT * from Atanycosts limit 5,5; -- 从第6条开始显示 显示5条
m :表示从第几条索引开始 计算方式 ( 当前页 - 1) *
每页显示条数
n :表示查询多少条数据
5 . 聚合
不急
6 . 分组
不急
5 . 多表关系
不急