从字面意思看,数据库就是一个存储数据的仓库。从计算机的角度来说,数据库(Datebase)是按照数据结构来组织、存储和管理数据的仓库。html
简单来讲,能够将数据库视为电子化的一个文件柜。用户能够对文件中的数据进行新增、更新和删除等操做。mysql
数据库中的一些常见术语:redis
管理关系型数据库的计算机软件就是关系数据库管理系统。经常使用的关系数据库管理软件有Oracle、MySQL、SQL Server等。sql
这里以MySQL的学习为主。数据库
所谓关系型数据库,是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各类实体以及实体之间的各类联系均用关系模型来表示。简单说:关系型数据库是由多张能互相联接的二维行列表格组成的数据库。编程
基于关系型数据库的管理系统,咱们称之为关系数据库管理系统(RDBMS)。安全
RDBMS的特色:微信
RDBMS中的一些常见术语:数据结构
数据库:相似于上图中学生表同样的不少个表的集合。数据库设计
冗余:存储两倍的数据,冗余下降了性能,但提升的数据的安全性。
主键:惟一标识数据表的一列或多列的组合。
外键:关联其余表的列。
索引:用于提升访问数据库表中特定信息的速度。索引是对数据库表中一列或多列的值进行排序的一种结构。可类比于书籍中的目录,可提升咱们查询的效率。
实体 - 联系模型,就是 E-R 模型。它给咱们提供了一种不受任何 DBMS 约束的面向用户的表达方法。在数据库设计中被普遍用做数据建模的工具。
E-R 模型的构成成分是实体集、属性和联系集。经过 E-R 模型,咱们能获得一个较为清晰的关于整个数据结构的关系图,由于 E-R 模型也称为 E-R 图。
E-R 模型的表示方法:
简单 E-R 图示例:
SQL,全称是 Structured Query Language,即结构化查询语言,它是一种特殊的编程语言,专用于对数据库进行操做而设计的,用于对数据库进行增、删、改、查等操做。
MySQL是当前最流行的关系型数据库管理系统之一。
mac下安装软件通常有两种方式,一是在官网上下载安装包,像安装普通软件同样进行安装;另外一种则是使用 mac 上的包管理器 homebrew 来进行安装。
两种安装方式可参考:
https://www.jianshu.com/p/fd3aae701db9
安装完后输入:mysql -u root -p,回车后输入密码便可登陆 MySQL 命令行界面。
MySQL 中常见数据类型以下表所示:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1字节 | (-128, 127) | (0, 255) | 小整数值 |
INT | 4字节 | (-2^31, 2^31-1) | (0, 2^32-1) | 较大整数值 |
BIGINT | 8字节 | (-2^65, 2^65-1) | (0, 2^64-1) | 大整数值 |
FLOAT | 4字节 | 浮点数 | ||
DOUBLE | 8字节 | 浮点数 | ||
DATE | 3字节 | YYYY-MM-DD | ||
TIME | 3字节 | HH:MM:SS | ||
VARCHAR | 0-65535字节 | 可变长度字符串 | ||
ENUM | 枚举类型 |
详细可参考:
http://www.runoob.com/mysql/mysql-data-types.html
MySQL中的SQL语句是不区分大小写的,推荐 SQL 关键字使用大写。
这里以在一个 test 数据库中建立一个学生表为例。学生有学号、姓名、性别、年龄四个属性。
-- 语法:CREATE DATABSE database_name; CREATE DATABASE test;
SHOW DATABASE;
-- 语法:USE database_name; USE test;
-- 第一种方式 SELECT DATABASE(); -- 第二种方式,在命令行模式下输入 status; -- 会显示当前 MySQL 的一些基本状况,包括链接信息等 -- 其中有一项是 Current database 表示当前数据库
-- 语法:CREATE TABLE table_name (col_name1 col_type1, ... col_namen col_typen ) -- ENGINE(引擎)=InnoDB DEFAULT CHARSET=utf8 可省略 -- 在建立数据表时,最好指定表的编码 CREATE TABLE student ( -- INT UNSIGNED 表示无符号整数,即只有正整数和0 -- AUTO_INCREMENT 表示自动增加,即咱们在插入数据时不用指定这个属性的值,指定了也没用 -- PRIMARY KEY 指定主键 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), gender ENUM('男', '女', '保密'), age INT ); INSERT INTO test(id, k, v) VALUES(1, 'a', '0'), (1, 'b', 'x'), (1, 'c', '9'), (1, 'ab', 'c'), (1, 'set', 'aweg');
-- 语法:SHOW CREATE TABLE table_name; -- 会显示表的建立语句 SHOW CREATE TABLE student; -- 语法:DESC table_name; -- 会以表格的形式展现表中的字段及字段的类型等信息 DESC student;
-- ALTER TABLE tabel_name operation[ADD, MODIFY, CHANGE, DROP, CHARACTER SET] -- 给学生表添加列 班级号 - ADD -- 语法:ALTER TABLE table_name ADD new_col_name type; ALTER TABLE student ADD class_id int; -- 修改学生表中学生名字字段的类型,并添加约束不能为空 - MODIFY -- 语法:ALTER TABLE table_name MODIFY col_name new type or new retriction; ALTER TABLE student MODIFY name VARCHAR(50) NOT NULL; -- 修改学生表中的表名,将 class_id 改成 cls_id - CHANGE -- 语法:ALTER TABLE table_name change old_col_name new_col_name new_col_type; ALTER TABLE student CHANGE class_id cls_id INT UNSIGNED; -- 删除学生中的班级号 cls_id 列 -- 语法:ALTER TABLE table_name DROP col_name; ALTER TABLE student DROP cls_id; -- 修改表的字符集 -- 语法:ALTER TABLE table_name CHARACTER SET new_character; ALTER TABLE student CHARACTER SET gbk;
-- 语法:INSERT INTO table_name (field1, field2,...fieldn) VALUES (v1, v2,...vn), (vv1, vv2,...,vvn); INSERT INTO student(name, gender, age) VALUES('Demon', '男', 18), ('Semon', '女', 18) ,('haha', '男', 16), ('hehe', '男', 17), ('aaa', '女', 26);
-- SELECT v1, v2... FROM table_name WHERE conditions; -- * 表示查询全部字段,通常建议写出查询的字段名称,这样更加容易阅读 SELECT * FROM student; -- 查询性别为男的学生 SELECT * FROM student WHERE gender = '男'; -- 查询语句是 SQL 语句中最复杂的,咱们通常在编写 SQL 语句时都是写的查询语句
-- 使用 LIKE 关键字能够对字符串进行模糊查询 -- LIKE '_XXX'; 其中下划线 _ 占位,表示任意一个字符 -- 查询学生表中以任意一个字符开头,可是以 'emon' 结尾的学生信息 SELECT * FROM student WHERE name LIKE '_semon'; -- LIKE '%XXX'; 其中 % 表示任意一串字符,% 是与 LIKE 关键字最经常使用的组合 -- 查询学生表中姓名包含 'mo' 的学生信息 SELECT * FROM student WHERE name LIKE '%mo%';
-- 大于(>),小于(<),大于等于(>=),不等于(!=)或(<>) -- 使用 AND 表示与 -- 查询学生表中性别为男而且年龄大于18的学生信息 SELECT * FROM student WHERE gender = '男' AND age > 18; -- 使用 OR 表示或 -- 查询学生表中性别为女或者年龄不等于17的学生信息 SELECT * FROM student WHERE gender = '女' OR age <> 17; SELECT * FROM student WHERE gender = '女' OR age != 17;
-- UPDATE table_name SET f1 = v1, f2 = v2... WHERE conditions; -- 将性别为男的学生的年龄修改成20 UPDATE student SET age = 20 WHERE gender = '男';
-- 语法:SELECT f1,f2.. FROM table_name WHERE condifitons ORDER BY f1,f2.. [ASC [DESC]] -- ASC 表示升序,DESC 表示降序,默认是 ASC,可省略。 -- 将学生数据信息按照年龄升序排序 SELECT * FROM student ORDER BY age [ASC]; -- 降序 SELECT * FROM student ORDER BY age DESC;
-- 语法:DELETE FROM table_name WHERE conditions; -- 删除性别为男的学生 DELETE FROM student WHERE gender = '男';
RENAME TABLE old_table_name TO new_table_name;
DROP TABLE table_name;
-- 在已经登陆 MySQL 后: DROP DATABASE database_name; -- 若是没登陆前: mysqladmin -u root -p drop database_name; -- 回车后输入密码
使用聚合函数的基础就是使用分组语句,使用语法以下:
-- 语法 SELECT f1,f2.. , function(fn) FROM ... WHERE ... GROUP BY f1,f2... -- 注意 SELECT 后的属性要和 GROUP BY 中的一致,只能比后面的少,不能超过,不然会报错 -- 查询学生信息中有哪些年龄段的学生 SELECT age FROM student GROUP BY age;
常见的聚合函数以下几种:
-- 在 GROUP BY 语句中,SELECT 后能够接受 function(fn) -- 这里的 function 就是聚合函数 -- function 后接受的属性能够是任意属性 -- 求不一样性别学生年龄的平均值 SELECT gender, AVG(age) FROM student GROUP BY gender;
-- 求不一样性别学生的总人数 SELECT gender, count(*) FROM student GROUP BY gender;
-- 求不一样性别下最大的年龄 SELECT MAX(age),gender FROM student GROUP BY gender;
-- 求不一样性别下的年龄总和 SELECT SUM(age), gender FROM student GROUP BY gender;
准备数据,上面已经创建了一个学生表,学生应该隶属于一个班级,咱们再创建一个班级表 class ,班级表的字段有班级编号、班级名称。
-- 建立班级数据库表 CREATE TABLE class (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20)); -- 插入数据 INSERT INTO class(name) VALUES ('班级一'), ('班级三'), ('班级二'), ('班级四'); -- 设置外键 ALTER TABLE student ADD CONSTRAINT FK_ID FOREIGN KEY(class_id) REFERENCES class(id); -- 清空学生表的数据,并从新插入测试数据 DELETE FROM student; INSERT INTO student(name, gender, age, class_id) VALUES('Demon', '男', 18, 1), ('Semon', '女', 18, 1) ,('haha', '男', 16, 2), ('hehe', '男', 17, 3), ('aaa', '女', 26, 3); INSERT INTO student(name, gender, age) VALUES('eee', '男', 18);
-- 内联的意思是 A 与 B 关联,A 与 B 都有的数据 -- 语法:SELECT ... FROM A INNER JOIN B ON conditions WHERE conditions; -- INNER 能够省略 -- 查询学生分别在哪些班级 -- AS 表示别名 SELECT s.id AS '学号', s.name AS '学生姓名', c.name AS '班级名称' FROM student AS s JOIN class AS c ON s.class_id = c.id;
-- 左关联的意思是 A 与 B 关联,则以 A 中的数据为主,A的数据会显示完整 -- 右关联的意思是 A 与 B 关联,则以 B 中的数据为主,B的数据会显示完整 -- 查询班级的分配状况,这样不管班级有没有安排学生,都须要显示 SELECT c.id AS '班级编号', c.name AS '班级名称', s.name AS '学生姓名' FROM class AS c LEFT JOIN student AS s ON c.id = s.class_id; SELECT c.id AS '班级编号', c.name AS '班级名称', s.name AS '学生姓名' FROM student AS s RIGHT JOIN class AS c ON c.id = s.class_id;
子查询的概念就是查询嵌套,简单说就是 SELECT 后或者 WHERE 条件后依然嵌套有 SELECT 语句。其实也很好理解,由于 FROM 关键字后面接受的是一个表,而一个表其实就是一个数据集,而咱们使用 SELECT 语句查询获得就是一个数据集。因此咱们只须要简单地将子查询里的 SELECT 语句单独当作一个数据表就能简化整个查询语句了。
-- 一个简单的例子 -- 查询年龄最大的那个学生的姓名 /* 由于使用 MAX() 函数以后,不能再查询其余的字段,和分组的状况同样 因此咱们须要分两步来实现: 1. 先查询出最大的学生年龄 2. 而后在查询条件里加上年龄等于查询出的最大年龄 */ -- 查询出最大的学生年龄 SELECT MAX(age) FROM student; -- 查询年龄等于最大年龄的学生姓名 SELECT name FROM student WHERE age = (SELECT MAX(age) FROM student);
后面会继续更新 MySQL 高级,包括函数、视图、存储过程等。还有 Python 与 MySQL 的交互。MongoDB与redis等。 若有问题,可加小编微信 Demon-5203