数据库
概述:数据库是数据的仓库
与普通的数据仓库不同的是,数据库依据数据结构来组织数据,因为数据结构的存在,所以看到的数据时条理化的
数据库和普通文件系统的区别在与:数据库拥有数据结构,能都快速查找对应的数据
常说的XX数据库,其实就是XX数据库管理系统:数据库管理系统是一个软件,是数据库服务的体现
根据数据结构的不同,数据库分为关系型数据库和非关系型数据库
数据库分为关系型数据库和非关系型数据库
- 关系型数据库
依据关系模型创建数据库,关系模型就是一对一,一对多,多对多等关系模型,关系模型就是存储格式是以行列组成的二维表格,所以一个关系型数据库就是由二维表之间的联系所组成的一个数据组织
关系型数据库可以很好的存储一些关系模型的数据,比如老师对应学生的数据(“多对多”),一本书对应多个作者(“一对多”),一个人对应一个身份证号码(“一对一”)
- 非关系型数据库
由于关系型太大和复杂,所以一般使用“非关系型数据”来表示其他类型的数据库
非关系型的模型比如:
列模型:存储的数据是一列一列,关系型数据库以一行作为一个记录,列模型数据库以一列为一个记录
键值对模型:存储的数据是一个个键值对,比如name:lisi
文档类模型:以一个个文档来存储数据,类似于键值对
SQL分类
- DDL
数据定义语言 - Data Definition Language
用来定义数据库的对象,如数据表、视图、索引等
- DML
数据处理语言 - Data Manipulation Language
在数据库表中更新,增加和删除记录
如 update, insert, delete
- DCL
数据控制语言 – Data Control Language
指用于设置用户权限和控制事务语句
如grant,revoke,if…else,while,begin transaction
- DQL
数据查询语言 – Data Query Language
mysql基础语句
创建数据库:
CREATE DATABASE [IF NOT EXISTS] db_name
显示数据库语句:
SHOW DATABASES
显示数据库创建语句:
SHOW CREATE DATABASE db_name
数据库删除语句:
DROP DATABASE [IF EXISTS] db_name
切换数据库:
use db_name;
查看当前使用的数据库
select database();
mysql中不允许修改数据库名!
MySQL数据类型
mysql支持所有标准SQL数值数据类型
TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER、BIGINT、FLOAT、DOUBLE、DECIMAL
字符串类型 主要是:varchar和char
创建一张表
create table if not exists test(
id int not null AUTO_INCREMENT,
name varchar(255) not null,
age int, sex varchar(10),
clazz varchar(255) not null,
PRIMARY KEY(id))engine=InnoDB default charset=utf8;
如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据表时如果输入该字段的数据为NULL ,就会报错。
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
-- 添加列
alter table student
add job varchar(255) DEFAULT "没有工作";
-- 查看表结构
desc student;
-- 删除
alter table student drop clazz;
-- 表的修改,不能作添加
alter table student MODIFY age VARCHAR(255);
desc student;
alter table student MODIFY age int(10);
-- 修改表的字段名称
alter table student change age gender VARCHAR(255);
alter table student change gender age INT(11);
-- 添加数据insert
-- 格式:insert into 表名(字段1,字段2...字段n) values(值1,值2..值n),values(值1,值2..值n)
insert into student (name,age,sex) VALUES('zs',80,'男'),('ls',28,'男'),
('zs',80,'男'),('ls',28,'男'),('zs',80,'男'),('ls',28,'男'),
('zs',80,'男'),('ls',28,'男'),('zs',80,'男'),('ls',28,'男'),
('zs',80,'男'),('ls',28,'男');
-- 查询语句
select id,name,age,sex,job from student;
select * from student;
-- where子句用于筛选过滤
-- select 字段 from 表名 where ;
select * from student WHERE name='ls';
select * from student WHERE name='zs';
-- between ...and... 显示在某一区间的值,范围之间
select * from student where age BETWEEN 18 and 30;
-- in(set) 显示在in列表中的值,例:in(100,200),两个值之间
select * from student where age in(18,25);
-- like '张_' 模糊查询 使用% 和 _
SELECT * from student WHERE name like 'l_';
-- Is null 判断是否为空
SELECT * from student where age is not null;
SELECT * from student where age is null;
-- and 多个条件同时成立
select *from student where age=28 and name ='ls';
-- or 多个条件任一成立
-- not 不成立,例:where not(expection>10000);
select * from student where not(age<38);
-- limit 分页
-- limit 开始查询位置,查询的数量;
select * from student limit 5,5;
-- update DELETE 删除
-- 格式:delete student where;
DELETE from student;
select * from student;
delete from student where name='ww';
-- update 修改
-- 格式:update 表名 set 字段1=xx,字段2=xx...字段3=xx;
update student set sex='女' WHERE name='zs';
-- order by 排序默认是升序asc可以不写,降序是desc
select *from student order by age asc;
-- 年龄最大的前两个
select *from student ORDER BY age desc limit 0,2;
-- from select order by limit 执行顺序
SELECT * from student;
-- DISTINCT 字段1.字段2
-- 去重
-- 注意:字段只能写在DISTINCT后面当做去重来用,不能单独显示
SELECT DISTINCT name from student;
-- 求有多少行 行==一条记录(一条数据)
select count(name) from student;
select COUNT(sex) from student;
-- Sum函数返回满足where条件的行的和,仅对数值起作用,其他结果都是0
SELECT SUM(age) from student;
-- AVG函数返回满足where条件的一列的平均值
SELECT AVG(age) from student;
create table if not exists person(
id int(11) not null,
name VARCHAR(255) not null,
address01 VARCHAR(255),
address02 VARCHAR(255),
PRIMARY KEY(id))engine=InnoDB default charset=utf8;
select * from person;
INSERT INTO person (id,name,address01,address02) VALUES(1002,'ls','浙江','温州');
-- 拼接 -
-- CONCAT(str1,str2,...)
select id,name,CONCAT(address01,address02)from person;
-- CONCAT_WS(separator,str1,str2,...)
select id,name,CONCAT_ws(':',address01,address02)from person;
-- 时间操作
-- 获取时间
SELECT CURRENT_DATE();
select CURRENT_TIMESTAMP()
-- 时间转str
-- DATE_FORMAT(date,format)
select DATE_FORMAT(CURRENT_DATE(),'%Y:%m:%d');
-- str->date
-- '2021-09-04'
-- 需要格式匹配
select STR_TO_DATE('2021-09-04','%Y-%m-%d');
-- 时间相加减
-- 时间相减
-- DATEDIFF(expr1,expr2)
select DATEDIFF('2021-09-02','2021-09-03');
-- interval时间相加
-- DATE_ADD(date,INTERVAL expr unit)
select DATE_ADD('2021-09-03',INTERVAL +20 day)
-- 保留小数
-- SELECT ROUND(1)四舍五入
-- SELECT ROUND(1.2,0),后面是保留小数的个数
-- 向上取整 CEIL(X)
-- select CEIL(1.2)
-- 向下取整 FLOOR(X)
-- 分组,有几组数据就显示几条,默认每组第一条
select * from student group by sex;
select *from student GROUP BY job;
select MIN(age),name,id,sex,job from student GROUP BY sex;
SELECT MAX(age) from student;
-- 子查询
select * from student where age=(SELECT MAX(age) from student);
-- 筛选where having
-- 可以做普通的筛选
select * from student where age >20;
select * from student having age >20;
-- select max(age) as c from student where age=c;
-- select max(age) as c from student having age=c;
-- 执行顺序from->group by->select->where/having
-- where不能识别聚合函数
select count(*) as c,sex from student GROUP BY sex where c>3;
select count(*) as c,sex from student GROUP BY sex HAVING c>3;
-- 执行顺序from->where->SELECT
select id,name,sex from student where job='a';
-- from->select->having
select id,name,sex from student having job='a';
-- where的优先级比having高,where对所有数据筛选,having可以对select处理过的数据再加工
select name,job from student where sex='男' having job='a';
-- 子查询语句
select * from student where age=(select MAX(age) from student);