MySQL数据模型
关系型数据库,是指采用了关系模型来组织数据的数据库。
总结:通过多张表互相建立连接的数据库称之为关系型数据库
关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。
-
关系型数据库以行(row)和列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)。
-
表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系型数据库,就是建立在关系模型基础上的数据库。
-
SQL 就是关系型数据库的查询语言。
数据库 、数据表、数据之间的关系
总结:
1、数据库管理系统对数据库进行管理
2、数据库管理系统可对多个数据库进行管理
3、数据库内部包含多个数据表
4、数据表内部包含多个数据
5、总体呈现树结构的模式
SQL简介通用语法分类
SQL:结构化查询语言,操作关系型数据库的编程语言
SQL通用语法
大小写规范 (建议遵守)
-
MySQL 在 Windows 环境下是大小写不敏感的**
-
MySQL 在 Linux 环境下是大小写敏感的
-
数据库名、表名、表的别名、变量名是严格区分大小写的
-
关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
-
-
推荐采用统一的书写规范:
-
数据库名、表名、表别名、字段名、字段别名等都小写
-
SQL 关键字、函数名、绑定变量等都大写
-
通用语法总结:
1、sql语句可以单行也可多行 以分号为结尾( ;)
2、mysql 不区分大小写 关键字建议大写;
3、MySQL 数据库注释
3.1 单行注释 采用 # 或者-- 作为单行注释
3.2 多行注释 采用 作为多行注释,同Java相同
MySQL代码:
SHOW DATABASES;#查询所有数据库 单行注释 show DATABASES;
MySqL分类
图例展示
总结:
1、DDL 对数据库和数据表进行操作
主要的语句关键字包括CREATE、DROp、ALTER等。
2、DML 对数据进行增删改
主要的语句关键字包括INSERT、DELETE、UPDATE、SELECT等。
3、DQL对数据库进行查询
SELECT是SQL语言的基础,最为重要。
4、DCL对数据库进行权限控制
主要的语句关键字包括GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。
DDL 对数据库进行操作
DDL操作
代码
查询
SHOW DATABASES; #查询数据库
创建数据库 (外加判断)
创建数据库并指定字符集
CREATE DATABASE test1; #创建数据库 CREATE DATABASE if not EXISTS test1; #创建数据库 如果数据库test1不存在 CREATE DATABASE 数据库名 CHARACTER SET 字符集; # 显示的指明了要创建的数据库的字符集
注意点:
DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。
要注意的事项: 在5.7中编码默认是拉丁的需要需改成utf8 在8.0中编码默认是utf8的 但是在企业中大部分使用的还是低版本 所以推荐在创建数据库的时候指明字符集 # 推荐的写法 create database if not exists mytest1 character set 'utf8'; #如果创建的库已经存在并且还要使用新的字符集字符集 create database if not exists mytest1 character set 'gbk'; #并不会报错,其并不会覆盖原来的内容且字符集也没有变化
删除数据库
DROP DATABASE test1; # 删除数据库 drop DATABASE if EXISTS test1; # 删除数据库前进行判断
使用 或者 切换数据库
SELECT DATABASE(); #查看当前使用的数据库 use test1; #使用数据库
DDL对数据库 数据表进行查询 练习
#查询数据库 SHOW DATABASES; #创建数据库 CREATE DATABASE test1; #创建数据库 如果数据库test1不存在 CREATE DATABASE if not EXISTS test1; # 删除数据库 DROP DATABASE test1; # 删除数据库前进行判断 DROP DATABASE if EXISTS test1; #查看当前使用的数据库 select DATABASE(); # 使用数据库 USE test1;
DDL操作数据表
查询表
代码:
#查询表 #1、进入(使用)表 #2、查询表 #3、查询表结构 USE mysql; #使用表 SHOW TABLES; #查询表 desc func; #查询表结构
其中,各个字段的含义分别解释如下:
-
Field:表示字段名称。
-
Type:表示字段类型,这里 barcode、goodsname 是文本型的,price 是整数类型的。
-
Null:表示该列是否可以存储NULL值。
-
Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
-
Default:表示该列是否有默认值,如果有,那么值是多少。
-
Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
DDL操作表 ————创建表语法
案例
代码
#创建表
#使用test1数据库
use test1;
#创建表tb_user
CREATE TABLE tb_user(
id INT,
username VARCHAr(20),
PASSWORD VARCHAr(20)
);
#展示表
SHOW TABLES;
#展示表结构
desc tb_user;
CREATE TABLE [IF NOT EXISTS] 表名(
字段1 数据类型 [约束条件] [默认值],
字段2 数据类型 [约束条件] [默认值],
字段3 数据类型 [约束条件] [默认值],
……
字段n 数据类型 # 最后一个字段且该字段后边没有内容不能加逗号
[表约束条件]
);
创建表方式2
-
使用 AS subquery 选项,将创建表和插入数据结合起来
-
指定的列和子查询中的列要一一对应
-
通过列名和默认值定义列
举例:
# 创建的A表不是空表 有B的所以信息 CREATE TABLE A AS SELECT * FROM B; # 创建的A是空表,但是表字段和B保持一致 CREATE TABLE A AS SELECt * FROM B WHERe 1=2; # 创建的表还可以是其他表的一部分数据 CREATE TABLE A AS SELECt B_id, B_name, B_salary FROM B WHERe B_id = 80; #在通过as方式创建表的时候还可以是其他库中的表 create table 表 as select * from 库名.表名;
DDL 数据表的数据类型
数据类型分类
1、数值类
2、字符串类
3、时间日期类
SQL数据类型
注意点:
数据类型
1、char()定长字符串
2、varchar() 变长字符串
定长变长区别:
char存储性能高,浪费空间
varchar()存储性能低,节约空间
| 类型 | 特点 | 空间上 | 时间上 | 适用场景 |
|---|---|---|---|---|
| CHAr(M) | 固定长度 | 浪费存储空间 | 效率高 | 存储不大,速度要求高 |
| VARCHAr(M) | 可变长度 | 节省存储空间 | 效率低 | 非CHAR的情况 |
3、Double(总长度,小数点后保留的位数)
**FLOAT(M,D)或DOUBLE(M,D)。这里,M称为精度,D称为标度。(M,D)中 M=整数位+小数位,D=小数位。(总长度,小数点后保留的位数)例如:(5,2) ,100.00**
案例:
代码:
create TABLE student( id INT, NAME VARCHAr(10), gender CHAr(1), birthday DATE, score double(5,2), email VARCHAr(64), tellphone varchar(15), stus TINYINT );
DDL操作表 修改查询
删除表
代码:
drop TABLE tb_user; drop table if EXISTS tb_user;
修改表
代码:
#修改表 #查询表结构 desc stu; #查询表结构 desc student; #修改表名 alter table stu RENAME to student; #新增列 alter table student add address VARCHAr(30); #修改数据类型 alter table student MODIFY address char(30); #修改列名和数据类型 alter table student CHANGE address addr varchar(20); #删除列 alter table student drop addr;
DML表中数据 增删改
DML表中数据 (增)
增加
举例代码:
insert into stu VALUES(1,'张三','男','1999-10-10',99.99,'123@qq.com','123321',1);
修改数据
举例代码:
UPDATE stu set gender='女'WHERe name='张三';
删除数据
举例代码:
DELETE from stu WHERe NAME='张三';
DQL查询
案例代码:
-- 删除stu表 drop table if exists stu; -- 创建stu表 CREATE TABLE stu ( id int, -- 编号 name varchar(20), -- 姓名 age int, -- 年龄 sex varchar(5), -- 性别 address varchar(100), -- 地址 math double(5,2), -- 数学成绩 english double(5,2), -- 英语成绩 hire_date date -- 入学时间 ); -- 添加数据 INSERT INTO stu(id,NAME,age,sex,address,math,english,hire_date) VALUES (1,'马运',55,'男','杭州',66,78,'1995-09-01'), (2,'马花疼',45,'女','深圳',98,87,'1998-09-01'), (3,'马斯克',55,'男','香港',56,77,'1999-09-02'), (4,'柳白',20,'女','湖南',76,65,'1997-09-05'), (5,'柳青',20,'男','湖南',86,NULL,'1998-09-01'), (6,'刘德花',57,'男','香港',99,99,'1998-09-01'), (7,'张学右',22,'女','香港',99,99,'1998-09-01'), (8,'德玛西亚',18,'男','南京',56,65,'1994-09-02');
基础查询
代码:
SELECT name,age FROM stu;#查询name age 列数据 select * FROM stu; #查询列表所有数据 SELECt DISTINCT address FROM stu; #去除重复 distinct SELECt name as 姓名,math as 数学成绩,english as 英语成绩 FROM stu;
基础查询
1、查询多个字段
#查询name age 列数据
select name,age from stu;
#查询当前列表所有数据
select * from stu;
关键字 distinct 去除重复
SELECt DISTINCT address FROM stu; #去除重复distinct
distinct 必须写在所有列的前面
关键字 As 起别名
SELECt name as 姓名,math as 数学成绩,english as 英语成绩 FROM stu;
条件查询
代码:
-- 1.查询年龄大于等于20岁的学员信息 SELECt * from stu WHERe age >=20; -- 2.查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息 select * FROM stu WHERe age>=20&&age<=20; SELECt *from stu where age BETWEEN 20 and 30 ; -- 3. 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息 SELECt* from stu WHERe age=18 || age =20||age = 22; SELECt * from stu WHERe english is null; #查询英语成绩成绩为null的同学 select * from stu where english is null; #查询英语成绩成绩不为null的同学 select * from stu WHERe english is not null; **练习** -- 查询年龄大于20岁的学员信息 -- 查询年龄大于等于20岁的学员信息 -- 查询年龄大于等于20岁 并且 年龄 小于等于 30岁 的学员信息 -- 查询入学日期在'1998-09-01' 到 '1999-09-01' 之间的学员信息 -- 查询年龄等于18岁的学员信息 -- 查询年龄不等于18岁的学员信息 -- 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息 -- 查询英语成绩为 null的学员信息 SELECt * FROM stu; select * from stu where age>20; select* from stu WHERe age >=20; select * from stu where age BETWEEN 20 and 30; select * from stu where hire_date BETWEEN '1998-09-01'AND'1999-09-01'; SELECt * from stu WHERe age = 18; select * from stu where age !=18; select * from stu WHERe age in(18,20,22); select * from stu where english is NULL;
模糊查询
模糊查询
通配符
1、_:代表单个任意字符;
2、%:代表任意个字符;
#模糊查询 #查询姓马的同学 select * from stu WHERe name like '马%'; #查询名字中有花(包含花)的同学 select * from stu WHERe name like '_花%'; #查询名字中包含德的同学信息 select * from stu WHERe name like '%德%';
排序查询
代码:
-- 1.查询学生信息,按照年龄升序排列 #ASC 升序(默认排序方式) 升序从低往高 #DESC 降序 降序 从高往低 select * from stu ORDER BY age ASC; -- 2.查询学生信息,按照数学成绩降序排列; select * from stu ORDER BY math DESC; -- 3.查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列 select * from stu ORDER BY math DESC,english ASC;
聚合函数
注意:null 值不参与聚合函数运算
-- 1.统计班级一共有多少学生 SELECt COUNT(*)FROM stu; -- 2.查询数学成绩的最高分 select MAX(math) FROM stu; -- 3.查询数学成绩的最低分 select MIN(math) FROM stu; -- 4.查询数学成绩的总分 select SUM(math)FROM stu; -- 5.查询数学成绩的平均分 SELECt AVG(math) FROM stu; -- 6.查询数学成绩的最低分 select MIN(english) FROM stu;
分组查询
代码:
#查询男同学女同学各自的数学平均分 select sex ,avg(math)FROM stu GROUP BY sex; #查询男同学女同学各自的数学平均分,以及各自人数 SELECt sex,COUNT(*),avg(math) FROM stu GROUP BY sex; #查询男同学女同学各自的数学平均分,以及各自人数,要求:分数低于70分不参与分组 select sex,avg(math),COUNT(*) from stu WHERe math >70 GROUP BY sex; #查询男同学女同学各自的数学平均分,以及各自人数,要求:分数低于70分不参与分组,分组之后人数大于2人的 select sex,avg(math),COUNT(*)from stu where math>70 GROUP BY sex HAVINg COUNT(*)>2;
where 和 Having 的区别
1、where 是在分组之前进行限定的,不符合条件的,不参与分组 having是分组后进行过滤的
2、where 不能对聚合函数判断,having 可进行聚合函数判断
执行顺序
Where > 聚合函数 > Having
分页查询
代码:
-- 1. 从0开始查询,查询3条数据 select * from stu LIMIT 0,3; -- 2. 每页显示3条数据,查询第1页数据 select * from stu LIMIT 0,3; -- 3. 每页显示3条数据,查询第2页数据 SELECt * from stu LIMIT 3,3; -- 4. 每页显示3条数据,查询第3页数据 select * from stu LIMIT 6,3; # 总结 起始索引 =(当前页码-1)*每页显示数据的条数
总结 :
分页查询:
起始索引 =(当前页码-1)* 每页显示的条目数
起始索引:从0开始;
知识拓展:
WEB介绍
总结:Javaweb 总体由3个部分组成
1、网页 : 页面展示
2、web程序 :逻辑处理
3、数据库:存储数据



