数据库的初级内容汇总!

Posted Eason Tsay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库的初级内容汇总!相关的知识,希望对你有一定的参考价值。

数据库介绍(理解)

什么是数据库

数据存储的仓库,其本质也是一个文件系统

数据库会按照特定的格式对数据进行存储,用户可以对数据库中的数据进行增加,修改,删除及查询操作

关系型数据库mysql 非关系型数据库 redis mongodb

数据库--- 数据表 ---- 一条一条的数据

深入认识数据库

数据库管理系统层次

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

常见的数据库管理系统

* MySQL: 开源免费的数据库,小型的数据库。已经被Oracle(甲骨文)公司收购了,MySQL6.x版本(商业、社区)也开始收费。
* Oracle:收费的大型数据库,Oracle公司的产品。
​
* DB2:   IBM公司的数据库产品,收费的。
* SQLServer:MicroSoft公司收费的中型的数据库。。
* sqlite  移动端轻量级数据库
* mariadb 是mysql的一个分支     centos

SQL介绍

1. 什么是SQL
    SQL全称Structured Query Language,翻译为:结构化 查询 语言
    是我们用来操作数据库的一种语言,通过sql语句来操作各种数据库,可以实现数据库、数据表、数据记录的增删改查
    注意我们一般把增删改查称为CRUD:create 创建、retrieve 检索、update 修改、delete 删除
​
2. SQL方言
    SQL是一套标准,所有的数据库厂商都实现了此标准。但是各自厂商在此标准上增加了特有的语句,这部分内容我们称为方言。
    比如在sql中表示单行注释可以使用两种方式:  -- sql通用注释     # mysql专有注释
​
3. SQL分类
​
    DDL(Data Definition Language) 数据定义语言:用来定义数据库,数据表
    
    DML(Data Manipulation Language) 数据操作语言:用来对数据库中表的数据进行增删改
    DQL(Data Query Language) 数据查询语言:用来对数据库中表的数据进行查询
    
    DCL(Data Control Language) 数据控制语言:用来定义数据库的访问权限和安全级别以及创建用户
    TCL(Transaction Control Language) 事务控制语言:用于控制数据库的事务操作
​
4. SQL的书写标准
    SQL可以单行书写,也可以多行书写, 它以;结束一条SQL语句
    在windows环境中SQL语句是不区分大小写的  
    在SQL中可以使用注释,一般有两种:
        单行注释  -- 注释体   
        多行注释  /* 注释体 */  

数据库操作(练习一遍)

连接数据库

-- mysql [-h 服务器地址  -P 端口号] -u用户名 -p密码
​
mysql -uroot -p
exit; 退出
mysql -uroot -p -h 127.0.0.1 -P 3306
-- 3306是mysql的默认端口
​
如果想连接远程电脑的数据库 需要有对应的账号,和远程数据库的ip和端口.账号还必须有远程连接的权限

常见错误

错误1: ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 表示数据库服务停止了

错误2: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 表示你的用户名和密码不对

配置编码

  • 配置文件在my.ini

  • 把该文件里面的两个配置信息

    default-character-set和character-set-server修改为utf8的字符集类型

创建数据库

注意mysql语句分号结束

需求:创建一个名为db1的数据库

在mysql里schema和database是一个意思

-- 语法  注意分号结束
create schema  [IF NOT EXISTS] 数据库名;
或者
create database  [IF NOT EXISTS] 数据库名;
​
-- 实例
create database db1 charset=utf8mb4;
或者
create schema db1 charset=utf8mb4;

查询数据库

需求:查看所有数据数据库

-- 语法
show schemas;
或者
show databases;

删除数据库

需求:删除名为db1的数据库

-- 语法
drop schema [IF EXISTS] 数据库名;
或者
drop database [IF EXISTS] 数据库名;
​
-- 实例
drop database db1;

使用数据库

需求:查看正在使用的数据库

-- 语法
select database();

需求:切换正在使用的数据库为db1(db1必须存在)

-- 语法
use 数据库名;
​
-- 实例
use db1; -- 一定要保证这个schema是存在的

数据表操作

创建数据表

需求:在db1中创建一张名为student的数据表,表中字段有 id name birthday

字段之间是逗号分开

-- 语法
    create table 表名(    
        字段名1  字段类型1(字段长度),  -- 不是;号    
        字段名2  字段类型2(字段长度),  
        ....    
        字段名n  字段类型n(字段长度)  -- 最后一列后面是没有,的
    );
    
-- 实例  
create table student(
    id  int(11), 
    name varchar(20),
    birthday date,
    address varchar(100),
    score double(5,2),
    email varchar(64),
    tel varchar(11)
);
​
    
-- 查看
show tables;

常见数据类型

大分类类型描述
数字类型int整型
float单精度浮点数类型
double双精度浮点数类型
字符类型varchar可变长度字符串类型,它的长度可以由我们自己指定,默认长度365, 最大值是65535,使用效率低,节省磁盘存储空间
char固定长度字符串类型,如果没有指定长度,默认长度是255,查询效率高, 浪费磁盘存储空间
日期类型date日期,格式:yyyy-MM-dd
datetime日期时间,格式:yyyy-MM-dd HH:mm:ss,占用8字节的存储空间

查询数据表

查询所有表

需求:查看当前库中的所有数据表

-- 语法
show tables;

查看表结构

需求:查看student表的表结构

-- 语法
desc 数据表名;
​
-- 实例
desc student;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | YES  |     | NULL    |       |
| name     | varchar(20)  | YES  |     | NULL    |       |
| birthday | date         | YES  |     | NULL    |       |
| address  | varchar(100) | YES  |     | NULL    |       |
| score    | double(5,2)  | YES  |     | NULL    |       |
| email    | varchar(64)  | YES  |     | NULL    |       |
| tel      | varchar(15)  | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

修改数据表

添加一列 add

需求:修改student表中添加一列description

-- 语法
alter table 表名 add 字段名 列类型
​
-- 实例
alter table student add description  varchar(200);

修改类型 modify

需求:修改description的类型为varchar(300)

-- 语法
alter table 表名 modify  列名 新列类型
​
-- 实例
alter table student modify description char(230);

修改列名和类型 change

需求:修改student表description列名为intro

-- 语法
alter table 表名 change 旧列名 新列名 列类型
​
-- 实例
 alter table student change description intro varchar(100);

删除指定列

需求:删除student表的intro列

后面用的比较少

-- 语法
alter table 表名 drop 列名;
​
-- 实例
alter table student drop intro;

修改表名

需求:修改student表的名称为stu

-- 语法
rename table 旧表名 to 新表名;
​
-- 实例
rename table student to stu;

删除数据表

需求:删除stu表

-- 语法
drop table 表名;
​
-- 实例
drop table stu;

连接数据库

打开连接窗口

  1. 点击idea左下角的图标,在弹出框中选择Database

  2. 在idea右边侧边栏中选中Database

  3. 点击+号,然后选择Data Source中的MySQL

选择驱动版本

选择驱动版本,注意版本号选择8.0.25

Class选择com.mysql.jdbc.Driver 如果没有 关闭重新打开 下拉查看

建立连接

增删改数据(重点)

插入数据

需求:在student表中添加如下数据

id name birthday

1 工藤 1990-01-01

5 小兰 1990-01-01

6 小五郎

  • create table student(
        id  int(11), 
        name varchar(20),
        birthday date,
    );
    

基本方式

-- 语法
    insert into 表名(字段1,字段2,.....字段n)  values(值1,值2,.....值n)
    
​
-- 实例
    insert into  student(id,name,birthday,address,score,email,tel)  values(1,'工藤','1990-01-01','西虹市',1.25,'123@qq.com','15512344321');
    
    insert into student(id,name,birthday) values(5,'小兰','1990-01-01');
    
    insert into student(id,name) values(6,'小五郎');
    
    insert into student(id,name,birthday) values(6,'小五郎',null);
    
    select * from student; --查看数据
​
-- 注意    
    1. 插入数据的时候,列名和值要一一对应(包括数量 顺序 类型)    
    2. 插入数据的时候,数值之外的类型需要使用引号引起来,推荐使用单引号    
    3. 所有列的值都可以传入字符串类型的值,MySQL底层有隐式转换机制    
    4. 当一列中不需要传入值的时候,可以使用null代替值

批量插入

-- 语法
    insert into 表名(字段1,字段2,.....字段n) values(值1,值2,.....值n),(值1,值2,.....值n),(值1,值2,.....值n);
​
-- 实例
    insert into student(id,name,birthday) values(1,'工藤','1990-01-01'),(5,'小兰','1990-01-01'),(6,'小五郎',null);

省略列名

  • 注意: 值的数量一定要保证跟列的数量一致,如果值中没有对应的列,使用null补齐

-- 语法
    insert into 表名 values(值1,值2,.....值n)
​
-- 实例 
    insert into student values(8,'灰原哀','1991-01-01','西虹市',1.55,'223@qq.com','15512344322');
    insert into student values(6,'小五郎'); -- Column count doesn't match value count at row 1  在保存数据的时候, 值和列数量上不匹配

修改数据

需求:修改工藤的name为柯南,birthday为2000-01-01

-- 语法
    update 表名 set 字段1=值1,字段2=值2 [where 条件字段=值]
​
-- 实例
-- 先根据where后面的条件找到对应的数据(可能是多条数据),然后修改对应的字段的数据
​
-- 修改工藤的name为柯南,birthday为2000-01-01
update student set name='柯南',birthday='2000-01-01' where name='工藤';
    
--  修改id为6的 name为小六郎
update student set name='小六郎' where id=6;
    
​
-- 注意   
    1. 修改语句中如果不加条件,则将所有数据都会被修改!
    2. set中没有处理的字段是不会被修改的

删除数据

需求:删除name为柯南的记录

-- 语法
    delete from 表名 [where 条件字段=值]
​
-- 实例
    delete from student where name = '柯南';
​
-- 注意
    1. 删除语句中如果不加条件,则将所有数据都会被删除! 

小结

-- 增加   
insert into 表名 values(值1,值2...)
​
-- 修改   
update 表名 set 列1=值1,列2=值2 where 条件
​
-- 删除   
delete from 表名 where 条件

查询数据(重点重点重点) 单表查询

简单查询

-- 案例驱动,准备数据
-- 创建表
create table student1(
    id int, -- 学生编号
    name varchar(20), -- 学生姓名
    chinese double, -- 语文成绩
    english double, -- 英语成绩
    math double -- 数学成绩
);
-- 插入记录
insert into student1(id,name,chinese,english,math) values(1,'tom',89,78,90);
insert into student1(id,name,chinese,english,math) values(2,'jack',67,98,56);
insert into student1(id,name,chinese,english,math) values(3,'jerry',87,78,77);
insert into student1(id,name,chinese,english,math) values(4,'lucy',88,NULL,90);
insert into student1(id,name,chinese,english,math) values(5,'james',82,84,77);
insert into student1(id,name,chinese,english,math) values(6,'jack',55,85,45);
insert into student1(id,name,chinese,english,math) values(7,'tom',89,65,30);

查询所有列

需求:查询表中所有学生的信息

-- 语法 
    select * from 表名
​
-- 实例
    select * from student1;

查询部分列

需求:查询表中所有学生的姓名和对应的语文成绩

-- 语法 
    select 列1名,列1名,...列2名 from 表名
​
-- 实例
    select name,chinese from student1;

去重

需求:查询表中学生姓名(同名的就显示一次)

-- 语法 
    select distinct 列名 from student1;
​
-- 实例  name相同的只显示一个
    select distinct name from student1; 
    -- 实例  id和name都相同的只显示一个
    select distinct id,name from student1; 

四则运算

需求:在所有学生数学分数上加10分特长分

-- 语法 
    select 列(四则) from student1;
​
-- 实例
    select name,math,math+10 from student1;

空值处理

需求:统计每个学生的总分

-- 语法 
    1. null跟其它值进行四则运算,得到结果都是null
    2. ifnull(列,默认值)  当指定的列的值为null的时候,使用后面的默认值进行替换
​
-- 实例
    select name,chinese+math+english from student1;
    select name,chinese+math+ifnull(english,0) from student1;

别名

  • as 后跟别名 as可以省略

需求:使用别名表示学生总分

-- 语法 
    select 列 [as] 别名 from 表名
​
-- 实例  使用别名total 表示学生总分
    
# name 起别名 '名字'      chinese+math+ifnull(english,0) 起别名 total
    

条件查询

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);

关系运算符

-- 语法: 
    select * from 表名 where 条件(  =  >=  <=   !=  <>  )
​
-- 实例:
​
-- 查询age等于20岁的学生
select * from student2 where age=20;
​
​
-- 查询age不等于20岁的学生
select * from student2 where age!=20;
​
-- 查询math分数大于80分的学生
select * from student2 where math>80;
​
-- 查询english分数小于或等于80分的学生
​
select * from student2 where english<=80;
​

逻辑运算符

-- 语法: 
    and 并且   
    or  或者   
    
-- 实例:
​
-- 查询age等于20岁的学生并且math分数大于80分的学生
select * from student2 where age=20 and math>80;
​
​
-- 查询age等于20岁的学生或者math分数大于80分的学生
select * from student2 where age=20 or math>80;
​
-- 查询id是1或3或5的学生
select * from student2 where id=1 or id=3 or id=5;
​
-- 查询english成绩大于等于77,且小于等于87的学生
select * from student2 where english>=77 and english<=87 ;
​

范围关键字

-- 语法: 
    字段 in (值1,值2,....值n)   表示字段=集合中的任何一个都可以
    字段 not in (值1,值2,....值n)   表示字段不在集合中才可以
    
    字段 between 开始值 and  结束值   查询的字段的值要在 [开始 , 结束]
    字段 not between 开始值 and  结束值   查询的字段的不值要在 [开始 , 结束]
    
-- 实例:
-- 查询id是1或3或5的学生
select * from student2 where id in (1,3,5);
​
-- 查询id不是1或3或5的学生
select * from student2 where id not in (1,3,5);
​
-- 查询english成绩大于等于77,且小于等于87的学生
select * from student2 where english between 77 and 87;
​

null关键字

-- 语法:  
    is null 为空
    is not null 不为null
    
    注意: null是不能跟字段进行关系运算符匹配( 不能 =null    !=null)
​
-- 实例:
​
-- 查询英语成绩为null的学生
select * from student2 where english is null;
​
​
-- 查询英语成绩不为null的学生
select * from student2 where english is not null;

模糊匹配

  • like

  • rlike 正则表达式后面学

-- 语法:
    字段 like ''
    % 匹配0个或者多个字符
    _ 匹配1个字符
​
-- 实例:
​
-- 查询姓马的学生
select * from student2 where name like '马%';
​
​
-- 查询姓名中包含'德'字的学生
select * from student2 where name like '%德%';
​
-- 查询姓马,且姓名有三个字的学生
select * from student2 where name like '马__';
​

高级查询(难点)

排序

  • asc ascending 升序

  • desc descending 降序

-- 语法: 
    order by 字段1 [asc|desc] , 字段2 [asc|desc]
    注意: null字段在排序时,是按照最小值处理
-- 实例:
​
-- 查询所有数据,使用年龄降序排序
SELECT * from student2 ORDER BY age desc;
​
​
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * from student2 ORDER BY age desc,math desc;
​
​
-- 排序有null值的列
SELECT * from student2 ORDER BY english desc;
​
​

结果截取 分页

-- 语法:
     limit 跳过几条,截取多少条
​
-- 实例:
​
-- 查询学生表中数据,从第三条开始显示,显示4条
select * from student2 limit 2,4;
​
-- 查询学生表中数据,显示前4条
select * from student2 limit 0,4;
select * from student2 limit 4; -- 如果从0开始截取,开始索引可以省略
​
​
--  每页显示3条     (页码-1)* 每页的数量
select * from student2 limit 0 3;    0*3      1-3
select * from student2 limit 3 3;    1*3      4- 6
select * from student2 limit 6 3;    2*3      7- 9
​

聚合函数

-- 功能:
    对一列数据进行计算,返回一个结果,忽略null值
    对一列数据,Mysql可以统计出: 个数count  总和sum  平均数avg  最大值max  最小值min
-- 语法: 
    select 聚合函数(字段) from 表名
​
-- 实例:
​
-- 查询学生总数
select count(*) from student2;
-- 查询数学成绩总分
select sum(math) from student2;
​
-- 查询数学成绩平均分
select avg(math) from student2;
-- 查询数学成绩最高分
select max (math) from student2;
-- 查询数学成绩最低分
select min (math) from student2;

分组(重点)

  • 注意一旦分组,只能查询被分组的那个字段, 和聚合函数. 想看其他字段,需要使用GROUP_CONCAT来拼接

    • 如果不拼接 有2种情况

      • 1 只显示第一个

      • 2 报错

-- 语法:
    select 分组列名,聚合函数() from 表名 group by 列名;  ---按照GROUP BY 后面的列名分组
    分组,一般都是和聚合函数联合使用
    
-- 实例:
-- 查询所有学生, 按性别分组, 统计每组的人数
select sex,count(*) from student2 GROUP BY sex;
​
-- 查询所有学生, 按性别分组, 统计每组的人数   这里查询了name  会只显示一个名字或者报错
select sex,count(*),name from student2 GROUP BY sex;
​
-- 查询所有学生, 按性别分组, 统计每组的人数  GROUP_CONCAT可以把分组后的name的数据拼接显示
select sex,count(*),GROUP_CONCAT(name) from student2 GROUP BY sex;
​
​
-- 查询年龄大于25岁的人, 按性别分组, 统计每组的人数
SELECT sex,count(*) from student2 where age>25 GROUP BY sex;
​
-- 查询男女的数学平均分  只统计年龄大于40的
​
SELECT sex,AVG(math) from student2 where age>40 GROUP BY sex;
​
​
-- GROUP_CONCAT可以把分组后 其它字段的数据拼接后显示
SELECT sex,AVG(math),GROUP_CONCAT(NAME),GROUP_CONCAT(age) FROM student2 WHERE age>40 GROUP BY sex ;
+------+-----------+----------------------------+-------------------+
| sex  | AVG(math) | GROUP_CONCAT(NAME)         | GROUP_CONCAT(age) |
+------+-----------+----------------------------+-------------------+
| 女   |   98.0000 | 马化腾                     | 45                |
| 男   |   73.6667 | 马云,马景涛,刘德华         | 55,55,57          |
+------+-----------+----------------------------+-------------------+

过滤

  • 分组之后的条件过滤使用having

-- 语法:  
    group by 分组  having 过滤条件
    
    1. 过滤,一般都是和分组联合使用
    2. 分组之前的条件过滤使用where  分组之后的条件过滤使用having
-- 实例:
​
-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
​
-- 查询年龄大于25岁的人,  按性别分组,统计每组的人数,  并只显示性别人数大于2的数据
select sex,count(*) from student2 where age > 25 group by sex having count(*) > 2;
​
​
-- 查询男女的数学平均分 保留平均分大于90的
select sex,avg(math) from student2  group by sex having avg(math)>90;

小结:高级查询的顺序

1. 排序: order by 列 [asc|desc]
2. 截取: limit 开始,几个
3. 聚合函数: count(列)
4. 分组: group by 列
5. 过滤: having 过滤条件
6. 普通条件: where 
​
select 聚合函数() from 表 [where 条件]  [group by 分组]  [having 过滤]  [order by 排序] [limit 截取]

数据库备份(会用)

主从

导出

  • 注意 是退出mysql后执行

mysqldump –uroot –p 数据库名 > aaa.sql
​
# 按提示输入mysql的密码 

导入

  • 注意 是退出mysql后执行

mysql -uroot –p 新数据库名 < aaa.sql

mysql -uroot –p a3 < aaa.sql

# 根据提示输入mysql密码

常见错误

1. Column count doesn't match value count at row 1  在保存数据的时候, 值和列数量上不匹配

以上是关于数据库的初级内容汇总!的主要内容,如果未能解决你的问题,请参考以下文章

java 零散知识汇总(初级)

SQL 学习1 初级(转)

java主要学习哪些内容

学习java的内容都有哪些呢??

java学习的主要内容是啥?

SPark SQL编程初级实践