数据库,sql方言

一 数据库介绍

1 什么是数据库

存储数据的仓库,本质上就是存储数据的文件系统(在磁盘上),方便我们管理数据。

之前存储数据的方式有:io(操作麻烦,但是可以持久化)和集合(操作简单,但是不能持久化)

所有我们要学数据库(可以持久化,操作方便)

2 数据库管理系统

数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件。

数据库管理系统和数据库的关系 就类似于 wps或者excel和表格的关系

3 实体和表关系

类–>表

字段–>列(字段)

对象–>行(记录)


电脑上安装了DBMS之后,可以创建多个数据库.一个项目对应一个数据库,一个数据库下会有多张表

4 常见关系型数据库

1. MYSQL:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。

2. Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。

3. DB2:IBM公司的数据库产品,收费的。常应用在银行系统中。

4. SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。

5. SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。

6. SQLite: 嵌入式的小型数据库,应用在手机端。

常见的数据库:

  • mysql
  • oracle
  • db2

二 SQL

1 什么是SQL

Structured Query Language 结构查询语言

通过sql语句就可以操作数据库了

2 SQL方言

SQL是一套标准,所有的数据库厂商都实现了此标准;但是各自厂商在此标准上增加了特有的语句,这部分内容我们称为方言。 各个数据库的分页操作就是使用方言.

3 SQL书写规范

1.sql的一条语句可以在一行上编写,中间也可以换行
2.sql语句的结束符是;
3.sql语句关键词不区分大小写

4 SQL分类

  1. DDL 数据定义语言
    • 操作的对象主要是数据库和表
    • 主要的关键词: create alter drop
  2. DML 数据操作语言 ★
    • 操作的对象主要是记录
    • 主要的关键词: insert update delete
  3. DQL 数据查询语言,不是官方定义,是程序员定义的.★
    • 操作的对象就是记录
    • 主要的关键词: select
  4. DCL 数据控制语言 (了解),一般是DBA(数据库管理员)操作
    • 操作的对象主要是 用户和权限
    • 主要的关键词: create drop grant(授权) revoke(撤销权限)
  5. TCL 事务控制语言 (理解)
    • 操作的对象是事务
    • 主要的关键词: commit(提交事务) rollback(回滚)

四 DDL

1 操作数据库

  • 创建数据库(掌握)
-- 最最常用的方式
create database 数据库名字;
-- 例如:
create database day01;
-- 了解的方式,当数据库不存在的时候才创建
create dababase if not exists 数据库名;

-- 了解的方式,创建数据库的时候,指定字符集
create database 数据库名 character set gbk;
  • 修改数据库(了解)
-- 修改数据库的字符集
alter database 数据库名字 character set 新的字符集;
-- 例如:
alter database day03 character set utf8;
  • 删除数据库(理解)
-- 格式:
drop database 数据库名字;
-- 例如:
drop database day03;
  • 其他的命令
-- 查看某个数据库的建库语句:   
show create database 数据库名;

-- 查看全部数据库: 
show databases;

-- 使用或者切换数据库 : 
use 数据库名字;

-- 查看当前工作在那个数据库下 :  
select database();

2 操作表

前提:在指定数据库中进行操作

  • 创建表(掌握)
-- 格式:
create table 表名(
	字段1名字 字段1数据类型,
    字段2名字 字段2数据类型
);

-- 例如:
create table user(
	id int,
    name varchar(8)
);
-- 创建一张和user表结构一模一样的表
create table 新表名 like 表名;
-- 例如 :
create table user1 like user;
  • 修改表(理解中的了解)
-- 格式: 
alter table 表名 操作 

-- 往表中添加字段 column可以省略不写 添加一个password字段
alter table user add column password int;

-- 修改表中字段的类型 将password的类型修改为varchar
alter table user modify password varchar(8);

-- 修改表中字段的名字 将password 修改为 pwd
alter table user change password pwd varchar(8);

-- 删除字段 删除pwd字段
alter table user drop pwd;

-- 修改表名 将user1改名为user11
alter table user1 rename to user11;
  • 删除表(理解)
-- 格式
drop table 表名;
-- 例如:
drop table user11;
  • 其他的命令
-- 查看当前库下所有的表 : 
show tables;

-- 查询某个表的建表语句 : 
show create table 表名;

-- 查看表结构(描述表) :
desc 表名;

常用的数据类型

  • int
  • varchar(n) 可变长度字符串,n是最大的长度
    • 若存入的数据没有超过n的时候,是几个字符就占多大的空间
    • 若存入的数据超过n的时候,在cmd窗口下就会报错
  • char(n) 固定长度字符串,n就是长度
    • 若存入的数据没有超过n的时候,就是n个字符空间
    • 若存入的数据超过n的时候,在cmd窗口下就会报错
  • double或者double(m,n) 小数
    • m:总位数
    • n:小数位数
    • 例如: double(5,2) 表示存入的数据最大值为 999.99
  • date 日期 1985-11-11
  • datetime 日期时间 1985-11-11 14:30:59
  • timestamp 时间戳 若使用了时间戳且设置了默认值的话,我们若不给改字段赋值的时候就会使用系统当前时间
  • text 文本 (了解)
  • blob 二进制 (了解)

五 DML

主要操作对象:记录

  • 添加记录
-- 格式1:给指定的字段赋值
insert into 表名 (字段1,字段2) values (1,2); 
-- 格式2:给全部字段赋值
insert into 表名 values(1,2,...值n);

注意事项:
1.给指定字段赋值的时候,前面括号中有几个字段,后面括号中就有几个值 .且数据类型也要对应上
2.给全部字段赋值的时候,value中值的顺序要和表结构中的字段的顺序一致.且数据类型也要对应上
3.插入数据的时候应该使用引号将值引起来.建议使用'' ,若值的类型为数字的话,引号可以省略不写.
-- 先给user表添加字段
alter table user add money double(5,2);
alter table user add sex varchar(1);
alter table user add birthday date;

-- 插入值
insert into user(id,name) values('1','tom');
insert into user values (2,'jack',900,'男','1999-12-12');
-- 常见错误
insert into user values(4,jerry,'100','男','1990-09-09');

insert into user values(4,'jerry','100','男');

insert into user (id,name,sex) values(4,'jerry','男人');

insert into user (id,name,money) values(4,'jerry',1000);

insert into user (id,name) values ('jerry',4);

insert into user(id,name) valua(4,'jerry');

  • 修改记录
-- 格式1:修改全部记录
update 表名 set 字段1=1,字段2=2 ;

-- 格式2:按条件修改记录
update 表名  set 字段1=1,字段2=2 where 条件语句;
-- 例如:
update user set sex='女',birthday='2000-01-01';

update user set sex='男',birthday='1999-12-31' where id = 2;
  • 删除记录
-- 格式1:删除全部记录
delete from 表名;

-- 格式2:删除满足条件的记录
delete from 表名 where 条件语句;
-- 例如:
-- 创建一张和user结构一模一样的表user1,然后将user表中的记录插入到新的表中
create table user1 like user;
insert into user1 select * from user;-- 蠕虫复制

-- 清空user1表中的记录
delete from user1;

-- 删除user表中id=1的记录
delete from user where id = 1;

七 DQL

1 基本查询

-- 基本查询格式
select * from 表名;-- 查询全部的字段
select 字段1,字段2 from 表名;-- 查询指定的字段
-- 数据准备
-- 创建表
create table stu(
	id int,
	name varchar(20),
	chinese double,
	english double,
	math double
);
-- 插入记录
insert into stu(id,name,chinese,english,math) values(1,'tom',89,78,90);
insert into stu(id,name,chinese,english,math) values(2,'jack',67,98,56);
insert into stu(id,name,chinese,english,math) values(3,'jerry',87,78,77);
insert into stu(id,name,chinese,english,math) values(4,'lucy',88,NULL,90);
insert into stu(id,name,chinese,english,math) values(5,'james',82,84,77);
insert into stu(id,name,chinese,english,math) values(6,'jack',55,85,45);
insert into stu(id,name,chinese,english,math) values(7,'tom',89,65,30);
-- 查询表中所有学生的信息
-- 查询表中所有学生的姓名和对应的语文成绩
-- 查询表中学生姓名(去重)
-- 在查询的所有学生数学分数上加10分特长分
-- 统计每个学生的总分
-- 使用别名表示学生总分

-- 查询表中所有学生的信息
SELECT * FROM stu;

-- 查询表中所有学生的姓名和对应的语文成绩
SELECT NAME,chinese FROM stu;

-- 查询表中学生姓名(去重)
-- 使用distinct去掉重复
-- select distinct 字段,字段 from 表名;当distinct后面所有的字段值都一样的才会去掉重复值
SELECT DISTINCT NAME FROM stu;-- 5条
SELECT DISTINCT NAME,chinese FROM stu;-- 6条

-- 在查询的所有学生数学分数上加10分特长分
-- 我们可以在查询的结果上进行运算,不影响原来数据
SELECT NAME,math,math+10 FROM stu;

-- 统计每个学生的总分
-- null和其他数据进行运算的时候结果还是null
SELECT NAME,chinese+math+english FROM stu;
-- 我们可以使用ifnull函数进行处理
-- ifnull(表达式1,表达式2)  当表达式1的结果为null时,按表达式2的结果处理
SELECT NAME,chinese+math+IFNULL(english,0) FROM stu;

-- 使用别名表示学生总分
-- 给查询的字段起别名  
-- 格式 : 显示的字段名 [as] 别名
SELECT NAME,chinese+math+IFNULL(english,0) AS 总分 FROM stu;
SELECT NAME,chinese+math+IFNULL(english,0) '总 分' FROM stu;
SELECT NAME,chinese+math+IFNULL(english,0) "总 分" FROM stu;
SELECT NAME,chinese+math+IFNULL(english,0) `总 分` FROM stu;

2 条件查询

-- 基本格式
select *|字段 from 表名 where 条件语句;
条件语句支持:关系运算符,逻辑运算符,模糊查询等.
-- 数据准备
CREATE TABLE student (
  id int,
  name varchar(20),
  age int,
  sex varchar(5),
  address varchar(100),
  math int,
  english int
);
-- 插入记录
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);
# 关系运算符 
-- 查询math分数大于80分的学生
-- 查询english分数小于或等于80分的学生
-- 查询age等于20岁的学生
-- 查询age不等于20岁的学生

# 关系运算符 > < >= <= = != <>
-- 查询math分数大于80分的学生
SELECT * FROM student WHERE math>80;

-- 查询english分数小于或等于80分的学生
SELECT * FROM student WHERE english <= 80;

-- 查询age等于20岁的学生
SELECT * FROM student WHERE age = 20;

-- 查询age不等于20岁的学生
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;

# 逻辑运算符 and(&&) or(||) not(!)
-- 查询age大于35且性别为男的学生(两个条件同时满足)
-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
-- 查询id是1或3或5的学生
-- 使用in关键字再次查询id是1或3或5的学生
-- 查询id不是1或3或5的学生
-- 查询english成绩大于等于77,且小于等于87的学生
-- 查询英语成绩为null的学生


-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student WHERE age > 35 AND sex = '男';
SELECT * FROM student WHERE age > 35 && sex = '男';

-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student WHERE age > 35 OR sex = '男';

-- 查询id是1或3或5的学生
SELECT * FROM student WHERE id = 1 OR id = 3 OR id = 5;
-- 使用in关键字再次查询id是1或3或5的学生
-- 格式: 字段名 in (值1,值2)
SELECT * FROM student WHERE id IN (1,3,5);

-- 查询id不是 1或3或5的学生
SELECT * FROM student WHERE id != 1 AND id !=3 AND id != 5;
SELECT * FROM student WHERE id NOT IN (1,3,5);

-- 查询english成绩大于等于77,且小于等于87的学生
SELECT * FROM student WHERE english >= 77 AND english <= 87
-- 可以使用 between and 进行范围查询
-- 格式: 字段名 between 较小值 and 较大值
SELECT * FROM student WHERE english BETWEEN 77 AND 87;

-- 查询英语成绩为null的学生
-- 对null的判断处理 is null 或者 is not null
SELECT * FROM student WHERE english IS NULL;
SELECT * FROM student WHERE english IS NOT NULL;

模糊查询,支持以下两种写法
	% 匹配任意字符
	_ 匹配一个字符
格式
	where 字段名 like '匹配规则';
	
举个栗子:
	name like '%马%'; 名字有马
	name like '马%'; 姓马
	name like '%马'; 名字以马结尾
	name like '_马%'; 名字第二个字为马
	name like '马'; 等价于 =
# 模糊查询
-- 查询姓马的学生
-- 查询姓名中包含'德'字的学生
-- 查询姓马,且姓名有三个字的学生


-- 查询姓马的学生
SELECT * FROM student WHERE NAME LIKE '马%';

-- 查询姓名中包含'德'字的学生
SELECT * FROM student WHERE NAME LIKE '%德%';

-- 查询姓马,且姓名有三个字的学生
SELECT * FROM student WHERE NAME LIKE '马__';

3 排序

-- 格式1:
select * from[where 条件] order by 排序字段名 排序方式;

-- 格式2:
select * from[where 条件] order by 主排序字段名 排序方式 ,次排序字段名 排序方式;

-- 排序方式: asc(升序,默认值)和desc(降序)
# 排序
-- 查询所有数据,使用年龄降序排序
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序

-- 查询所有数据,使用年龄降序排序
SELECT * FROM student ORDER BY age DESC;

-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student ORDER BY age DESC,math DESC;

4 聚合函数

对字段(列)进行统计,会自动忽略null,不能跟在where后

  • count(字段名):计数
  • sum(字段名):求和
  • max(字段名):最大值
  • min(字段名):最小值
  • avg(字段名):平均值
# 聚合函数
-- 查询学生总数(null值处理)
-- 查询年龄大于40的总数
-- 查询数学成绩总分
-- 查询数学成绩平均分
-- 查询数学成绩最高分
-- 查询数学成绩最低分

-- 查询学生总数(null值处理)
SELECT COUNT(id) FROM student;-- 8
SELECT COUNT(english) FROM student;-- 7
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;

-- 查询年龄大于40的总数
SELECT COUNT(1) FROM student WHERE age>40;

-- 查询数学成绩总分
SELECT SUM(math) FROM student;

-- 查询数学成绩平均分
SELECT AVG(math) FROM student;

-- 查询数学成绩最高分
SELECT MAX(math) FROM student;

-- 查询数学成绩最低分
SELECT MIN(math) FROM student;

5 分组

-- 格式
select 分组的字段,聚合函数,聚合函数2 from 表名 [where 分组前的筛选条件] group by 分组字段 [having 分组后的条件筛选]
-- 查询男女各多少人
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据

-- 查询男女各多少人
SELECT COUNT(1) FROM student WHERE sex = '男';
SELECT COUNT(1) FROM student WHERE sex = '女';

SELECT sex,COUNT(1) FROM student GROUP BY sex;

-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
SELECT sex, COUNT(1) FROM student WHERE age > 25 GROUP BY sex;

-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
SELECT sex, COUNT(1) FROM student WHERE age > 25 GROUP BY sex HAVING COUNT(1)>2
SELECT sex, COUNT(1) renshu FROM student WHERE age > 25 GROUP BY sex HAVING renshu>2

where和having区别

  • where 是对分组前的数据进行筛选,having是对分组后的数据进行筛选
  • where后面不能使用聚合函数,having后面可以使用聚合函数

6 分页

mysql中是通过limit关键字实现的.mysql的方言

格式:

select * | 字段 from 表 [where 条件][group by 字段] [order by 排序字段] limit m,n

  • m : 开始的索引
  • n : 向后查询的条数

-- 数据准备
INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES 
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,88);
-- 查询学生表中数据,从第三条开始显示,显示6条
-- 查询学生表中数据,显示前6条
-- 模拟百度分页,一页显示5条

-- 查询学生表中数据,从第三条开始显示,显示6条
SELECT * FROM student LIMIT 2,6;

-- 查询学生表中数据,显示前6条
SELECT * FROM student LIMIT 0,6;
SELECT * FROM student LIMIT 6;

-- 模拟百度分页,一页显示5条
SELECT * FROM student LIMIT 0,5;
SELECT * FROM student LIMIT 5,5;
SELECT * FROM student LIMIT 10,5;

开始的索引的规律:

  • (页码-1)*每页显示的条数

八 数据库约束

1 概述

作用

对表中的数据进行限定,保证数据的正确性、有效性和完整性。

约束有哪些:

  1. ★主键约束:一条记录的唯一标识
  2. 唯一约束:字段在该列中唯一
  3. 非空约束:字段不能为null
  4. 外键约束:多表关系才用
  5. 默认值:在不具体指定数据的时候使用的值就是默认值

2 实现

主键约束

作用:限定某一列的值非空且唯一, 主键就是表中记录的唯一标识。

一张表中只能有一个主键.但是主键可以修饰多个字段.

主键的分类:

  • 自然主键:使用实体中一个有具体业务含义的字段作为主键.例如:身份证号,手机号
  • 代理主键:使用实体中没有具体业务含义的字段作为主键.一般会在每张表中引入一个id字段作为主键.

方式1:在建表的时候,在字段名后面通过primary key 声明

方式2:在建表的时候,在约束区域通过primary key 声明

方式3:通过修改表结构,添加主键约束


方式1:在建表的时候,在字段名后面通过primary key 声明

create table pk1(
	id int primary key,
    name varchar(8)
);

insert into pk1 values(1,'tom');-- 成功
insert into pk1 values(1,'tom');-- 重复输入1 错误 Duplicate entry '1' for key 'PRIMARY'
insert into pk1 values(null,'tom');-- 不能为空 错误 Column 'id' cannot be null

方式2:在建表的时候,在约束区域通过primary key 声明

create table pk2(
	id int,
    name varchar(8),
    primary key(id)
);

方式3:通过修改表结构,添加主键约束

create table pk3(
	id int,
    name varchar(8)
);

alter table pk3 add primary key (id);

扩展:用name和sex作为主键

create table pk4(
	id int,
    name varchar(8),
    sex varchar(1),
    primary key(name,sex) -- 联合主键 也可以使用方式3添加主键
);

insert into pk4 values (1,'tom','男');-- 成功
insert into pk4 values (1,'tom','男');-- 失败
insert into pk4 values (1,'tom','女');-- 成功
insert into pk4 values (1,null,'女');-- 失败

小结:以后建表的时候务必给表加上主键.

唯一约束

作用:限定某一列中的值不能重复,对null不其作用

方式1:在建表的时候,在字段名后面通过unique 声明

方式2:在建表的时候,在约束区域通过unique 声明

方式3:通过修改表结构,添加unique 约束


方式1:在建表的时候,在字段名后面通过unique 声明

create table un1(
	id int,
    username varchar(8) unique
);

insert into un1 values(1,'tom');-- 成功
insert into un1 values(1,'tom');-- 失败
insert into un1 values(1,null);-- 成功

方式2:在建表的时候,在约束区域通过unique 声明

create table un2(
	id int,
    username varchar(8),
    unique(username)
);

方式3:通过修改表结构,添加unique 约束

create table un3(
	id int,
    username varchar(8)
);

alter table un3 add unique(username);

小结:唯一约束也可以使用java代码保证数据的唯一性.

非空约束

作用:限定某一列的值不能为null

方式:在建表的时候,在字段名后面通过not null声明

create table nn(
	id int,
    username varchar(8) not null
);

insert into nn values(1,null);-- 失败

默认值

作用:限定某一列的默认值,再没有指定的情况下所有列的默认值为null

格式 : 字段名 字段类型 default ‘默认值’

当我们给表中插入或者修改数据的时候,若没有明确给字段设置值,就会使用默认值

create table person(
	id int,
    name varchar(8),
    country varchar(64) default '中国'
);

insert into person values(1,'韩梅梅',null);
insert into person(id,name) values(2,'李雷');

扩展 : 时间戳,timestamp,在添加或者修改的时候若没有给设置值,就让其使用系统的当前时间

ALTER TABLE person ADD update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值