数据库简介
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、数据库:存储数据