mysql基础教程
Posted 眰恦ღ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql基础教程相关的知识,希望对你有一定的参考价值。
1.初识MySQL
JavaEE:企业级Java开发 Web
前端(页面:展示,数据!)
后端(连接点:连接数据库JDBC,链接前端(控制,控制视图跳转,和给前端传递数据))
数据库(存数据,txt,Excel,word)
只会写代码,学好数据库,基本混饭吃!
操作系统,数据结构与算法!当一个不错的程序猿!
离散数学,数字电路,体系结构,编译原理。+实战经验,高级程序员~优秀的程序猿
1.1 为什么学习数据库?
1、岗位需求
2、现在的世界,大数据时代~,得数据库者得天下。
3、被迫需求: 存数据
4、数据库是所有软件体系中最核心的存在 DBA
1.2 什么是数据库?
数据库(DB,DataBase)
概念:数据仓库,软件,安装在操作系统(windows、linux、mac…)之上!SQL,可以存储大量的数据。500万!
作用:存储数据,管理数据
1.3 数据分类
关系型数据库:SQL
- mysql,Oracle,Sql Server,DB2,SQLlite
- 通过表和表之间,行和列之间的关系进行数据的存储,如:学员表和考勤表之间的关联
非关系型数据库:NoSQL(Not Only)
- Redis,MongDB
- 非关系型数据库,对象存储,通过对象的自身的属性来决定。
DBMS(数据库管理系统)
- 数据库的管理软件,科学有效的管理我们的数据。维护和获取数据;
- MySQL,数据管理系统(Database Management System)
1.4 MySQL简介
MySQL是一个关系型数据库管理系统
-
前世: 瑞典MySQL AB 公司
-
今生: 属于 Oracle 旗下产品
-
MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
-
开源的数据库软件~
-
体积小、速度快、总体拥有成本低。招人成本比较低,所有人必须会~
-
中小型网站、或者大型网站,集群!
官网:https://www.mysql.com
现在用的最多的5.7,比较稳定,8.0最新版
1.5 安装MySQL
安装教程https://blog.csdn.net/weixin_45277249/article/details/114202833
1.6 连接数据库
打开MySQL命令窗口
- 在DOS命令行窗口进入 安装目录\\mysql\\bin
- 可设置环境变量,设置了环境变量,可以在任意目录打开!
连接数据库语句 : mysql -h 服务器主机地址 -u 用户名 -p 用户密码
注意 : -p后面不能加空格,否则会被当做密码的内容,导致登录失败 !本机操作可省略-h参数
查看MySQL版本信息和用户名:select version(),user();
version()返回MySQL版本号,user()返回连接数据库的用户名
几个基本的数据库操作命令 :
-
展示所有数据库
show databases;
-
切换到某个数据库
use 数据库名;
-
查看数据库下所有表
show tables;
-
退出mysql
exit;
-
刷新数据库
flush privileges;
-
显示表mysql数据库中user表的列信息
describe user;
-
修改密码
update user set password=password('123456')where user='root';
MySQL 数据库服务器的组成
-
以数据库为基本单位 : 系统数据库 用户数据库
-
以数据表 (table) 为基本单位
SQL(Structed Query language) 结构化查询语言
-
DML数据操作语言(Data Manipulation Language):用来操作数据库中所包含的数据
- 如:INSERT、UPDATE、DELETE
-
DDL数据定义语言(Data definition Language) :用于创建和删除数据库对象等操作
- 如:CREATE、DROP、ALTER
-
DQL数据查询语言(Data Query Language) :用来对数据库中的数据进行查询
- 如:SELECT
-
DCL数据控制语言(Data Control Language):用来控制数据库组件的存取许可、存取权限等
- 如:GRANT、COMMIT、ROLLBACK
2.操作数据库
2.1 操作数据库
带了 [ ] 就是可选的
-
创建数据库
create database [if not exists] 数据库名;-- if not exists意思是如果不存在则创建
-
查看数据库列表
show databases;-- 该列表中会有四个系统数据库和自己建的数据库
-
使用数据库
use `school`;-- 如果你的表名或字段名是一个特殊字符,就需要带反引号
-
删除数据库
drop database [if exists] 数据库名;
注意:以分号作为一条命令的结束符,Windows系统下默认不区分大小写
2.2 数据类型
数值
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
TINYINT | 非常小的数据 | 有符值: -27 ~ 27-1 无符号值:0 ~ 28-1 | 1字节 |
SMALLINT | 较小的数据 | 有符值: -215 ~ 215-1 无符号值: 0 ~ 216-1 | 2字节 |
MEDIUMINT | 中等大小的数据 | 有符值: -223 ~ 223-1 无符号值: 0 ~ 224-1 | 3字节 |
INT | 标准整数 | 有符值: -231 ~ 231-1 无符号值:0 ~ 232-1 | 4字节 |
BIGINT | 较大的整数 | 有符值: -263 ~263-1 无符号值:0 ~264-1 | 8字节 |
FLOAT | 单精度浮点数 | ±1.1754351e -38 | 4字节 |
DOUBLE -> java double | 双精度浮点数 | ±2.2250738585072014e -308 | 8字节 |
DECIMAL | 字符串形式的浮点数 | Decimal(M,D) | M+2个字节 |
字符串
字符串类型 | 说明 | 长度 |
---|---|---|
CHAR[(M)] | 定长字符串 | M字节 |
VARCHAR[(M)] | 可变字符串 | 可变长度 |
TINYTEXT | 微型文本串 | 0~28–1字节 |
TEXT | 文本串 | 0~216–1字节 |
VARCHAR相对于Java的String
日期类型
日期类型 | 格式 | 取值范围 |
---|---|---|
DATE | YYYY-MM-DD,日期格式 | 1000-01-01~ 9999-12-31 年月日 |
DATETIME | YY-MM-DD hh:mm:ss: | 1000-01-01 00:00:00 ~9999-12-31 23:59:59 年月日时分秒 |
TIME | hh:mm:ss: | -835:59:59 ~ 838:59:59 |
TIMESTAMP | YYYYMMDDHHMMSS | 1970年某时刻~2038年某时刻,精度为1秒 |
YEAR | YYYY格式的年份 | 1901~2155 |
null
- 没有值,未知
【注意】不要使用NULL进行运算,结果为NULL
2.3 数据库的字段属性
-
UNSIGNED:设置该列不可出现负数
-
ZEROFILL: 不足位数 0 填充 ,设定向这属性该列自动会有 UNSIGEND
-
UNIQUE KEY(UK): 唯一约束,设置字段的值是唯一的 允许为空,但只能有一个空值
-
PRIMARY KEY(PK):设置主键,就是能够唯一标识某个数据表数据的列,只要设置为主键 该列必须是非空 且唯一
-
FOREIGN KEY(FK) :用于在两表之间建立关系,需要指定引用主表的哪一字段
-
auto_increment:自动增长,在上一条记录的基础上+1(默认),可以自定义主键自增的起始值和步长
-
NOT NULL: 标识该列不许为空
-
DEFAULT :设置默认值
-
COMMENT :给列或表加注释
2.4 操作数据表
-
创建数据表
CREATE TABLE [IF NOT EXISTS] `表名`( `字段名` 列类型 [属性] [索引] [注释], `字段名` 列类型 [属性] [索引] [注释], …… `字段名` 列类型 [属性] [索引] [注释], )[表类型] [字符集设置] [注释]
create table [IF NOT EXISTS] `user`( id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号', username VARCHAR(25) not null COMMENT '姓名', gender VARCHAR(2) DEFAULT '男' not NULL )COMMENT '用户表';
【注意】使用英文括号,表名和字段名尽量使用反引号括起来
-
删除数据表
drop TABLE [IF EXISTS] `表名`;
-
常用命令
SHOW CREATE DATABASE `user` -- 查看创建数据库的语句 SHOW CREATE TABLE `user` -- 查看student数据表的定义语句 -- 显示表的结构 DESC `user` DESCRIBE `uer`
2.5 数据库引擎
- INNODB 默认使用~
- MYISAM 早些年使用的
名称 | InnoDB | MyISAM |
---|---|---|
事务处理 | 支持 | 不支持 |
数据行锁定 | 支持 | 不支持 |
外键约束 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
表空间大小 | 较大,约MyISAM的2倍 | 较小 |
适用场合
- 使用MyISAM: 不需事务,空间小,以查询访问为主
- 使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
在物理空间存在的位置
- 所有的数据库文件都存在data目录下
- 本质还是文件的存储!
MySQL引擎在物理文件上的区别
- InnoDB 在数据库表中只有一个*.frm文件,以及上级目录下的 ibdata1文件
- MYISAM 对应文件
- *.frm 表结构的定义文件
- *.MYD 数据文件(data)
- *.MYI 索引文件(index)
设置数据库表的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码~(不支持中文!)
MySQL的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
2.6 修改和删除表
-
修改表名
ALTER TABLE `旧名` rename `新名`;
-
添加字段
ALTER TABLE `表名` ADD 字段名 列属性;
-
修改表的字段
ALTER TABLE `表名` MODIFY 字段名 列属性;-- 修改约束,不改名,重新设定 ALTER TABLE `表名` CHANGE 旧字段名 新字段名 列属性;-- 字段重命名
-
删除表的字段
ALTER TABLE `表名` drop `字段名`
-
删除数据表
drop TABLE [IF EXISTS] `表名`;
所有的创建和删除操作尽量加上判断,以免报错~
【注意点】
- 使用``把字段名或表名包起来
- 单行注释 : – 注释内容 #注释内容 多行注释: /* 注释内容 */
- sql关键字大小写不 敏感,建议大家写小写
- 所有的符号全部用英文
3.MySQL数据管理
mysql运算符
类型 | 符号 |
---|---|
算术运算符 | + 加 -减 *乘 / 除 %取余 |
赋值运算符 | = |
比较/关系运算符 | = 判断相等 > 大于 <小于 >=大于等于 <=小于等于 <> 或 != 不等于 |
逻辑运算符 | and并且(&&) or或者(||) not非(取反) |
between | 某个区间,between 2 and 5 (2 - 5之间) |
3.1 外键(了解即可)
外键:一张表里的某个字段引用着另一张表里的某个字段信息.(==外键可以保证数据的合理性和完整一致性)
【注意】
- 外键因为其强制约束,导致我们在对表操作时,时刻需要考虑到外键,增加了复杂性
- 往往在大型项目中,会取消物理外键,而改用逻辑外键
- 删除有外键关系的表,必须要先删除引用的别的表(从表),再删除被引用的表(主表)
设置外键
ALTER TABLE student
ADD CONSTRAINT fk_student_grade
FOREIGN KEY (gradeid)
REFERENCES grade(id);
删除外键
ALTER TABLE student drop FOREIGN KEY fk_student_grade
以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰)
最佳实践
- 数据库就是单纯的表,只用来存数据,只有 行(数据) 和 列(字段)
- 我们想使用多张表的数据,想使用外键(程序去实现)
3.2 DML语言(全部记住)
数据库意义:数据存储,数据管理
- insert
- update
- delete
添加
-
语法
INSERT INTO 表名 列名 VALUES 值列表
-
插入一条数据
INSERT INTO student(studentNo,studentName`password`,gradeid,sex,phone,address,borthday,email,card) VALUES (null,'小明','123123',1,'男','123123123','北京','2001-1-1','123123@qq.com','9999999');
-
插入多条数据
-- id设置了自增,可以省略不写 insert into grade (id,gradeName) VALUES('s1'),('s2'),('y2');
【注意】
- 如果你没有指定要给哪些字段赋值,那么必须按照数据库表的字段依次赋值
- 字段是可以省略的,但是后面的值要一一对应
修改
语法
update 表名 SET 列名 = 更新值 [WHERE 更新条件]
-
修改一个字段
update `student` SET `name`='小明' WHERE id=1;
-
修改多个字段
update `student` SET `name`='小明',age=17 WHERE id=1;
-
多个条件
update `student` SET `name`='小明' WHERE id=1 AND age=1
-
修改一个区间的数据
update `student` SET `name`='小明' WHERE id<5
【注意】
- 不指定条件的情况下,会改动所有这个列的数据
- 更新值可以是一个具体的值,也可以是一个变量
- 修改多个属性,中间使用英文逗号隔开
删除
delete命令
-
语法
DELETE FROM 表名 [WHERE 删除条件]
-
删除指定数据
delete from `student` WHERE id =1
TRUNCATE命令
作用:完全清空一个数据库表,表的结构和索引约束不会变!
-- TRUNCATE TABLE 表名
TRUNCATE TABLE `student`
DELETE和TRUNCATE的区别:
- 相同点,都能删除数据,都不会删除表结构
- truncate会重新设置自增列,计数器会归零
- truncate不会影响事务
了解即可:delete删除的问题,重启数据库,现象
- InnoDB:自增列会从1开始(存在内存当中的,断电即失)
- MyISAM:继续从上一个自增量开始(存在文件中的,不会丢失)
4.DQL查询数据(最重点)
Data Query Language:数据查询语言
- 所有查询操作都能用它,Select
- 简单的查询,复杂的查询都能做~
- 数据库中最核心的语言,最重要的语句
- 使用频率最高的语句
查询所有数据
select * from `表名`;-- *代表全部列
查询指定字段
select `字段1`,`字段2`,`字段n` from `表名`;-- 语法
------------------------------------------------
select `name`,`age` from `student`;
起别名
- 起别名使用
AS
关键字,可以给字段起别名,也可以给表起别名 - 有的时候,列名不是那么的见名知意,那么我们就起别名,
字段名 AS 别名
select `字段1` AS 别名1,`字段2` AS 别名2 from `表名` AS别名; -- 语法
-----------------------------------------------------------------
select `name` AS 姓名,`age` AS 年龄 from `student` AS s;
CONCAT 函数
- 查出来的name前面都会加上==姓名:==
select CONCAT('姓名:',name) from student;
distinct 去重
- 发现重复数据,去重
select distinct `StudentNo` from `student`;
数据库的列(表达式)
- 数据库中的表达式:文本值,列,null,函数,计算表达式,系统变量……
- select
表达式
from 表名
SELECT VERSION() -- 查询mysql版本(函数)
SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)
--------------------------------------------------------
-- 学员考试成绩 +1分查看
SELECT StudentNo,StudentResult + 1 AS '提分后' FROM result
WEHER条件子句
- 检索数据中符合条件的值
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 并且,两个都为真,结果为真 |
or || | a or b a||b | 或,其中一个为真,结果为真 |
not ! | not a !a | 逻辑非,真为假,假为真! |
-- 查询考试成绩在95-100分之间
SELECT studentNo,StudentResult FROM result
WHERE StudentResult>=95 AND StudentResult<=100
-- 模糊查询(区间)
SELECT studentNo,StudentResult FROM result
WHERE StudentResult BETWEEN 95 AND 100
-- 除了1000号学生之外的成绩
SELECT studentNo,StudentResult FROM result
WHERE NOT studentNo = 1000
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL,结果为真 |
IS NOT NULL | a is not null | 如果操作符不为NULL,结果为真 |
BERWEEN | a between b and c | 若a在b和c之间,则结果为真 |
LIKE | a like b | SQL匹配,如果a匹配b,则结果为真 |
IN | a in (a1,a2,a3……) | 假设a在a1或者a2……其中的某一个值中,结果为真 |
==============LIKE模糊查询====================
-- 查询姓刘的同学 %代表任意字符
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE '刘%'
-- 查询姓刘的同学,名字后面只有一个字符
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE '刘_'
-- 查询名字中间有 “明”的同学
SELECT StudentNo,StudentName FROM student
WHERE StudentName LIKE '%明%'
=========in(具体的一个或多个值)==============
-- 查询 1001,1002,1003号学员
SELECT StudentNo,StudentName FROM student
WHERE StudentNo IN(1001,1002,1003)
-- 查询在北京的学生
SELECT StudentNo,StudentName FROM student
WHERE address IN(北京)
=============null not null=================
-- 查询地址为空的学生 null ''
SELECT StudentNo,StudentName FROM student
WHERE address='' OR address IS NULL
-- 查询有出生日期的同学 不为空
SELECT StudentNo,StudentName FROM student
WHERE birndate IS NOT NULL
4.高级查询
完整的查询语法
select [select选项] 字段列表[字段别名] from 数据源
[where 字句] [group by子句 ] [having 子句] [order by 子句] [limit 子句];
参考文章https://blog.csdn.net/u011991249/article/details/64519945
4.1 联表查询 join
==================INNER JOIN======================
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT * FROM student
SELECT * FROM result
/*
思路
1.分析需求,分析查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询?七种
确定交叉点(两个表中哪个数据是相同的)
判断的条件:学生表中的 studentNo = 成绩表中的 studentNo
*/
-- join(连接的表) on(判断的条件) 连接查询
-- where等值查询
SELECT s.studentNo,studentName,SubjectNo,StudentResult
FROM stdent AS s
INNER JOIN result AS r
WHERE s.studentNo=r.studentNo
-- Right JOIN
SELECT s.studentNo,studentName,SubjectNo,StudentResult
FROM stdent s
RIGHT JOIN result r
ON s.studentNo=r.studentNo
-- Left JOIN
SELECT s.studentNo,studentName,SubjectNo,StudentResult
FROM stdent s
LEFT JOIN result r
ON s.studentNo=r.studentNo
-- 查询缺考的同学
SELECT s.studentNo,studentName,SubjectNo,StudentResult
FROM stdent s
LEFT JOIN result r
ON s.studentNo=r.studentNo
WHERE StudentResult IS NULL
-- 查询参加了考试的同学信息:学号,学生姓名,科目名,分数
/*
思路
1.分析需求,分析查询的字段来自哪些表,studnet、result、subject(连接查询)
2.确定使用哪种连接查询?七种
确定交叉点(两个表中哪个数据是相同的)
判断的条件:学生表中的 studentNo = 成绩表中的 studentNo
*/
SELECT s.studentNo,studentName,SubjectNo,StudentResult
FROM stdent s
RIGHT JOIN result r
ON s.studentNo=r.studentNo
INNER JOIN `subject` sub
ON r.studentNo=sub.SubjectNo
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
a LEFT JOIN b -- 在左边就是左表
- 我要查询哪些数据 SELECT ……
- 从哪些表中查
FROM 表 xxx join 连接的表 on 交叉条件
- 假设存在一种多张表查询,慢慢来,先查询两张表,再慢慢增加
4.2 自连接
自连接是内连接的一种,内连接可分为等值连接和自身连接。
等值连接:查找两个表中连接字段相等的记录。
自身连接: 就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。
- 自连接是同一个表不同实例的连接操作
- 自连接必须指定别名(aliasName)区分不同实例
现在我们有一张category表
- pid为1的是父栏目,其他都是子栏目
- 子栏目的pid对应的是父栏目的categoryid
categoryid | pid | categoryName |
---|---|---|
2 | 1 | 信息技术 |
3 | 1 | 软件开发 |
4 | 3 | 数据库 |
5 | 1 | 美术设计 |
6 | 3 | web开发 |
7 | 2 | 办公信息 |
8 | 5 | ps技术 |
我们把上表拆分成两张表来看
- 父栏目
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
- 子栏目
pid | categoryName |
---|---|
3 | 数据库 |
2 | 办公信息 |
3 | web开发 |
5 | 美术设计 |
操作:查询父类对应的子类
-- 把一张表看成两张一模一样的表
SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目'
FROM category AS a,category AS b
WHERE a.categoryid = b.pid
结果如下:
父栏目 | 子栏目 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
下面这个例子来自https://www.zhihu.com/question/290782386
以下面这张表为例:
要查询与姓名 HH 同龄且籍贯也相同的学生信息。就可以用自连接查询:
SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
FROM student A
JOIN student B
ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名='HH'
结果如下:
4.3 分页和排序
排序
- 排序使用
ORDER BY
,后面跟的字段就是以它排序 - 降序
desc
由大到小 - 升序
asc
由小到大
select * from result ORDER BY StudentResult asc; -- 升序
select * from result ORDER BY StudentResult desc;-- 降序
分页
为什么要分页?假设你有100万条数据
- 缓解数据库压力
- 给人的体验更好
LIMIT 起始值,pageSize
-- 起始值是从第几条数据开始
-- pageSize是页面大小,也就是每页显示多少条数据
-
起始值 = (当前页-1)*页面大小
-
数据总数 / 页面大小 = 总页数
-- 第一页
select * from `subject 以上是关于mysql基础教程的主要内容,如果未能解决你的问题,请参考以下文章