MySQL复习笔记(全套操作流程概述)

MySQL 简介

MySQL 是最流行的关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
在 WEB 应用方面, MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

客套话说完直接步入正题:

MySQL基本操作

sql 语句(DMQC):DDL 语句,DML 语句,DQL 语句,DCL 语句

DDL 语句 数据定义语言

用来定义数据库对象:数据库,表,列。关键字:create, drop, alter

DML 语句 数据操作语言

用来对数据库中表的数据进行增删改查。关键字:insert, delete, update

DQL 语句 数据查询语言

用来查询数据库中表的记录(数据)。关键字:select, where

DCL 语句 数据控制语言

用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE

sql 通用语法

sql 语句可以单行或多行,以分号结尾

可以使用空格和缩进来增强语句的可读性

mysql 数据库的 sql 语句不区分大小写,关键字建议使用大写

控制台连接数据库

// 登录格式1 mysql -u用户名 -p密码
mysql -uroot -proot
// 登录格式2 mysql -hip地址 -u用户名 -p密码
mysql -u127.0.0.1 -uroot -proot
// 登录格式3 mysql --host=ip地址 --user=用户名 --password=密码
mysql --host=127.0.0.1 --user=root --password=root
// exit 退出数据库

数据库的数据定义(DDL)

创建数据库

– 直接创建数据库
CREATE DATABASE 数据库名;
– 判断是否存在并创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
– 创建数据库并指定字符集(编码类型)
CREATE DATABASE 数据库名 CHARACTER SET 字符集;

CREATE DATABASE db1;
CREATE DATABASE IF NOT EXISTS db2;
CREATE DATABASE db3 CHARACTER SET gbk;

查看数据库

SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE db1;

修改数据库

– 修改数据库字符集格式
ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 字符集;

ALTER DATABASE db3 DEFAULT CHARACTER SET UTF8;

删除数据库

DROP DATABASE 数据库名;

DROP DATABASE db4;

使用数据库

– 查看正在使用的数据库
SELECT DATABASE();
– 切换数据库
USE 数据库名;

USE DB2;

创建表

CREATE TABLE 表名 (字段名1,字段类型1,字段名2,字段类型2…);

– 建议写成如下格式
CREATE TABLE 表名 (
字段名1,字段类型1,
字段名2,字段类型2,

);

CREATE TABLE student(
id int,
name varchar(10),
age int,
birthday date,
sex char(1)
);

数据库常用数据类型

类型 描述
int 整型
double 浮点型
varchar 字符串型
data 日期类型:yyyy-mm-dd

详细数据类型请点击此处查看

数据库表的数据操作(DML)

查看表
– 查看某个数据库中的所有表
SHOW TABLES;
– 查看表结构
DESC 表名;
– 查看创建表的sql语句
SHOW CREATE TABLE 表名;
快速创建一个表结构相同的表
CREATE TABLE 新表名 LIKE 旧表名;
– 创建 s1 表, 表结构和student表结构相同
CREATE TABLE s1 LIKE student;
删除表
– 直接删除表
DROP TABLE 表名;
– 判断表是否存在并删除表
DROP TABLE IF EXISTS 表名;

DROP TABLE db1;
DROP TABLE IF EXISTS db2;
修改表
– 添加表列
ALTER TABLE 表名 ADD 列名 类型;
– 修改列类型
ALTER TABLE 表名 MODIFY 列名 新的类型;
– 修改列名
ALTER TABLE 表名 CHANGE 旧列名 行列名 类型;
– 删除列
ALTER TABLE 表名 DROP 列名;
– 修改表名
RENAME TABLE 表名 TO 新表名;
– 修改字符集
ALTER TABLE 表名 character set 字符集;

数据插入

INSERT INTO 表名 - 表示往那张表添加数据
(字段名1, 字段名2, …); – 要给那些字段设置值
VALUES (值1, 值2, …); – 设置的具体的值
值与字段必须对应,个数相同,类型相同

值的数据大小必须在字段的长度范围之内

除了数组类型外,其他字段类型的值必须使用引号引起。(建议使用单引号)

如果要插入空值,可以不写字段,或者插入 null

插入全部字段

– 所有的字段名都写出来
INSERT INTO 表名 (字段名1, 字段名2, …) VALUES (值1, 值2, …);
– 不写字段名
INSERT INTO 表名 VALUES (值1, 值2, …);
插入部分数据

– 没有添加数据的字段会使用null
INSERT INTO 表名 (字段名1, 字段名3, …) VALUES (值1, 值3, …);
案例

– 创建db3数据库并使用
CREATE DATABASE db3;
USE db3;
– 创建完整学生信息表,包括学员的id,姓名,年龄,性别,家庭地址,电话号码,生日,数学成绩,英语成绩
CREATE TABLE student(
id int,
name varchar(20),
age int,
sex char(1),
address varchar(200),
phone varchar(20),
birthday date,
math double,
english double
);
– 插入一条数据 顺序可以打乱,字段名和值要对应
INSERT INTO student(id,name,sex,age,birthday,address,phone,math,english)values(1,‘zhangsan’,‘男’,‘19’,‘2010-12-11’,‘北京市’,‘18833336666’,98.5,67);
– 校验插入的数据,查看student表的所有字段数据
SELECT * FROM student;
蠕虫复制

在已有的数据基础上,将原来的数据进行复制,插入到对应的表中

– 语法格式化
INSERT INTO 表名1 SELECT * FROM 表名2;

– 创建student2表,student2结构和student表结构一样
CREATE TABLE student LIKE student2;
– 将student表中的数据添加到student2表中
INSERT INTO student SELECT * FROM student2;

– 只复制student表中name,age字段数据到student2表中使用如下格式
INSERT INTO student2(name,age) SELECT name,age FROM student;

数据约束

约束种类
PRIMARY KEY : 主键

UNIQUE : 唯一

NOT NULL : 非空

DEFAULT : 默认

FOREIGN KEY : 外键

主键约束
每个表有且只有一个主键,通常以id为主键

主键的特点:

主键必须包含唯一的值(不重复)

主键不能包含NULL值

– 创建主键
字段名 字段类型 PRIMARY KEY;
– 创建表hero1,包含字段(id,name,age)将id作为主键
CREATE TABLE hero1(
id int PRIMARY KEY,
name varchar(20),
age int
)
删除主键

– 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
– 删除hero1表的主键
ALTER TABLE hero1 DROP PRIMARY KEY;
主键自增

– AUTO_INCREMENT表示自动增长

– 创建表hero2,包含字段(id,name,age)将id作为主键并自动增长

CREATE TABLE hero2(
 id int PRIMARY KEY AUTO_INCREMENT,
    name varchar(20),
    age int
)

扩展:默认的AUTO_INCREMENT的起始值是1,下列语法可以修改起始值

AUTO_INCREMENT 表名 AUTO_INCREMENT = 起始值;
DELETE和TRUNCATE的区别 ●DELETE删除表中的数据,但不重置AUTO_ INCREMENT的值。 ●TRUNCATE摧毁表,重建表,AUTO_ _INCREMENT重置为1

唯一约束

字段名 字段类型 UNIQUE;
– 创建表hero3,包含字段(id,name)将name设为唯一约束,不能出现相同的数据

CREATE TABLE hero3(
 id int,
    name varchar(20) UNIQUE
)

非空约束

字段名 字段类型 NOT NULL;
– 创建表hero4,包含字段(id,name)将name设为非空约束,name不能为NULL

CREATE TABLE hero4(
 id int,
    name varchar(20) NOT NULL
)

默认值
– 默认值格式
字段名 字段类型 DEFAULT 默认值;
– 创建表hero5,包含字段(id,name),name默认是英雄

CREATE TABLE hero5(
 id int,
    name varchar(20) DEFAULT '英雄'
)

更新表记录

– 不带条件修改数据 全部修改
UPDATE 表名 SET 字段名=值;
– 带条件修改数据 指定范围修改
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;

– 关键字 UPDATE: 修改数据 SET: 修改哪些字段 WHERE: 指定条件

– 不带修改条件,将所有的性别改为女
UPDATE student SET sex=‘女’;
– 带条件修改数据,将id为2的学生性别修改为难
UPDATE student SET sex=‘男’ WHERE id=2;
– 一次修改多列,把id为3的学生,年龄改为26, address改为北京
UPDATE student SET age=26, address=‘北京’ WHERE id=3;

删除表记录

– 不带条件删除数据
DELETE FROM 表名;
– 带条件删除数据
DELETE FROM 表名 WHERE 字段名=值;

– 带条件删除数据,删除id为3的记录
DELETE FROM student WHERE id=3;
– 不带条件删除数据删除表中的所有数据
DELETE FROM student;
truncate 删除表记录

delete 是将表中的数据一条一条删除

truncate 是将整个表摧毁,重新创建一个新的表,新的表结构和原来的表结构一模一样

TRUNCATE TABLE 表名;

数据库表的数据查询(DQL)

–创建student表

CREATE TABLE student(
    id int,
    name varchar(20),
    age int,
    sex char(1),
    address varchar(200),
    phone varchar(20),
    birthday date,
    math doub1e,
    english doub1e

);
–为student准备数据

INSERT INTO student values(1,'闫妮',43,'女''北京市''12222222222', '2019-02-12',92.5,88);
INSERT INTO student values(2,'郭富城',21'男''上海市''1666666666', '2018-06-O6',97.5,65.5);
INSERT INTO student values(4, '张学友'34,'男''杭州市','17777777777','2013-11-17',69,65);
INSERT INTO student values(5,'成龙'51'男''哈尔滨市''15555555555', '2005-10-12',88,97);
INSERT INTO student values(6,'刘德华'57,'男''盘锦市''19999999999', '2015-11-11',74.5,92.5);
INSERT INTO student values(7,'马伊刺'42,'女''长沙市''18888888888' , '2008-03-26',86.5,71.5);
INSERT INTO student values(8,'黎明'49'男''昆明市''11111111111','2000-09-14',77.5,60);I

简单查询

– 使用*表示所有列
SELECT * FROM 表名;

SELECT * FROM student;
– 写出查询每列的名称
SELECT 字段名1,字段名2,字段名3,… FROM 表名;

SELECT id,name,age,sex,address,phone FROM 表名;
查询指定列

– 写出查询每列的名称
SELECT 字段名1,字段名2,字段名3,… FROM 表名;

SELECT id,name,age FROM 表名;
别名查询

– 查询时给列、表指定别名需要使用as关键字
– 使用别名的好处是方便观看和处理查询到的数据
SELECT 字段名1 AS 别名, 字段名2 AS 别名,… FROM 表名;

SELECT name AS 姓名, age AS 年龄 FROM student;
清除重复值

– 查询指定列 并且 结果 不出现重复数据
SELECT DISTINCT 字段名 FROM 表名;

– 查询name,age列并且 结果 不出现重复name
SELECT DISTINCT name, age FROM student;
查询结果参与运算

参与运算的必须是数值类型,查询显示新列,不会改动原数据

– 某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
– 某列数据和其他列数据参与运算
SELECT 列名1 + 列名2 FROM 表名;

SELECT math+english 总成绩 FROM student;
SELECT name 姓名,sex 性别,math 数学成绩,english 英语成绩,math+english 总成绩 FROM student;

SELECT name,age+10 FROM student;

条件查询

– 语法格式
SELECT 字段名 FROM 表名 WHERE 条件;

– 准备数据

INSERT into hero values(1'业瑟'35'男',320'战上',3000,0,1,'2017-05-14',14.2);
INSERT into hero values(2,'阿呆'19'女',470,'刺客',1500,1100,0,'2019-06-11',15.6);
INSERT into hero values(3,'老人子'75,'男'430,'战士',2500,0,1, '2016-11-18',17.7);
INSERT into hero values(4, '吕布'40'男',500,'悦士',2700,1000,1, ' 2015-04-22',12.2);
INSERT into hero values(5,'甄姬'27'女',210'法师' ,1400,1900,0,'2018-06-06',13.1);
INSERT into hero values(6'旗嫩'25,'女'370'时手',1600,1200,1,'2013-02-24',11.2);
INSERT into hero values(7,'德玛调亚'35,'男'220'战上' , 39oo,1500,1,'2011-02-14',11.2);
INSERT into hero values(8'孙尚否',24,'女'260,'时手',1300,900,0,'2020-03-12',9.2);
INSERT into hero values(9,'孙策'39'',280'战上',3200,1100,1,'2016-07-14',16.7);
INSERT into hero values(10'孙悟空'32'男',460'战上',2900,1300,o,'2013-02-11',17.2);
INSERT into hero values(11'公孙策'37'男'210,'法师',2200,700,1, '2019-09-16',11.4);
INSERT into hero values(12,'上行孙'22,'男'195, 'W客',1400,1700,1,'2013-02-16',12.4);
INSERT into hero values(13,'后蕾'39,'男',420,"射手',780,700,0,'2019-01-19' ,NULL);

比较运算符

– > 大于 < 小于 <= 小于等于 >= 大于等于 <> != 不等于
SELECT * FROM hero where 条件(字段 运算符 筛选条件);

– 查询 定位为射手的英雄
SELECT * FROM hero where location=‘射手’;

逻辑运算符

– and 多个条件同时满足
– or 多个条件其中一个满足
– not 不满足

SELECT * FROM hero where age>35 AND life>2500;
SELECT * FROM hero where age>35 OR max_score<1;
SELECT * FROM hero where id=1 OR if=4 OR id=5;

– in 关键字 in里面的每个数据都会作为一次条件
SELECT * FROM hero where id in (1,4,5);
范围

– BETWEEN 值1 AND 值2 表示从值1到值2的范围,包头包尾

SELECT * FROM hero WHERE grounding_data BETWEEN '2013-01-01' AND '2017-01-01';
SELECT * FROM hero WHERE grounding_data >= '2013-01-01' AND grounding_data <= '2017-01-01';

模糊查询

LIKE 表示模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE ‘通配符字符串’;
– MySQL 通配符有两个 %: 表示0个或多个字符 _: 表示一个字符

– 查询姓孙的英雄
SELECT * FROM hero WHERE name LIKE ‘孙%’;
– 查询名字中含有孙字的英雄
SELECT * FROM hero WHERE name LIKE ‘%孙%’;
– 查询姓孙,且姓名是三个字的英雄
SELECT * FROM hero WHERE name LIKE ‘孙__’;

排序查询

– ORDER BY 子句 可以将查询的结果进行排序 (排序只是显示方式, 不会改变数据库中数据的顺序)
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
– ASC 升序,默认的 DESC 降序

– 单列排序 使用一个字段进行排序
– 查询年龄小于35的英雄,按照年龄升序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC;

– 组合排序 先使用第一个字段进行排序 如果第一个字段相同,才使用第二个字段进行排序。以此类推
SELECT 字段名 FROM FROM 表名 WHERE字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
– 查询年龄小于35岁的英雄 按照年龄升序 如果年龄相同 按照生命值降序排列
SELECT * FROM hero WHERE age<=35 ORDER BY age ASC,lifr desc;

聚合函数

之前的查询都是横向查询,根据条件一行一行的进行判断,而聚合函数查询是纵向查询,对一列的值进行计算,返回结果值。聚合函数会忽略空值

count: 统计指定列的记录数(行数),值为NULL的不统计

sum: 计算指定列的数值和,如果不是数值,计算结果为0

max: 计算指定列的最大值

min: 计算指定列的最小值

avg: 计算指定列的平均值,如果不是数值,计算结果为0

– 聚合函数写在sql语句SELECT 后 字段名的地方
SELECT 字段名… FROM 表名;
SELECT COUNT(age) FROM 表名;
– 查询英雄的总数
SELECT COUTN(max_SCORE) FROM hero;

– 对于NULL的记录不统计,只要只用全部字段为衡量标准就不会有遗漏的错误统计出现
SELECT COUNT(*) FROM hero;
分组查询

– 分组查询是使用 GROUP BY语句对查询信息进行分组 [HAVING 条件] 分组后的筛选
SELECT 字段1,字段2… FROM 表名 GROUP BY 分组字段 [HAVING 条件];

SELECT * FROM hero FROUP BY sex;
– 这就sql语句会将sex相同的数据作为一组,但是会返回每组的第一条,没有任何意义

– 分组的目的就是为了统计,一般分组会和聚合函数一起使用
– 分组后聚合函数 不操作所有数据,而是操作一组数据

SELECT SUM(life) FROM hero GROUP BY sex; – 返回两组的生命值之和
– 当使用摸个字段分组时,需要将这个字段查询出来,否则看不到数据是属于哪组的
SELECT SUM(life),sex FROM hero GROUP BY sex;

– 查询年龄小于30的,按性别进行分组,统计每组的人数
– 1.先过滤年龄小于30的 2.分组 3.最后统计人数
SELECT sex,COUNT(*) FROM hero WHERE age<30 GROUP BY sex;

– 查询年龄大于25的 按性别分组,统计每组人数, 并只显示性别人数大于2的数据
– 错误
SELECT sex,conut() FROM hero WHERE age<30 GROUP BY sex WHERE COUNT()>2;
– 正确
SELECT sex,conut() FROM hero WHERE age<30 GROUP BY sex HAVING COUNT()>2;
limit语句 分页

limit语句是限制的意思,限制查询记录的条数。limit语句要放在最后面

– LIMIT语法格式
LIMIT offset,length; LIMIT length;
– offset是指偏移量,调过的记录数量,默认为0 length是指需要显示的总记录数

– 查询hero表,从第三条开始显示,显示6条
SELECT * FROM hero LIMIT 2,6;

数据库的权限控制(DCL)

要撤回权限,需要以 root 身份进行,在权限列表删除这个用户,或者在命令行通过 REVOKE 语句完成:

revoke all privideges on test.* from ‘test’@’%’;

flush privileges;

这里操作的都是所有权限,也可以指定特定的权限:

授予权限

grant select on test.* to 'user1'@'localhost'; /*给予查询权限*/ grant insert on test.* to 'user1'@'localhost'; /*添加插入权限*/ grant delete on test.* to 'user1'@'localhost'; /*添加删除权限*/ grant update on test.* to 'user1'@'localhost'; /*添加权限*/

收回权限

revoke select on test.* from 'jack'@'localhost'; revoke insert on test.* from 'jack'@'localhost'; revoke delete on test.* from 'jack'@'localhost'; revoke update on test.* from 'jack'@'localhost';

事务提交/回滚

数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一系列操作(对数据库的相关增删改查的操作,包含一条或多条 SQL 语句),要么完全地执行,要么完全地不执行。

对于单条 SQL 语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。

要手动把多条 SQL 语句作为一个事务执行,可以使用 BEGIN 开启一个事务,使用 COMMIT 提交一个事务,这种事务被称为显式事务,如果事务执行过程中出现错误或异常,可以通过 ROLLBACK 语句回滚事务。

BEGININSERT INTO post (`title`, `content, `created_at`) VALUES ('测试', '测试内容哈哈哈', '2020-05-26 13:00:00');

INSERT INTO post (`title`, `content, `created_at`) VALUES ('测试2', '测试内容嘿嘿嘿', '2020-05-26 13:30:00');

ROLLBACK;
COMMIT;
全部评论

相关推荐

ps:最寄的一集
投递拼多多等公司10个岗位 >
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务