数据库的初级内容汇总!
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;
连接数据库
打开连接窗口
点击idea左下角的图标,在弹出框中选择Database
在idea右边侧边栏中选中Database
点击+号,然后选择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 在保存数据的时候, 值和列数量上不匹配
以上是关于数据库的初级内容汇总!的主要内容,如果未能解决你的问题,请参考以下文章