MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。 一般中小型网站和大型网站的开发都选择 MySQL 作为网站数据库。
64位安装软件下载链接
根据自己的电脑配置下载相关的软件包
[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
启动管理员模式下的CMD,然后切换目录到MySQL下的bin,再输入 mysqld –install
进行安装
再输入mysqld --initialize-insecure --user=mysql
初始化数据文件
然后输入net start mysql
再次启动 mysql 再使用命令mysql –u root –p 进入mysql
管理界面(密码可为空)
进入页面后更改root密码:
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
再输入flush privileges;
刷新权限
将第2步中的 my.ini 文件中的skip-grant-tables
删掉
重启mysql即可正常使用 net stop mysql ; net start mysql
SQLyog下载链接
下载完成后正常安装即可。
mysql -uroot -p123456
1、创建数据库
CREATE DATABASE `westos`;
2、删除数据库
DROP DATABASE `westos`;
3、使用数据库
use `westos`;
4、查看所有的数据库
SHOW DATABASES;
数值
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到现在经过的毫秒数
Unsigned
zerofill
自增
非空
创建一个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 `表名` (
`字段名` 列类型 属性 注释,
......
)表类型 字符集设置 注释
- INNODB 默认使用类型
- MYISAM 早期使用的数据表类型
这两个数据表的区别:
MYISAM | INNODB | |
---|---|---|
事务 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外检约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约为MYISAM的两倍 |
优点 | 节约空间,速度快 | 安全性高,可以处理事务、多表的用户操作 |
数据表在物理空间的存储位置
创建的所有数据库都在安装 MySQL 的目录下的 data 文件夹中。
数据表的字符编码
CHARSET=utf8
修改
-- 修改表名 格式: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`;
在所有的创建和删除和删除操作时加上判断操作,以免程序报错。
在创建外键的时候,增加外键约束
-- 创建年级表
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`);
-- 插入一个字段
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 `student` SET `name`='zhaohang' WHERE `id`='1';
-- 如果不指定位置进行修改,会将所有的字段值全部修改
UPDATE `student` SET `name`='update';
-- 修改字段的多个属性,用逗号隔开
UPDATE `student` SET `name`='zhangsan',`pwd`='01011110' WHERE `id`='1';
-- 通过where定位字段,可以设置区间或大于小于某个值。
DELETE FROM `student` -- 不推荐这样写,会删除数据表中所有的数据
DELETE FROM `student` WHERE id='4'; -- 指定字段进行删除
-- TRUNCATE命令,清空一个数据库的表,但表的结构和约束不会变
TRUNCATE `student`;
delete和truncate的相同和区别:
相同:都可以删除数据,但不会破坏表的结构
区别:TRUNCATE 后表的自增会归零,不会影响事务。
-- 查询所有的学生
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;
获取符合条件的数据
-- 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';
连接方式 | 描述 |
---|---|
Inner Join | 如果表中至少有一个匹配,就返回该行 |
Left Join | 从左表中返回左右的值,即使右表中没有匹配 |
Right Join | 从右表中返回所有的值,即使左表中没有匹配 |
使用合适:
SELECT 字段1,字段2,...
FROM 第一个表
连接方式
ON 判断条件
-- 联表查询 参加了考试的同学的学号、姓名、科目编号、分数
/*
分析步骤:
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`;
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` s
LEFT JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`;
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`;
-- 排序 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;
子查询的本质:在 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'
)
)