MySQL数据库总结

Posted Zeker62

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据库总结相关的知识,希望对你有一定的参考价值。

DDL操作数据库、表

操作数据库

查看数据库

show databases;

查询创建数据库mysql的字符集

show create database mysql;

创建数据库

create database db1; -- 创建db1数据库

show create database db1; -- 查看db1数据库的字符集

create database if not exists db2 -- 如果不存在就创建db2,判断操作

create database db3 character set gbk; -- 将字符集设置成gbk编码
show create database db3

create database if not exists db4 character set gbk; -- db4不存在的情况下,创建数据库db4,同时设置编码为gbk

修改数据库

alter database db3 character set utf8; -- 不能写成utf-8

删除数据库

drop database db3;

drop database if exists db4;

使用数据库

select database(); -- 查询当前正在使用的数据库名称

use db1; -- 使用数据库db1

操作表

查询表(use、show)

use db1;

show tables; -- 显示当前数据库的所有表的名称

desc db1; -- 查询当前表的结构

数据类型

  • int 整数类型
  • double(a,b) 浮点数类型,浮点数长a,小数点保留到b为
  • date 日期类型,只包含年月日 yyyy-MM-dd
  • datetime 日期类型,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
  • timestamp 时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss。如果不给这个字段赋值,或为null,那么默认使用当前系统的时间
  • varchar(a) 字符串类型,最大为a个字符长度
  • 详细内容:菜鸟教程-Mysql数据类型

创建表(create)

create table student(
	id int,
	name varchar(32),
	age int,
	score double(4,1), -- 100.0
    birthday date,
    insert_time timestamp
);

复制表(like)

create table stu like student; -- 复制student表

删除数据表(drop table)

drop table stu;

drop table if exists stu;

修改表(alter)

alter table student rename to stu; -- 将student表重命名

show create table stu;
alter table stu character set utf8; -- 修改表的字符集

alter table stu add gender varchar(10); -- 添加名为gender的列

alter table stu change gender sex varchar(20); -- 修改名为gender的列名为sex,并修改数据类型
alter table stu modify sex varchar(10); -- 只改类型,不改名称

alter table stu drop sex; -- 删除表中的sex列

DML 增删改表中数据

添加数据(insert)

insert into stu(id,name,age) values(1,'张无忌',18); -- 将数据插入到表当中

INSERT INTO stu VALUES(1,'Tom',17,99.5,NULL,NULL); -- 省略列名的添加方式

INSERT INTO stu VALUES(3,'Bob',19,88.5,"1993-11-11",NULL); -- 除了数字类型,其他类型都需要用单引号或者双引号引用起来。

删除数据(delete、truncate)

DELETE FROM stu WHERE id=3; -- 删除列名为id,值为3的一行记录

DELETE FROM stu; -- 删除stu表中所有的数据,数据量大的时候开销大,有多少条记录就会执行多少次删除操作。

TRUNCATE TABLE stu; -- 直接删除stu表,然后再创建一个不含数据但结构一样的stu表,数据量大的时候开销小

修改数据(update)

UPDATE stu SET age=22 WHERE id=2; -- 修改id=2的那一行的age属性值

UPDATE stu SET age=18 ,score=100 WHERE id=3; -- 同时修改两个数据

UPDATE stu SET age=20; -- 不加限制条件,则会修改age字段的所有数据都为20

DQL查询表中的记录

基础查询(select、DISTINCT、IFNULL()函数)

select * from stu;

SELECT NAME,age FROM stu; --两列

SELECT DISTINCT age FROM stu; -- distinct 去除重复的结果集

SELECT NAME,math,english,math+english FROM stu; -- 两列数值可以直接相加,如有null参加运算,计算结果都为null

SELECT NAME,IFNULL(math,0),IFNULL(english,0),math+english FROM stu; -- 可以用ifnull 这个函数来进行null值判断,如果为null,那么这个数据就会当成0来计算

SELECT NAME,IFNULL(math,0) AS 数学,IFNULL(english,0) AS 英语,math+english AS 总分 FROM stu; -- 使用as 进行起别名

条件查询(> < = ! & |、between and、or、and、in)

-- 比较运算符
SELECT * FROM stu WHERE math>80;
SELECT * FROM stu WHERE math=80;
SELECT * FROM stu WHERE math>=80;
SELECT * FROM stu WHERE math!=80;
SELECT * FROM stu WHERE math<>80; -- 不等号

-- 逻辑运算符
SELECT * FROM stu WHERE math<=80 && math>90; -- 不推荐
SELECT * FROM stu WHERE math<=80 and math>90;
SELECT * FROM stu WHERE math BETWEEN 80 AND 90; -- 在80和90之间,包括80和90

SELECT * FROM stu WHERE math=80 || math=90;-- 不推荐
SELECT * FROM stu WHERE math=80 OR math=90 OR math=100; -- 或者条件
SELECT * FROM stu WHERE math IN (80,90,100); -- 或者条件的简写

对null操作(is null、is not null)

-- 对null操作
SELECT * FROM stu WHERE birthday=NULL; -- 不正确,null不能使用比较运算符判断,应该用is
SELECT * FROM stu WHERE birthday IS NULL;
SELECT * FROM stu WHERE birthday IS NOT NULL;

模糊查询(%、_)

SELECT * FROM stu WHERE NAME LIKE '张%'; -- 查询名字第一个字是张
SELECT * FROM stu WHERE NAME LIKE "_无%"; -- 查询名字第二字是无的人
SELECT * FROM stu WHERE NAME LIKE "___"; -- 查询名字是三个字的人
SELECT * FROM stu WHERE NAME LIKE "%无忌%"; -- 查询名字包含无忌的人

排序查询(order by ASC\\DESC)

SELECT * FROM stu ORDER BY math; -- 默认升序 asc
SELECT * FROM stu ORDER BY math ASC;
SELECT * FROM stu ORDER BY math DESC; -- 降序

SELECT * FROM stu ORDER BY math ASC ,english ASC;-- 按照数学成绩排名,数学成绩一样,就按照英语成绩排序,都是升序。当第一个条件值排序一样的时候,才会去判断第二个条件

聚合函数(count()、max()、min()、sum()、avg())

-- 将一列数据作为一个整体,做纵向计算

SELECT COUNT(NAME) FROM stu; -- 计算name列中的属性个数
-- 注意:聚合函数会排除null值,解决方法:
SELECT COUNT(*) FROM stu;  -- 使用*计算
SELECT COUNT(id) FROM stu; -- 使用不为空的主键
SELECT COUNT(IFNULL(birthday,0)) FROM stu; -- 把null值替换成0

select max(math),min(math),avg(math) from stu; -- 计算数学成绩的最大值,最小值,以及平均成绩
SELECT SUM(math) FROM stu; -- 计算数学总成绩
SELECT SUM(math,english) FROM stu; -- 报错,不能两个列进行操作

分组查询(group by … having…)

SELECT age,AVG(math) FROM stu GROUP BY age; -- 不同年龄的数学平均分
SELECT age,COUNT(id) FROM stu GROUP BY age; -- 查询不同年龄的人数分别有多少
SELECT age,AVG(math),COUNT(id) FROM stu GROUP BY age;

SELECT age,AVG(math) FROM stu  WHERE math<90 GROUP BY age ; -- 查询成绩低于90分的不同年龄段的平均成绩
SELECT age,AVG(math) FROM stu  GROUP BY age HAVING age>18 ; -- 分组之后,年龄要大于18
  • where 和 having的区别
    • 位置不同,where 在分组之前限定,如果不满足结果,则不参与分组。having在分组之后确定,如果不满足结果则不显示出来
    • where后面不能跟聚合函数,having后面可以跟聚合函数

分页查询(limit)

SELECT * FROM stu LIMIT 0,2; -- 从0开始查,查三条记录
SELECT * FROM stu LIMIT 2,2; -- 从第3条开始,查两条
-- 【开始的索引】=【当前的页码-1】*【每页显示的条数】
-- 最后一页有多少条显示多少条,不会报错

limit操作是一个MySQL方言,只能在MySQL数据库中用

约束

约束就是对表中数据进行限定,保证数据的正确性,有效性和完整性

分类:

  • 主键约束
  • 非空约束
  • 唯一约束
  • 外键约束

非空约束(not null)

某一列的值不能为空

-- 创建表添加非空约束
create table stu(
	id int,
	name varchar(20) not null -- name为非空
);
ALTER TABLE stu MODIFY NAME VARCHAR(20); -- 取消(删除)非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL; -- 额外添加非空约束

唯一约束(unique)

某一列的值不能重复

CREATE TABLE stu(
	id INT,
	phone_number VARCHAR(20) UNIQUE -- 唯一约束
	-- 手机号不能重复
);

唯一约束可以有null值,但是只有一条记录可以有null

-- 删除唯一约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20); -- 不能删除

ALTER TABLE stu DROP INDEX phone_number; -- 正确删除
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE; -- 添加唯一约束,如果此时数据不满足列的unique,就会报错

主键(primary key)

非空且唯一,一张表只能有一个字段为主键

CREATE TABLE stu(
	id INT PRIMARY KEY, -- 主键
	NAME VARCHAR(20)
);
-- 删除主键
ALTER TABLE stu MODIFY id INT;  -- 不起作用

ALTER TABLE stu DROP PRIMARY KEY; -- 正确删除

自动增长(auto_increment)

-- 自动增长,必须是数字类型
CREATE TABLE  stu(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加自动增长主键约束
	NAME VARCHAR(20)
);

INSERT INTO stu VALUES(NULL,'sss'); -- 此时会读取上一条id的值,并将此时的id为上一个id+1

-- 删除自动增长
ALTER TABLE stu MODIFY id INT; -- 主键并不会被删除
-- 添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

外键约束(FOREIGN KEY … REFERENCES …)

看一段数据:

CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);
SHOW TABLES;
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('张三',18,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('李四',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('王五',21,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('宋白',18,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('张成',24,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('孙七',23,'销售部','深圳');
    id  name       age  dep_name   dep_location  
------  ------  ------  ---------  --------------
     1  张三          20  研发部        广州        
     2  李四          20  研发部        广州        
     3  王五          21  研发部        广州        
     4  宋白          18  销售部        深圳        
     5  张成          24  销售部        深圳        
     6  孙七          23  销售部        深圳       

数据存在冗余,销售部一定在深圳,研发部一定在广州

解决方案,分成两张表,一张写员工,一张写部门

-- 部门表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
);
-- 员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT
);
SHOW TABLES;
DESC employee;
DESC department;


-- 添加两个部门
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');

INSERT INTO employee(NAME,age,dep_id) VALUE('张三',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('李四',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('王五',21,1);
INSERT INTO employee(NAME,age,dep_id) VALUE('宋白',18,2);
INSERT INTO employee(NAME,age,dep_id) VALUE('张成',24,2);
INSERT INTO employee(NAME,age,dep_id) VALUE('孙七',23,2);
SELECT * FROM employee;
SELECT * FROM department;

    id  name       age  dep_id  
------  ------  ------  --------
     1  张三          20         1
     2  李四          20         1
     3  王五          21         1
     4  宋白          18         2
     5  张成          24         2
     6  孙七          23         2
     
    id  dep_name   dep_location  
------  ---------  --------------
     1  研发部        广州        
     2  销售部        深圳        

带来问题,两个表不能关联,需要添加外键

-- 部门表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
);
-- 员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT,
	CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) -- 外键,dep_id和department表中的id关联了
);

-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

-- 添加外键
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id);

修改数据库引擎(ENGINE=INNODB)

如果外键不起作用,数据库表的默认引擎为MyISAM,这个引擎不支持外键,需要换成innoDB即可。

解决方法:

  1. 修改表的引擎
SHOW TABLE STATUS LIKE 'employee'; -- 查看数据表引擎

ALTER TABLE employee ENGINE=INNODB;
  1. 新建表时直接给值
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(20)
)ENGINE = INNODB; -- 修改引擎
-- 员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT,
	CONSTRAINT dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) -- 外键,dep_id和department表中的id关联了
)ENGINE = INNODB; -- 修改引擎

级联操作(ON UPDATE CASCADE)

外键的约束要更改相应的值就特别麻烦。

级联操作可以做到只要更改一处,相关联的就会接着更改

-- 添加外键,设置级联更新
ALTER TABLE employee ADD CONSTRAINT<

以上是关于MySQL数据库总结的主要内容,如果未能解决你的问题,请参考以下文章

python常用代码片段总结

BootStrap有用代码片段(持续总结)

BootStrap实用代码片段(持续总结)

回归 | js实用代码片段的封装与总结(持续更新中...)

Python学习总结

查看发票组代码后的总结和有感