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-11字节
SMALLINT较小的数据有符值: -215 ~ 215-1 无符号值: 0 ~ 216-12字节
MEDIUMINT中等大小的数据有符值: -223 ~ 223-1 无符号值: 0 ~ 224-13字节
INT标准整数有符值: -231 ~ 231-1 无符号值:0 ~ 232-14字节
BIGINT较大的整数有符值: -263 ~263-1 无符号值:0 ~264-18字节
FLOAT单精度浮点数±1.1754351e -384字节
DOUBLE -> java double双精度浮点数±2.2250738585072014e -3088字节
DECIMAL字符串形式的浮点数Decimal(M,D)M+2个字节

字符串

字符串类型说明长度
CHAR[(M)]定长字符串M字节
VARCHAR[(M)]可变字符串可变长度
TINYTEXT微型文本串0~28–1字节
TEXT文本串0~216–1字节

VARCHAR相对于Java的String

日期类型

日期类型格式取值范围
DATEYYYY-MM-DD,日期格式1000-01-01~ 9999-12-31 年月日
DATETIMEYY-MM-DD hh:mm:ss:1000-01-01 00:00:00 ~9999-12-31 23:59:59 年月日时分秒
TIMEhh:mm:ss:-835:59:59 ~ 838:59:59
TIMESTAMPYYYYMMDDHHMMSS1970年某时刻~2038年某时刻,精度为1秒
YEARYYYY格式的年份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 早些年使用的
名称InnoDBMyISAM
事务处理支持不支持
数据行锁定支持不支持
外键约束支持不支持
全文索引不支持支持
表空间大小较大,约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 NULLa is null如果操作符为NULL,结果为真
IS NOT NULLa is not null如果操作符不为NULL,结果为真
BERWEENa between b and c若a在b和c之间,则结果为真
LIKEa like bSQL匹配,如果a匹配b,则结果为真
INa 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
categoryidpidcategoryName
21信息技术
31软件开发
43数据库
51美术设计
63web开发
72办公信息
85ps技术

我们把上表拆分成两张表来看

  • 父栏目
categoryidcategoryName
2信息技术
3软件开发
5美术设计
  • 子栏目
pidcategoryName
3数据库
2办公信息
3web开发
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基础教程的主要内容,如果未能解决你的问题,请参考以下文章

菜鸟级 mysql 问题

在职职员籍贯分布图

MySQL基础--约束

mysql建表时拆分出常用字段和不常用字段

数据结构与算法2016-05-31

[关系型数据模型] 相关术语