数据的仓库,里面存储各种数据以及数据之间的关系;数据库是一个软件,组织数据存储的规范、结构、性能。数据库以表的形式存数据。
Mysql:数据库的管理软件、数据库服务器
navicat/SQLyog:客户端。
数据库中用于组织数据、执行指令的概念
(1).表:如何通过SQL指令来操作表以及表中的数据。
(2).视图
(3).存储过程
(4).函数
(5).游标
(6).触发器
主要用来描述实体与实体之间的关系:
实实在在存在的事物:男生和女生、学生和班级、员工和部门
E-R关系图:实体——方框、属性——椭圆、关系——菱形
(1)MySQL:开源免费的适用于中小型企业的免费数据库,sun公司收购了MySQL,sun公司被Oracle收购,Oracle收购之后开始收费了
(2)mariadb:由MySQL创始人搞出来的,直接是MySQL开源版本的一个分支,基本上所有的命令都是一样的。
(3)Oracle:甲骨文公司,收费软件,适用于大型电商网站。
(4)db2:IBM公司,提供解决方案:软件和硬件,服务器架构,银行系统大多采用db2。
(5)SQL server:windows里面,政府网站,并且大学教学通常都是采用SQL verse,图形化工具做的不错。
(6)Sybase:被淘汰了。
mongodb
redis
服务器:就是一台电脑,这台安装相关的服务器软件,这些软件会监听不同的端口号,根据用户访问的端口号,提供不同的服务。
Structer Query Language 结构化查询语言,是一个跟数据库发指令的标准语言,所有的数据库都支持SQL。
(1)SQL的分类
DDL:数据定义语言。比如定义数据库和表的结构,表名、表列,create(创建)、drop(删除)、alter(修改)。
DML:数据操作语言。比如操作表中的数据 insert(插入)、update(修改)、delete(删除)。
DCL:数据控制语言。定义访问权限,取消访问权限、安全设置 grant。、
DQL:数据查询语言:select(查询)from子句、where子句。
MySQL-8.0.21安装:
这已经是我第n次安装数据库软件了,因为以前每做一次课程设计就安装了一次,也踩了很多的坑,所以这次安装还是比较顺利的,由于时间关系,这里只是记录一下自己的用户名和密码,以后有时间再做一个详细的避坑步骤。
密码默认为:空
用户名:root
登录数据库:以管理员方式运行cmd然后输入:mysql -u root -p
(1)直接创建数据库
create database 数据库名字
create database day06;
(2)创建数据库的时候指定字符集
create database 数据库的名字 character set 字符集;
create database day06_2 character set utf8;
(3) 创建数据库的时候指定字符集和校对规则:
create database 数据库的名字 character set 字符集 collate 校对规则;
create database day06_2 character set utf8 collate utf8_bin;
以下是三个原始数据库,不能改动。
information_schema
mysql :存放用户名和密码
performance_schema
(2)查看数据库定义的语句
show create database 数据库的名字;
show create database day06;
修改数据库的字符集:
alter database 数据库的名字 character set 字符集
alter database day06_1 character set utf8;
drop database 数据库名字;
drop database day06;
其他数据库操作命令
1.切换数据库:
use 数据库名字:use day06;
2.查看当前正在使用的数据库:
select database();
(Create)、检索(Retrieve)、更新(Update)和删除(Delete)
create table 表名(
列定义,列定义,列定义
)
列定义:列名 数据类型 约束
create table student(
id int primary key,
name varchar(31),
sex int,
age int
);
Java | SQL |
---|---|
int | int |
char/String | char(固定长度)/varchar(可变长度) |
double | double |
float | float |
Boolean | Boolean |
date | date:YYYY-MM-DD |
、 | time:hh:mm:ss |
、 | datetime:YYYY-MM-DD hh:mm:ss 默认值是null |
、 | timestamp:YYYY-MM-DD hh:mm:ss 默认值是当前时间 |
、 | text:主要用来存放文本 |
、 | blob:存放的是二进制 |
数据表中:列定义 = 列名+数据类型+约束
数据类型限定当前表的这一列能填的数据值,约束限定数据的一些具体的限定。
比如:性别(男女)、身份证(唯一)、紧急联系人(必须要有)
(1)非空约束not null:当前列的值不能为空。
(2)默认约束default:当前列没有值,有一个默认的值
(3)检查约束check:检查当前列的是否符合check的范围。mysql不支持检查约束。
(4)唯一约束unique:当前列的每个值是唯一的,不能重复。
(5)主键约束primaray key :当前列的每一行的唯一标识,非空的,唯一的
(6)外键约束foreign key referecnces:代表的是两张表的关系,当前表的当前列依赖于另一张表的某一列。
Student(sno,sname)
score(sno,score):sno依赖Student.sno。
域完整性:对列做约束(数据类型、非空、默认)
实体完整型:对行之间的关系做约束。(唯一、)
(1)查看所有表:show tables;
(2)查看表的定义:show create table 表名;
(3)查看表的结构:desc 表名;
desc student;
(1)添加列(add):
alter table 表名 add 列名 列的类型 列的约束
alter table student add chengji int not null;
(2)修改列(modify):
alter table student modify sex varchar(2);
(3)修改列名(change):
alter table student change sex gender varchar(2);
(4)删除列(drop):
alter table student drop chengji;
(5)修改表名(rename):
rename table student to xuesheng;
(6)修改表的字符集:
alter table student character set gbk;
drop table 表名;
1.单条插入:
insert into 表名(列名1,列名2)values(值1,值1);
insert into student(sid,sname,sex,age)values(1,‘zhangsan’,1,23);
简单写法:(如果插入是全列名的数据,表后面的列名可以省略,如果插入部分列的话,列名不能省略)
insert into student values(2,‘zhangsan’,1,23);//主键约束不能重复
2.批量插入:
insert into student values(2,‘zhangsan’,1,23),(3,‘zhangsan’,1,23),(4,‘zhangsan’,1,23);//主键约束不能重复
3.单条插入和批量插入的效率:批量插入高。
delete from 表名 where 列 = 值
delete from student where sid=10;
deletae from student;如果没有指定条件,会将表中的数据一条一条全部删除。
面试题:delete删除数据和truncate删除数据的区别:
delete :DML 一条一条删除表中的数据。如果数据比较少,delete比较高效。
truncate:DDL 先删除表再重建表。如果数据比较多,truncate比较高效。
update 表名 set 列名1 = 新的值,列名2 = 新的值 where 列名 = 值
update student set sname=‘王五’,sex=‘1’;(所有行都会修改)
update student set sname=‘王五’,sex=‘0’ where sid=6;
select*/列名 from 表名 where 条件
select [distinct] [*] [列名,列名2] from 表名 [where 条件];
distinct:去除重复的数据。
select * from student;
1.建表:
mysql> create table product(
-> pid int primary key auto_increment,
-> pname varchar(10),
-> price double,
-> pdate timestamp,
-> cno int
-> );
2.插入数据:
mysql> insert into product values(null,'威龙辣条',8,now(),1);
Query OK, 1 row affected (0.04 sec)
mysql> insert into product values(null,'拖鞋',8,now(),1);
Query OK, 1 row affected (0.04 sec)
mysql> insert into product values(null,'毛巾',8,now(),1);
Query OK, 1 row affected (0.04 sec)
3.查看所有商品:
mysql> select * from product;
+-----+--------------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+--------------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
| 3 | 威龙辣条 | 8 | 2020-08-06 17:16:45 | 1 |
| 4 | 拖鞋 | 8 | 2020-08-06 17:17:05 | 1 |
| 5 | 毛巾 | 8 | 2020-08-06 17:17:22 | 1 |
+-----+--------------+-------+---------------------+------+
4.查看商品名称和价格:
mysql> select pname,price from product;
+--------------+-------+
| pname | price |
+--------------+-------+
| 小米11 | 998 |
| 小米11 | 998 |
| 威龙辣条 | 8 |
| 拖鞋 | 8 |
| 毛巾 | 8 |
+--------------+-------+
as 的关键字,as关键字可以省略
——表别名:select p.pname,p.price from product as p;(主要用于多表查询);
select p.pname,p.price from product p;
——列别名:select pname as 商品名称,price as 商品价格 from product;
select pname 商品名称,price 商品价格 from product;
mysql> select distinct price from product;
+-------+
| price |
+-------+
| 998 |
| 8 |
+-------+
mysql> select *,price*1.5 from product;
+-----+--------------+-------+---------------------+------+-----------+
| pid | pname | price | pdate | cno | price*1.5 |
+-----+--------------+-------+---------------------+------+-----------+
| 1 | 小米11 | 998 | NULL | 1 | 1497 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 | 1497 |
| 3 | 威龙辣条 | 8 | 2020-08-06 17:16:45 | 1 | 12 |
| 4 | 拖鞋 | 8 | 2020-08-06 17:17:05 | 1 | 12 |
| 5 | 毛巾 | 8 | 2020-08-06 17:17:22 | 1 | 12 |
+-----+--------------+-------+---------------------+------+-----------+
指定条件,确定要操作的记录
查看商品价格>60元的所有商品信息
mysql> select * from product where price>60;
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
+-----+----------+-------+---------------------+------+
——where后的条件写法:
(1)关系运算符:< < > >= = != <>
<>:不等于 标准SQL语法
!=:不等于 非标准SQL语法
(2)逻辑与算法:and ,or,not
查询商品价格在60到10000之间的商品:
mysql> select * from product where price>60 and price<10000;
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
+-----+----------+-------+---------------------+------+
2 rows in set (0.00 sec)
mysql> select * from product where price between 60 and 1000;
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
+-----+----------+-------+---------------------+------+
_:代表的是一个字符串。
%:代表的是多个字符串。
(1)查询出名字中带有“小”
mysql> select * from product where pname like '%小%';
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
+-----+----------+-------+---------------------+------+
(2)查询第二个字是米的所有商品:’_米%’
mysql> select * from product where pname like '_米%';
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
+-----+----------+-------+---------------------+------+
(3)in 在某个范围内获得值
查询出商品分类ID在,1,4,5里面的所有商品
mysql> select * from product where cno in (1,4,5);
+-----+--------------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+--------------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
| 3 | 威龙辣条 | 8 | 2020-08-06 17:16:45 | 1 |
| 4 | 拖鞋 | 8 | 2020-08-06 17:17:05 | 1 |
| 5 | 毛巾 | 8 | 2020-08-06 17:17:22 | 1 |
+-----+--------------+-------+---------------------+------+
asc :ascend 升序(默认的排序方式)
desc :descend 降序
查询所有商品,按价格进行降序排序:
mysql> select * from product order by price desc;
+-----+--------------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+--------------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
| 3 | 威龙辣条 | 8 | 2020-08-06 17:16:45 | 1 |
| 4 | 拖鞋 | 8 | 2020-08-06 17:17:05 | 1 |
| 5 | 毛巾 | 8 | 2020-08-06 17:17:22 | 1 |
+-----+--------------+-------+---------------------+------+
(1)sum():求和
获得所有商品价格的总和
mysql> select sum(price) from product;
+------------+
| sum(price) |
+------------+
| 2020 |
+------------+
1 row in set (0.00 sec)
(2)avg():求平均值
mysql> select avg(price) from product;
(3)count():统计数量
mysql> select sum(*) from product;
(4)max():最大值
(5)min():最小值
注意:where 条件后面不能接聚合函数
查出商品价格大于平均价格的所有商品
引入子查询
mysql> select * from product where price > (select avg(price) from product);
+-----+----------+-------+---------------------+------+
| pid | pname | price | pdate | cno |
+-----+----------+-------+---------------------+------+
| 1 | 小米11 | 998 | NULL | 1 |
| 2 | 小米11 | 998 | 2020-08-06 17:13:10 | 1 |
(1)根据con字段分组,分组后统计商品的个数
mysql> select cno,count(*) from product group by cno;
+------+----------+
| cno | count(*) |
+------+----------+
| 1 | 5 |
+------+----------+
(2)根据cno分组,分组统计每组商品价格,并且商品价格>60
mysql> select cno,avg(price) from product group by cno having avg(price)>60;
+------+------------+
| cno | avg(price) |
+------+------------+
| 1 | 404 |
+------+------------+
having关键字可以直接接聚合函数,出现在分组之后;where 关键字它是不可以接聚合函数,出现在分组之前
select查询语句执行顺序总结:
编写顺序:
S…F…W…G…H…O
select…from…where…group by…having…order by
执行顺序;
F…W…G…H…S…O
from…where…group by…having…select…order by