数据库学习----MySQL(一)

一、初识MySql

1、为什么要学习数据库

  • 公司业务需求,岗位要求
  • 用来存储数据信息
  • 大数据时代,数据库是基本要求
  • 数据库也是所有软件体系中的核心存在

2、什么是数据库(DataBase)?

  • 数据库是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。
  • 数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

3、数据库的分类

关系型数据库:(Sql)
  • 通过表和表之间的关系进行存储的数据,如学生信息表,成绩表;
  • 常见的关系型数据库:MySql、Oracle、Sql Sever、DB2等
非关系型数据库
  • 非关系型数据库存储对象,由对象自身的属性决定;
  • 常见的非关系型数据库:Redis、MongoDB。

4、什么是MySql?

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。 一般中小型网站和大型网站的开发都选择 MySQL 作为网站数据库。

二、MySQL安装、Sqlyog安装

命令行安装MySQL步骤

1、下载软件

64位安装软件下载链接
根据自己的电脑配置下载相关的软件包

2、安装步骤
  1. 将下载好的软件包解压到自己想安装的目录下,如:E:\Environment\mysql-5.7.19
  2. 添加环境变量:
    1、打开自己电脑的环境变量配置;
    2、选择Path,在后面加上MySQL中的bin文件夹的路径;
    3、E:\Environment\mysql-5.7.19下新建 my.ini 文件;
    4、编辑新建的 my.ini 文件,将其中路径切换为自己的文件路径;
[mysqld]
basedir=E:\Environment\mysql-5.7.19\
datadir=E:\Environment\mysql-5.7.19\data\
port=3306
character-set-server=utf8
skip-grant-tables
  1. 启动管理员模式下的CMD,然后切换目录到MySQL下的bin,再输入 mysqld –install 进行安装

  2. 再输入mysqld --initialize-insecure --user=mysql初始化数据文件

  3. 然后输入net start mysql再次启动 mysql 再使用命令mysql –u root –p 进入mysql管理界面(密码可为空)

  4. 进入页面后更改root密码:
    update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
    再输入flush privileges;刷新权限

  5. 将第2步中的 my.ini 文件中的skip-grant-tables 删掉

  6. 重启mysql即可正常使用 net stop mysql ; net start mysql

安装完成正常使用的界面:
在这里插入图片描述

Sqlyog安装

SQLyog下载链接

下载完成后正常安装即可。

命令行连接数据库

mysql -uroot -p123456

三、操作数据库

1、 操作数据库 – 操作数据库中的表 – 操作数据表中的数据

1、创建数据库

CREATE DATABASE `westos`;

2、删除数据库

DROP DATABASE `westos`;

3、使用数据库

use `westos`;

4、查看所有的数据库

SHOW DATABASES;

2、数据库的列类型

数值

tinyint --特别小数据 1字节
smallint --较小的数据 2字节
int --标准的整数 4字节
bigint --较大的数据 8字节
float -- 单精度浮点数 4字节
double -- 双精度浮点数 8字节
decimal --字符串形式的浮点数,一般用于金融计算

字符串

char --字符串大小固定 0-255字符
varchar --可变字符串 0-65535字符
tinytext --微型文本 2^8-1个字符
text --文本串 2^16-1个字符

时间日期格式

date --YYYY-MM-DD 日期格式
time --hh:mm:ss 时间格式
datetime --最常用的时间日期格式 YYYY-MM-DD hh:mm:ss
timestamp --时间戳 1970.1.1到现在经过的毫秒数

3、数据库的字段属性

Unsigned

  • 无符号的整数
  • 不能为负数

zerofill

  • 0填充
  • 位数不足,0来填充,如:int(3),1 – 001

自增

  • 自动在上一条记录上加1
  • 自增的字段必须是整数类型

非空

  • not null,不填写就会报错

4、创建数据库的数据表

创建一个school数据库
创建student数据表
列属性:id(10)name(20)sex(2)birthday(10)phone(20)
主键为id,自增

-- 创建数据库
CREATE DATABASE IF NOT EXISTS `school`;
-- 创建数据表
CREATE TABLE IF NOT EXISTS `student`(
    `id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '生日',
    `phone` VARCHAR(15) DEFAULT NULL COMMENT '联系方式',
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

创建数据表的格式

CREATE TABLE IF NOT EXISTS `表名` (
    `字段名` 列类型  属性  注释,
    ......
)表类型 字符集设置 注释

5、数据表的类型

  • INNODB 默认使用类型
  • MYISAM 早期使用的数据表类型

这两个数据表的区别:

MYISAM INNODB
事务 不支持 支持
数据行锁定 不支持 支持
外检约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大,约为MYISAM的两倍
优点 节约空间,速度快 安全性高,可以处理事务、多表的用户操作

数据表在物理空间的存储位置

创建的所有数据库都在安装 MySQL 的目录下的 data 文件夹中。

数据表的字符编码

CHARSET=utf8

6、对数据表的修改和删除

修改

-- 修改表名 格式:ALTER TABLE 原表名 RENAME AS 新表名
ALTER TABLE `teacher` RENAME AS `newteacher`; 
-- 增加表中的字段 ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE `newteacher` ADD `age` INT(3);
-- 修改表的字段 ALTER TABLE 表名 MODIFY 字段名 列属性
ALTER TABLE `newteacher` MODIFY `id` VARCHAR(15);
-- 修改字段的名字 ALTER TABLE 表名 CHANGE 原字段名 新字段名
ALTER TABLE `newteacher` CHANGE `id` `newid` INT(3);
-- 删除表的字段 ALTER TABLE 表名 DROP 字段名
ALTER TABLE `newteacher` DROP `age`;

删除

-- 删除表
DROP TABLE IF EXISTS `newteacher`;

在所有的创建和删除和删除操作时加上判断操作,以免程序报错。

四、MySQL数据管理

1、外键

在创建外键的时候,增加外键约束

-- 创建年级表
CREATE TABLE `grade`(
  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
  PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建学生表,添加外键约束
CREATE TABLE IF NOT EXISTS `student` (
   `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
   `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
   `pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密码',
   `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
   `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
   `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
   `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
   PRIMARY KEY(`id`),
   -- 定义外键
   KEY `FK_gradeid` (`gradeid`),
   -- 给外键添加约束
   CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

创建表成功后,添加外键约束

-- 格式:ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY (外键的列) REFERENCES 哪个表(哪个字段)
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);

2、DML语言(数据库操作语言)

  • insert(插入语句)
    注意点:字段和字段之间要用英文逗号隔开;字段的名字是可以省略的,但后面的字段的值要和每个字段对应。
-- 插入一个字段
INSERT INTO `grade`(`gradename`)VALUES('大一');
-- 插入多个字段
INSERT INTO `grade`(`gradename`)VALUES('大二'),('大三');
INSERT INTO `student`(`name`)VALUES('lili');
INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES('heihei','123456','男');
INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES('zhangsan','789456','男'),('lisi','789123','nv');
  • update(修改语句)
-- 修改字段的值,指定位置进行修改
UPDATE `student` SET `name`='zhaohang' WHERE `id`='1';
-- 如果不指定位置进行修改,会将所有的字段值全部修改
UPDATE `student` SET `name`='update';
-- 修改字段的多个属性,用逗号隔开
UPDATE `student` SET `name`='zhangsan',`pwd`='01011110' WHERE `id`='1';
-- 通过where定位字段,可以设置区间或大于小于某个值。
  • delete(删除语句)
DELETE FROM `student` -- 不推荐这样写,会删除数据表中所有的数据
DELETE FROM `student` WHERE id='4';  -- 指定字段进行删除
-- TRUNCATE命令,清空一个数据库的表,但表的结构和约束不会变
TRUNCATE `student`;

delete和truncate的相同和区别:

相同:都可以删除数据,但不会破坏表的结构
区别:TRUNCATE 后表的自增会归零,不会影响事务。 

五、DQL数据查询

1、DQL数据查询语言(Data Query Language)

  • 数据库中所有的查询操作都使用 SELECT
  • 数据库中最核心的语言和操作
  • 使用频率最高的操作

2、 指定字段查询

-- 查询所有的学生
SELECT *FROM `student`;
-- 指定查询的字段
SELECT `StudentName`,`GradeId` FROM `student`;
-- 给查询的字段结果起一个自定义别名进行查询
SELECT `StudentName` AS '学生姓名' FROM `student`;
-- 拼接字符串函数concat()
SELECT CONCAT('姓名:',`StudentName`) `newname` FROM `student`;

查询语法:SELCET 字段 FROM 数据表

查询结果去重:如果查询的结果出现重复的数据,只显示一条

-- 去重查询
SELECT DISTINCT `StudentNo` FROM `result`;

表达式

-- 查看系统版本
SELECT VERSION();
-- 计算数据
SELECT 1000*12-15464 AS 结果;
-- 计算自增的步长
SELECT @@auto_increment_increment;

3、where 指定条件进行查询

获取符合条件的数据

-- where 指定条件进行查询
-- 查询成绩大于等于90的学生的学号和成绩
SELECT `StudentNo`,`StudentResult`FROM `result` WHERE `StudentResult`>=90;
-- &&查询
SELECT `StudentNo` FROM `student` WHERE `StudentNo`>1005&&`Sex`='1';
-- between and 区间查询
SELECT DISTINCT `StudentNo` FROM `result` WHERE `StudentResult` BETWEEN '85' AND '90';
-- NOT和!=
SELECT `GradeId` FROM `student` WHERE NOT `StudentNo`='1000';
SELECT `GradeId` FROM `student` WHERE `StudentNo`!='1000';

4、Join 联表查询

在这里插入图片描述

连接方式 描述
Inner Join 如果表中至少有一个匹配,就返回该行
Left Join 从左表中返回左右的值,即使右表中没有匹配
Right Join 从右表中返回所有的值,即使左表中没有匹配

使用合适:

SELECT 字段1,字段2,...
FROM 第一个表
连接方式 
ON 判断条件
  • Inner Join
-- 联表查询 参加了考试的同学的学号、姓名、科目编号、分数
/*
 分析步骤:
   1、分析查询的字段来自那些表
   2、确定使用那种查询方式:
      a、确定交叉点(这两个表中的那些数据是相同的)
      b、判断的条件:学生表中的studentNo=成绩表中的studentNo
*/
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` AS s
INNER JOIN `result` AS r
WHERE s.`StudentNo`=r.`StudentNo`;
  • Left Join
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` s
LEFT JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`;
  • Right Join
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` s
RIGHT JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`;

案例:
查询参加考试同学的信息(学号,姓名,科目名,分数)
思路:
1、分析要查询的字段来自哪些表
2、确定使用哪种查询方式
a、确定交叉点
b、判断条件

SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM `student` AS s
JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` AS sub
ON r.`SubjectNo`=sub.`SubjectNo`;

自连接:自己和自己连接
一张表当两张表使用

-- 创表
 CREATE TABLE `category` (
  `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
  `pid` INT(10) NOT NULL COMMENT '父id',
  `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
  PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
-- 插入数据
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) 
VALUES('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息');
-- 自连接
SELECT a.`categoryName` AS '父类',b.`categoryName` AS '子类' 
FROM `category` a,`category` b
WHERE a.`categoryid`=b.`pid`;

执行结果:
在这里插入图片描述

5、分页和排序

排序 :升序和降序
-- 排序 ORDER BY 降序DESC 升序ASC
select s.`StudentName`,`SubjectName`,`StudentResult`
from `student` as s
inner join `result` as r
on s.`StudentNo`=r.`StudentNo`
inner join `subject` as sub
on r.`SubjectNo`=sub.`SubjectNo`
where sub.`SubjectName`='高等数学-1'
order by `StudentResult` desc;
分页

分页的必要性: 缓解数据库的压力,给用户以更好的体验
语法:

limit 起始值,页面的容量

案例:

SELECT `SubjectName`,`GradeID`
FROM `subject`
LIMIT 0,5;

执行结果:
在这里插入图片描述

6、子查询

子查询的本质:在 WHERE 语句中在嵌套一条 SELECT 语句

案例:查询 高等数学-1的所有考试结果(学号,科目编号,成绩)

-- 方式一:使用连接查询
SELECT r.`StudentNo`,r.`SubjectNo`,`StudentResult`
FROM `result` r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE sub.`SubjectName`='高等数学-1'
ORDER BY r.`StudentResult` DESC;

-- 方式二:使用子查询(执行顺序从内向外)
SELECT `StudentNo`,`SubjectNo`,`StudentResult`
FROM `result`
WHERE `SubjectNO` = (
   SELECT `SubjectNo` FROM `subject`
   WHERE `SubjectName`='高等数学-1'
)
ORDER BY `StudentResult` DESC;

嵌套查询:代码量少,但较难理解

-- 嵌套查询高等数学-1成绩大于80分的学生的学号和姓名
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (
   SELECT `StudentNo` FROM `result` WHERE `StudentResult` > 80 AND `SubjectNo`=(
       SELECT `SubjectNo` FROM `subject` WHERE `SubjectName`='高等数学-1'
   )
)

以上就是MySQL的基础知识,从了解数据库到操作数据库,以及数据库的数据查询操作,这些都是MySQL的基本要求,下一节还会学习MySQL的函数、事务、索引、权限管理等。

发布了58 篇原创文章 · 获赞 7 · 访问量 2268

猜你喜欢

转载自blog.csdn.net/weixin_42492089/article/details/104208517