本篇主要内容如下:
一、安装 MySQL
搜索 phpStudy V8.1 ,下载大约 78m 左右:官网下载地址点击下载
phpStudy 可以随时升级和更换 mysql 版本,安装其他常用插件。而且 phpStudy 对于数据库的移植,备份,启动,操作等等都特别方便。
安装完 phpStudy 后会在 D 盘解压一个文件夹 phpstudy_pro,将来如果有需要可以直接考走
MySQL 的默认账户与密码分别是 root root
启动数据库后,在左侧导航栏数据库中点击操作可以修改数据库密码。
二、数据库管理工具
phpStudy 默认自带一个好用的 MySQL 管理工具 HeidiSQL,不想安装 SQLyog 或 Navicat 数据库管理工具的可以使用它。
点击管理,输入基本信息即可连接数据库。
当然也可以使用 SQLyog 管理数据库:下载地址打开 SQLyog,新建一个连接,填入相关信息,即可在 JspStudy 的 MySQL 启动的情况下连上数据库
还可以使用 idea 连接 MySQL
三、数据库
数据库作为数据表存储的基本单位,即一个数据库存储一张和多张表,同一个数据库中数据表可以关联查询。一般的,在实际开发中每个项目都会使用独立的一个数据库,一个项目也不建议连接多个数据库。在 SQL 窗口输入命令并点击执行,会创建一个名字叫 mydb 的数据库。
CREATE DATABASE mydb
当再次执行时会报错,数据库 mydb 已经存在(exists)
错误代码: 1007
Can't create database 'mydb'; database exists
使用命令查看所有的数据库
SHOW DATABASES
删除数据库
DROP DATABASE mydb;
使用数据库,方便在数据库中创建表。
USE mydb;
四、表操作
数据库中每列数据的标识叫字段,表操作一般就是针对字段的操作。创建表时一般会有一个或多个字段,它们之间用逗号隔开。数据库中最常用的两种字段类型为 int 和 char 分别用于存储整数和字符串类型的数据,char 类型后需要指定存储的字符个数。
CREATE TABLE mytb (
id INT,
name CHAR(5)
);
创建完表后可以使用 desc 表名查看表结构。
字段的增删改操作,下面 SQL 演示如何操作字段
ALTER TABLE mytb DROP id; 删除字段
ALTER TABLE mytb ADD ids INT; 增加字段
ALTER TABLE mytb ADD id INT FIRST; 添加一个字段在最前面
ALTER TABLE mytb ADD sex INT AFTER name; 增加一个字段在 name 后
ALTER TABLE mytb MODIFY name CHAR(10);修改 name 字段的长度为 10
ALTER TABLE mytb MODIFY ids BIGINT NOT NULL DEFAULT 100;修改 ids 字段的属性为 long 不为空默认值为 100
修改表名为 mytable
ALTER TABLE mytb RENAME TO mytable;
刪除表 mytable
DROP TABLE mytable
注意:
删除表有 drop,truncate,delete 三种操作,他们的区别如下:
drop:删除数据和表结构,释放空间。
drop table user;
truncate:保留表结构,删除数据,释放空间。
truncate table user;
delete:保留表结构,删除数据,不释放空间。
delete from user;
三者的执行速度,一般来说:drop > truncate > delete
释放空间可以体现在:
1.通过 delete 删除的行数据是不释放空间的,如果表 id 是递增式的话,那么表数据的 id 就可能不是连续的;而通过 truncate 删除数据是释放空间的,如果表 id 是递增式的话,新增数据的 id 又是从头开始,而不是在已删数据的最大 id 值上递增。
2.使用 delete 删除数据时,mysql 并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间。被删除的数据将会被保存在一个链接清单中,当有新数据写入的时候,mysql 会利用这些已删除的空间再写入。即,删除操作会带来一些数据碎片,正是这些碎片在占用硬盘空间。
五、数据的增删改查
数据库的每条数据通常称为一条记录,记录的常用操作通常就是增删改查,往数据表中插入记录使用如下语法:
INSERT INTO table [(字段名 [, 字段名...])]
VALUES (value [, value...]);
注意:
插入的数据应与字段的数据类型相同。
数据的大小应在列的规定范围内,例如:不能将一个长度为 80 的字符串加入到长度为 40 的列中。
在 values 中列出的数据位置必须与被加入的列的排列位置相对应。 字符和日期型数据应包含在单引号中。
插入空值,不指定或 insert into table value(null) 即可插入空值。
示例:
INSERT INTO `emp` (`name`,`sal`) VALUES ('张三',10000.5);
修改记录
修改数据表中记录使用如下语法:
UPDATE table_name SET 字段名1=expr1 [, 字段名2=expr2 ...] [WHERE where_definition]
注意:
- UPDATE 语法可以用新值更新原有表行中的各列。
- SET 子句指示要修改哪些列和要给予哪些值。
- WHERE 子句指定应更新哪些行。如没有 WHERE 子句,则更新所有的行。
示例:
UPDATE emp SET `name` ='李四'
UPDATE emp SET `name`='王二' WHERE `id` = 1;
UPDATE emp SET `name`='王二',`sal`=16.5 WHERE `id` = 1;
UPDATE emp SET `name`='王二',`sal`=16.5 WHERE `id` IN(1,3,5);
注意:如果在数据修改时,该表的全部字段相同,修改命令发送时会导致多条数据被修改。同时 SQLYog 会弹窗。所以为了避免这种问题数据库各大厂商提出数据库三大范式作为约束。
删除记录
删除数据表的数据使用如下语法:
delete from table_name [WHERE where_definition]
注意:
- 如果不使用 where 子句,将删除表中所有数据。
- 使用 delete 语句仅删除记录,不删除表本身。
- 如要删除表,使用 drop table 语句。
示例:
delete from `emp` where id = 1;
简单查询
查询数据表数据一般使用如下语法:
SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3..} FROM table;
参数:
- Select 指定查询哪些列的数据。
- *号代表查询所有列,在实际开发中很少用 *,它会增加查询的负担。
- From 指定查询哪张表。
- DISTINCT 可选,指显示结果时,是否剔除重复数据
示例:
SELECT * FROM `emp`;
SELECT `name`,`sal` FROM `emp`;
SELECT DISTINCT `name`,`sal` FROM `emp`;
练习:
1.创建数据库 user 并在 user 库中创建表 user (int id,String name,int age,String password),并往数据库中插入 3 条如下记录。
User{id=1,name=‘张三’,password=‘123456’}
User{id=2,name=‘李四’,password=‘123456’}
User{id=3,name=‘王二’,password=‘123456’}
2.将上面 id 为 1 的密码改为:abc123。
3.删除密码为 123456 的全部用户。
4.在 user 表中增加一个整数类型的字段 age 在 name 后,并插入数据。
User{id=4,name=‘麻子’,password=‘123456’,age=12}
参考代码:
CREATE DATABASE `user`;
CREATE TABLE `user`( `id` INT, `name` CHAR(10), `password` CHAR(10) );
INSERT INTO `user` (`id`, `name`, `password`) VALUES ('1', '张三', '123456');
INSERT INTO `user` (`id`, `name`, `password`) VALUES ('2', '李四', '123456');
INSERT INTO `user` (`id`, `name`, `password`) VALUES ('3', '王二', '123456');
UPDATE `user` SET `password` = 'abc123' WHERE `id` = '1';
DELETE FROM `user`.`user` WHERE `password` = '123456';
ALTER TABLE mytb ADD age INT AFTER name;
INSERT INTO `user` (`id`, `name`, `password`,`age`) VALUES ('4', '麻子', '123456',12);
六、别名运算符和排序
在查询过程中,使用原字段的名称有时候不太方便,MySQL 提供别名处理这样的情况。
SELECT 字段名 AS 别名 FROM 表名;
AS 可以省略
示例:
SELECT `name` 姓名,`sal` 薪水 FROM `emp`;
注意:别名处可以不使用单引号,但是为了不和数据库的一些关键字冲突建议所有表名、字段名都加上数据库专用单引号(一般位于 tab 键上方)。
运算符
在 WHERE 子句中经常使用相关的运算符,常见运算符有比较运算符、逻辑运算符等。
比较运算符
> < <= >= = <>/!= 大于、小于、大于(小于)等于、不等于
BETWEEN ...AND... 显示在某一区间的值(含头含尾)
IN(set) 显示在 in 列表中的值,例:in(100,200)
LIKE ‘%张_’ 模糊查询
IS NULL 判断是否为空(is not null)
LIKE 语句中,% 代表零个或多个任意字符,_ 代表一个字符。
示例:
name LIKE ‘_a%' 表示第二个字符为 a 的人
name like '张%' 姓张的所有人
name like '_伟' 所有姓名为两个字且第二个字为 “伟”
name like '%商%' 姓名中包含 “商”字
name like '%友' 姓名以“友”结尾
逻辑运算符
and 多个条件同时成立
or 多个条件任一成立
not 不成立,例:where not(salary>100);
示例:
SELECT `id`, `name`,`sal` FROM `emp` WHERE id > 1;
SELECT `id`, `name`,`sal` FROM `emp` WHERE id BETWEEN 1 AND 3;
SELECT `id`, `name`,`sal` FROM `emp` WHERE `name` IS NULL;
SELECT `id`, `name`,`sal` FROM `emp` WHERE `name` LIKE '%王%' AND id = 1;
排序
排序的列即可是表中的列名,也可以是 SELECT 语句后指定的列名。
ASC 升序、DESC 降序
ORDER BY 子句应位于 SELECT 语句的结尾。
案例:
SELECT `id`, `name`,`sal` FROM `emp` WHERE `id` > 0 ORDER BY `name` ASC ;
SELECT * FROM `mytabe` ORDER BY `sex` DESC,`id` DESC
七、数据库三大范式(自学)
第一范式(1NF): 字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF): 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键。 实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言 之,第二范式就是非主属性非部分依赖于主关键字。
第三范式(3NF): 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 所以第三范式具有如下特征: 1,每一列只有一个值 2,每一行都能区分。 3,每一个表都不包含其他表已经包含的非主关键字信息。 例如,帖子表中只能出现发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
章节练习:(默写 10 分钟)
数据准备:
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
insert into student(id,name,chinese,english,math) values(1,'张小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李进',67,98,56);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,90);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);
作业:
1.查询表中所有学生的全部信息。
2.查询表中所有学生的姓名和对应的英语成绩。
3.过滤表中英语重复数据。
4.查询时在所有学生数学分数上加10分特长分。
5.统计每个学生的总分。
6.使用别名表示学生分数。
7.查询姓名为王五的学生成绩
8.查询英语成绩大于90分的同学
9.查询总分大于200分的所有同学
10.查询英语分数在 80-90之间的同学。
11.查询数学分数为89,90,91的同学。
12.查询所有姓李的学生成绩。
13.查询数学分>80,语文分>80的同学。
14.对数学成绩降序输出。
15.对总分排序后输出,然后再按从高到低的顺序输出
16.对姓李的学生成绩排序输出
参考答案:
1.查询表中所有学生的全部信息。
mysql>SELECT * FROM student;
2.查询表中所有学生的姓名和对应的英语成绩。
mysql>SELECT name,english FROM student;
3.过滤表中英语重复数据。
mysql>SELECT DISTINCT english FROM student;
4.在所有学生数学分数上加10分特长分。
mysql>SELECT name,math+10 FROM student;
5.统计每个学生的总分。
mysql>SELECT name,chinese+english+math FROM student;
6.使用别名表示学生分数。
mysql>SELECT name AS 姓名,chinese+english+math 总分 FROM student;
7.查询姓名为王五的学生成绩
mysql>SELECT * FROM student WHERE name='王五';
8.查询英语成绩大于90分的同学
mysql>SELECT * FROM student WHERE english>90;
9.查询总分大于200分的所有同学
mysql>SELECT name AS 姓名,chinese+english+math 总分 FROM student WHERE (chinese+english+math)>200;
10.查询英语分数在 80-90之间的同学。
mysql>SELECT name,english FROM student WHERE english BETWEEN 80 AND 90;
11.查询数学分数为89,90,91的同学。
mysql>SELECT name,math FROM student WHERE math IN (89,90,91);
12.查询所有姓李的学生成绩。
mysql>SELECT * FROM student WHERE name LIKE '李%';
13.查询数学分>80,语文分>80的同学。
mysql>SELECT * FROM student WHERE math>80 AND chinese>80;
14.对数学成绩排序后输出。
mysql>SELECT name,math FROM student ORDER BY math;
15.对总分排序后输出,然后再按从高到低的顺序输出
mysql>SELECT name 姓名,chinese+english+math 总分 FROM student ORDER BY 总分 DESC;
16.对姓李的学生成绩排序输出
mysql>SELECT name 姓名,chinese+english+math 总分 FROM student WHERE name LIKE '李%' ORDER BY 总分;