当你登陆你的QQ帐号和别人吹水的时候,当你期末交做业去度娘复制的时候,当你在工做中登陆一些网站的时候,再好比当你查看本身几乎没有什么余额的银行卡的时候(捂脸),或许本身也没注意,(非须要,大部分人也不想注意哈哈哈)咱们一直都在以某种方式与数据库打交道,或许你是一个开发人员,也或许你也只是一个普通的用户,数据库与咱们的生活息息相关,做为一名程序员,如今学习 MySQL 和 Oracle 的会多一些,像微软的 SQL Server 之前配合 asp 的时候用的仍是挺多的,不过如今就没那么流行了,mysql
因此咱们先从 MySQL 讲起,同时文章中穿插一些 SQL 的基本概念,我以为能更好的理解这几种 SQL 型数据库哈程序员
关于 MySQL 的几篇文章,在前一年左右大概更新过几篇,可是都差强人意,因此最近加班加点,从新将 MySQL 相关的,例如语法、约束、事务等等从新整理一遍,第一篇先来看一下入门的一些语法和操做sql
既然你都打开这篇文章了,那你就注定不是一个村民,这一局咱们跳 Java 程序员!数据库
开发学习中,想知足一些需求,与数据打交道这可太频繁了,如何存储这些数据就是你考虑的问题了,固然不考虑性能,管理、安全等等,你的选择可就多了,存个 txt,存个xml,甚至还能够存个excel等等,有位刚入门朋友曾经问过我这样一个问题 “他在学习IO的一些技术的时候,经常会简单的保存一些数据到 .txt 文件中,为何还须要数据库呢?”,这样的一些小Demo,你们在Java基础的学习中应该都是作过的,那么咱们下面就从这个问题讲起~安全
假定咱们将数据所有存储在一个普通文件中(data.txt)_(以逗号间隔)bash
......
"Eminem",male,1972,"USA"
"Rihanna",female,1988,"Barbados"
"Taylor Swift",1989,female,"USA"
"Aavril Lavigne",1984,female,"Canada"
......
复制代码
若是在咱们的数据极为庞大的状况下,咱们须要查询其中的一些数据,例如,查询Eminem的国籍,咱们通常会使用遍历,可是毫无疑问,这个响应时间会变得极其缓慢,可是使用数据库后,它所提供的一些索引技术等就能够解决这样的问题微信
"Rihanna",female,1988,"Barbados"
"Rihanna",female,1995,"USA"
复制代码
若是数据中出现了重名的状况,又如何判断是否是同一我的呢?并发
若是data.txt文件中的数据被错误的修改,例如出生年份被修改成其余类型字符串这种无效表达怎么办?函数
或许你能够在程序中写一些逻辑判断语句进而筛选处理这些问题,可是仍旧在数据较为庞大的状况下,会出现各类各样的问题,增长了开发者的开发难度,而数据库自己就制定了一些约束,从而保证了数据的完整且,有效,从而使开发者只须要更加注重于程序自己的设计,而不用花费过多的时间去处理数据上的一些细节问题工具
经常使用来简单存储数据的 txt/excel 等均属于单一文件,而且都是没法共享的,只支持当前用户使用而且修改
而数据库则容许用户共享,不一样的用户能够同时存取数据库中的数据,用户也能够用各类方式经过接口使用数据库,并提供数据共享
在咱们前者中,数据的修改是很随意的 可是在实际开发中,咱们有时候须要面临,多个用户检索、修改同一文件中的数据,或者在并发状况下,写同一文件或者记录,而数据库基于锁等的一些技术即可以帮助咱们解决这些问题
因为逻辑或者物理上的错误,致使了系统的错误操做,从而使得数据被破坏,如何快速恢复数据,咱们上面的单一文件系统显然没法帮助咱们解决问题,而数据库却有相关机制去弥补、处理相关问题
上面咱们仅仅从几个常见的点分析了为何使用数据库,固然远远不止这些,因此总的来讲就是数据库其特殊的存储以及管理方式,既提升了效率,也极大的减小了开发人员的负担
总结一下:数据库 em... 是个好东西!
至于安装的部分,这里就不说起了,不然篇幅会过于的长,不管是选择安装版本也好,免安装的压缩包也好,选对版本,装好就好了,能够去网上参考一些教程,至于版本 5.5 -> 5.6 -> 5.7 -> 8 都是能够的,毕竟只是单纯的学习 MySQL,不用过多的考虑和 Java 等的版本或者配置问题,我这台机器版本为 5.7 哈
同时今天演示的全部内容,直接在 cmd 命令行中执行也能够,直接使用一些图形化工具,例如 Navicat、SQLyog 等等都是能够的,图形化工具看数据会更舒服一些,可是即便图形化工具中,入门的学习,我仍是极其不推荐直接点击按钮,执行建立插入等等操做,过于依赖图形界面,会让你的惰性变得更加的大,对在高级语言中本身写 SQL 也是百害无一利,必定要本身书写,执行,才能更好的理解与学习哈
首先登陆以前须要启动,相关的 MySQL 服务,有两种方式
一、经过服务窗口设置
二、经过命令启动
net start mysql : 启动mysql的服务
net stop mysql : 关闭mysql服务
一、安装版 点击 MySQL 5.7 Command Line Client 后输入密码便可(安装后就有,能够看任务栏)
二、经过命令行
三、命令行示例:
① mysql -u用户名 -p密码
② mysql -u用户名 -p
③ mysql -h 地址 -P 端口 -u用户名 -p
举例:用户名:root,密码:root99
mysql -h 192.168.3.144 -P 3306 -uroot -p
一、 exit
二、quit
Structured Query Language:结构化查询语言
SQL就是访问和处理关系数据库的计算机标准语言,它定义了操做全部关系型数据库的规则
虽然 SQL 的语法标准不少部分能够直接在其余 DBMS 上使用,不过大部分数据库在SQL的标准上进行了扩展。而每一种数据库操做的方式存在不同的地方,称为**“方言”**
但凡涉及到关系型数据库就离不开SQL,例如在电商网站中存入商品信息,游戏中存储装备道具信息等
常见的关系型数据库:MySQL 、Oracle、Microsoft SQL Server、Microsoft Access、DB二、
商用:Oracle、DB二、Microsoft SQL Server
开源:MySQL
桌面:Microsoft Access
常见的非关系型数据库:Cloudant、MongoDb、Redis、HBase
总之:SQL 是一种强力的语言,咱们能够经过必定简洁的语法,实现各类复杂的需求
一、SQL语句 单行或多行书写,以分号结尾,而且可使用空格和缩进来加强语句的可读性
二、MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写
三、三种注释
-- 注释内容
# 注释内容 (这是MySQL独有的)
复制代码
/* 注释内容 */
复制代码
分类 | 做用 |
---|---|
数据定义语言——DDL(Data Definition Language) | 容许用户定义 (建立) 数据库对象:数据库,表,列等 |
数据操做语言——DML(Data Manipulation Language) | 容许用户对数据库中表的数据进行增删改 |
数据查询语言——DQL(Data Query Language) | 容许用户查询数据库中表的记录(数据) |
数据控制语言——DCL(Data Control Language) | 用来定义数据库的访问权限和安全级别,及建立用户 |
其实这部分语法的介绍,围绕的就是 CURD
这一部分例如建立、查询、使用数据库是比较经常使用的,可是对于数据库的操做并不会很频繁,通常初期设置好后,不多会去修改数据库,因此这一部分,快速了解就行了,标题中标 ※ 符号的要会用
一、建立数据库
CREATE DATABASE 数据库名称;
复制代码
举例:
mysql> CREATE DATABASE mysql_grammar_test;
Query OK, 1 row affected (0.12 sec)
复制代码
二、建立数据库,判断不存在,再建立
CREATE DATABASE IF NOT EXISTS 数据库名称;
复制代码
三、建立数据库,而且制定字符集
CREATE DATABASE 数据库名称 CHARACTER SET 字符集名;
复制代码
一、修改数据库的字符集
ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;
复制代码
查询全部数据库名称
SHOW DATABASES
复制代码
查询某个数据库的字符集
SHOW CREATE DATABASE 数据库名称;
复制代码
举例:
mysql> SHOW CREATE DATABASE mysql_grammar_test;
+--------------------+-----------------------------------------------------------------------------+
| Database | Create Database |
+--------------------+-----------------------------------------------------------------------------+
| mysql_grammar_test | CREATE DATABASE `mysql_grammar_test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------------+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)
复制代码
一、删除数据库
DROP DATABASE 数据库名称;
复制代码
二、判断数据库存在,存在再删除
DROP DATABASE IF EXISTS 数据库名称;
复制代码
关于数据库经常使用的增删改查就说完了,下面要开始讲解关于表和数据了,可是咱们必须指定使用的数据库,才能够针对这个数据进行一些操做表或数据等等操做
一、查询当前正在使用的数据库名称
SELECT DATABASE();
复制代码
二、使用数据库
USE 数据库名称;
复制代码
符号规定:下面展现一些定义的时候,为简便理解,使用中文配合符号表述(会有具体举例,不用担忧理解不了)
<>
中的内容为实际的语义[]
中的内容为任选项(不填写也可){}
中的内容必须显式的指定|
为选项符[,...n]
表示前面的项能够重复屡次SQL 语言经过定义一个关系所对应的基本表来完成关系模式的定义,其语句格式为:
CREATE TABLE 表名(
<列名1> <数据类型1> [<列级完整约束条件>],
[<列名2> <数据类型2> [<列级完整约束条件>],...],
[<表级完整约束条件>]
);
复制代码
固然了你看完这个定义可能一会儿很差理解,我在后面,会就着一个实际的例子,来和你们讲解,在此以前有两个重要的知识须要补充:
关系中的每个属性,都来自一个域,它的取值必须是域中的值,而在 SQL 中,这个域的概念,用数据类型来实现,就好比,咱们定义的这一列数据都只能是 8个单位长度之内的字符串
下面列了几种常见的数据类型
数据类型 | 含义 |
---|---|
CHAR(n) | 长度为 n 的定长字符串 |
VARCHAR(n) | 最长度为 n 的边长字符串 |
INT 或 INTERGER | 长整数 |
SMALLINT | 短整数 |
DOUBLE(6,3) | 双精度浮点数,表明共保留6位数字,小数点后保留3位(也可不设置直接使用) |
FLOAT(n) | 浮点数,精度至少为 n 位数字(也可不设置直接使用) |
DATE | 日期,只包含年月日,yyyy-MM-dd |
TIMESTAMP | 时间戳类型,包含年月日时分秒,yyyy-MM-dd HH:mm:ss |
约束,就是针对属性值的一些约束条件,只针对某一列,叫作列级约束、针对多列属性的约束,叫作表级约束,怎么理解呢?就例如某一列叫作 学号,咱们就指定约束,这一行不容许为 NULL 等等
约束要想说清楚,仍是须要一点篇幅的,同时例如外键约束等,就会引伸出一些多表之间的问题,为了简便,在这一篇入门文章中就不写关于约束以及多表的问题了,我后面两篇将这部分相关的内容
简单解释一下,建立一个学生表,其中有这么几个字段(列)学号、姓名、年龄、出生日期、成绩、插入时间,指定 stu_id 也就是学号做为主键,至于一些非空或者 id 自增我都没有设置哈
CREATE TABLE student(
stu_id INT,
stu_name VARCHAR(32),
stu_age INT,
stu_birthday DATE,
stu_score DOUBLE(4,1),
stu_insert_time TIMESTAMP,
PRIMARY KEY(stu_id)
);
复制代码
一、修改表名
ALTER TABLE 表名 RENAME TO 新表名;
复制代码
二、修改列名称和类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
复制代码
三、修改类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
复制代码
四、修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名称;
复制代码
五、添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
复制代码
一、查询某个数据库中全部的表名
SHOW TABLES;
复制代码
二、查询表结构
DESC 表名;
复制代码
DROP TABLE 表名;
Drop TABLE IF EXISTS 表名;
复制代码
这一块的内容,实际上才是咱们通俗意义上的增删改查,这一块也是用的最多的,毕竟数据库和表,通常初期都会设计好,除非临时有大的需求变动,不然不多会去修改
一、基本语法:
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
复制代码
二、举个例子
就用上面建立的学生表
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'张三',20,'2020-05-30',66.6,'2020-05-30 19:00:35');
复制代码
三、注意
Column count doesn't match value count
一、基本语法
DELETE FROM 表名 [WHERE 条件]
复制代码
删除数据的条件就很灵活了,在这个部分,我给你们列几种例子,例如在插入这样三条记录的基础上
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'张三',20,'2020-05-30',66.6,'2020-05-30 19:00:35');
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1002,'李四',25,'2020-05-30',66.6,'2020-05-30 19:00:35');
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1003,'王五',16,'2020-05-30',66.6,'2020-05-30 19:00:35');
复制代码
DELETE FROM student WHERE stu_id = 1001;
复制代码
DELETE FROM student WHERE stu_name = '张三';
复制代码
DELETE FROM student WHERE stu_age >= 20;
复制代码
二、删除全部数据
若是不填写删除语句中的条件部分,则会删除表中的全部数据
DELETE FROM 表名;
复制代码
可是这种方式并不推荐,由于这种方式下有多少条记录就会执行多少次删除操做,数据量大的状况下,效率很低
推荐使用
TRUNCATE TABLE 表名;
复制代码
它的机制是,先删除掉整个表,而后再建立一个空的,与原来同样的表,效率会更高一些
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2,... [WHERE 条件];
复制代码
关于修改数据,通常状况下,都是经过在条件中,指定某个 id 值,而后去修改,由于这个 id 值通常都是主键,能肯定惟一数据
UPDATE student SET stu_birthday = '2020-02-22', stu_score = 90.8 WHERE stu_id = 1001;
复制代码
你本身测试的时候能够发现,换种写法即便不指定 WHERE stu_id = 1001
彷佛也能执行成功
UPDATE student SET stu_id = 1001, stu_birthday = '2020-02-22', stu_score = 90.8;
复制代码
这是由于前面咱们已经传入了主键 stu_id = 1001
,通常咱们修改数据仍是在后面设置条件更多
UPDATE student SET stu_id = 1001, stu_name = '张三', stu_age = 20, stu_birthday = '2020-01-01', stu_score = 90.8, stu_insert_time = '2020-02-22' WHERE stu_id = 1001;
复制代码
也就是,不须要更新的也列了出来,只不过更新的值没有变化而已,这样能够知足用户各类的修改状况,这部份内容,在 JDBC 的相关文章中才是重点,这里也不过多说起了
这一块内容比较多,单独摘出来讲,多说一句,这一块的内容,还只是涉及到单表的查询,至于多表复杂的查询,会在下一篇讲完约束之后提到
这个很是经常使用,*
表明全部,而后 FROM 指定表名就能够了,它会将全部记录的完整信息列出来
SELECT * FROM 表名;
复制代码
提一个小 Tips ,若是特别注重效率的话例如在 MyBatis 配合插件,就会直接使用插件生成的 Base_Column_List ,做为查询的值,这个Base_Column_List 就表明全部的字段(列),用 * 若是后期字段存在增加的问题,在必定程度上这样的书写方式会提升一些效率,可是就普通的项目而言,实际上,也没有太大关系
若是只须要查询指定的几个字段,能够经过下面的方法,列出指定字段,经过逗号分隔
SELECT 字段名1,字段名2... FROM 表名;
复制代码
一、全部的条件查询语句,都是基于 WHERE 进行使用的
二、WHERE 后配合各类运算符,就能够灵活的实现不少查询需求
> 、< 、<= 、>= 、= 、<>
IS NULL 或 IS NOT NULL
AND 或 &&
BETWEEN...AND
OR 或 ||
NOT 或 !
IN( 集合)
LIKE:模糊查询
_
:单个任意字符占位符%
:多个任意字符占位符三、举些例子
SELECT * FROM student WHERE stu_score != 66.6;
SELECT * FROM student WHERE stu_score <> 66.6;
复制代码
-- 查询哪些学生成绩字段为 NULL
SELECT * FROM student WHERE stu_score IS NULL;
-- 查询哪些学生成绩字段不为 NULL
SELECT * FROM student WHERE stu_score IS NOT NULL;
-- 这是一种错误的写法,NULL的判断是不能用等号的
SELECT * FROM student WHERE stu_score = NULL; (错误!!!)
复制代码
SELECT * FROM student WHERE stu_score >=60.0 AND stu_score <= 80.0;
SELECT * FROM student WHERE stu_score >=60.0 && stu_score <= 80.0;
SELECT * FROM student WHERE stu_score BETWEEN 60.0 AND 80.0;
复制代码
SELECT * FROM student WHERE stu_score = 40.0 OR stu_score = 90.8;
SELECT * FROM student WHERE stu_score = 40.0 || stu_score = 90.8;
SELECT * FROM student WHERE stu_score IN (40.0,90.8);
复制代码
这里要注意了,我上面在 OR 中使用 = 测试,是为了引出 IN 的这个使用方式,可是就没有很好的体现出 OR 和 AND 的区别了
SELECT * FROM student WHERE stu_score >= 60.0 OR stu_score <= 80.0;
复制代码
它的意思是先查询到成绩 >= 60.0 的全部数据,而后再查询到成绩 <= 80.0 的全部数据,这一点要注意哦
SELECT * FROM student WHERE stu_name LIKE '张%';
复制代码
SELECT * FROM student WHERE stu_name LIKE '_四%';
复制代码
_
)SELECT * FROM student WHERE stu_name LIKE '____';
复制代码
SELECT * FROM student WHERE stu_name LIKE '%五%';
复制代码
咱们不少时候,查询到的数据都是按照主键,例如 id 为顺序的,不过若是咱们想要查询到的数据按照必定的方式排序,就用到了 ORDER BY 这个语句,语法以下
ORDER BY 排序字段1 排序方式1 ,排序字段2 排序方式2...
-- 排序方式:
ASC:升序,默认的。
DESC:降序
复制代码
注意:
一、只有排序字段1的值相同时,才会执行排序字段2,若是没有排序字段2,则按照主键默认排序
二、默认的排序方式是升序,即由低到高
SELECT * FROM student ORDER BY stu_score DESC;
复制代码
SELECT * FROM student ORDER BY stu_score DESC, stu_age ASC;
复制代码
一、基本语法
GROUP BY 分组字段
复制代码
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age;
复制代码
说明:AVG 方法是求平均值的,COUNT 方法是求个数的
这个可能很差理解,一样配个图,先看一下全部的数据,有7位同窗,年龄只有18以及20这两个,固然通常用男女或者班级,系别等区分会更加贴近现实,我只是懒得,再建立一张表了,就姑且用年龄演示就行了
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age HAVING COUNT(stu_id) > 2;
复制代码
这个地方就要引入一个新的概念,就是 HAVING
WHERE 和 HAVING 有什么区别呢?
执行结果:
聚合函数补充:
聚合函数:将一列数据做为一个总体,进行纵向的计算,尽可能选择不为空的列进行计算,不然就须要使用 IFNULL 函数进行判断
COUNT:计算个数 -- 通常选择非空的列:主键
MAX:计算最大值
MIN:计算最小值
SUM:计算和
AVG:计算平均值
复制代码
若是查询到的数据太多,在同一个页面上显示,很麻烦,分页查询就能够解决这个问题
一、基本语法
limit 开始的索引,每页查询的条数;
复制代码
二、基本书写公式套路
开始的索引 = (当前的页码 - 1) * 每页显示的条数
复制代码
SELECT * FROM student LIMIT 0,2; -- 第1页
SELECT * FROM student LIMIT 2,2; -- 第2页
SELECT * FROM student LIMIT 4,2; -- 第3页
SELECT * FROM student LIMIT 6,2; -- 第4页
复制代码
我暂时表中有7条数据 id 从 1001-1007 ,因此例如我执行显示第二页的语句,就会显示 id 为1003 以及 1004 的数据
另外,LIMIT 是一个MySQL"方言",在其余数据库中就不支持了,可是不一样的数据库,都会有一些替代的写法
若是文章中有什么不足,欢迎你们留言交流,感谢朋友们的支持!
若是能帮到你的话,那就来关注我吧!若是您更喜欢微信文章的阅读方式,能够关注个人公众号
在这里的咱们素不相识,却都在为了本身的梦而努力 ❤
一个坚持推送原创开发技术文章的公众号:理想二旬不止