数据库(DataBase,DB):指⻓期保存在计算机的存储设备上,按照⼀定规则组织起来,可以被各种⽤户或应⽤共享的数据集合。
数据库管理系统(DataBase Management System,DBMS):指⼀种操作和管理数据库的⼤型软件,⽤于建⽴、使⽤和维护数据库,对数据库进⾏统⼀管理和控制,以保证数据库的安全性和完整性。⽤户通过数据库管理系统访问数据库中的数据。数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
DB与DBMS关系
1.关系型数据库(sql)
2.⾮关系型数据库(nosql)
Oracle:是Oracle公司的数据库产品
Mysql: 最早属于瑞典的MysqlAB公司的,后被Sun公司收购,Sun在2009年4⽉20号
被Oracle收购。
SQLServer:微软旗下的数据库产品
Access:微软旗下的数据库产品
DB2:IBM公司旗下的数据库产品
HBase是⼀个分布式的、⾯向列的开源数据库
MongoDB是⼀个基于分布式⽂件存储的数据库
Redis是⼀个开源的使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,并提供多种语⾔的API
(所有相关的软件⽂档都已经上传⽹盘⽬录中链接: https://pan.baidu.com/s/1xG-c9wOyTmGeuEYAEh0XZg 密码: chbg)
使⽤的数据库版本是mysql----mysql-installer-community-5.7.25.0.msi
安装过程在⽂档mysql5.7安装.pdf
注意:⾸先检查电脑是否安装,Microsoft Visual C++2013运⾏库_x64,如果没有,要先进⾏安装.
(点击屏幕左下⻆按钮—找到设置—找到应⽤选项,查看下⾯界⾯)
安装失败的可能原因:
1.关闭防⽕墙
2.查看系统版本与mysql版本
3.检查配置是否正确
4.电脑⽼旧
5.尝试以管理员权限安装mysql
6.卸载完先关机重启
有些⼈,在卸载某⼀款软件时,没有使⽤卸载程序,⽽是先直接删除安装路径下的⽂件及其⽂件夹,这样就会造成注册表的残留,会影响此软 件的下⼀次安装,造成安装失败。 现在,市场上的90%的软件安装包内都⾃带卸载程序,因此,想卸载某款软件时,可以再次双击软件安装包,或者在开始菜单查找卸载程序 uninstall…,或者在控制⾯板内卸载软件。避免注册表的残留。 MySQL的卸载,只需要双击安装程序,然后出现以下界⾯:点击Remove即可
注意:上⾯的正常情况是可以卸载完成的,如果发⽣卸载步骤不对,产⽣错误,涉及到了注册表,操作如下
step1:Windows+R–>regedit–>打开注册表
step2:根据路径打开并删除
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Application/MySQL
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/MySQL57
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services⼀般服务会以相同的名字(名字通常是MySQL)
安装成功了打开cmd --> mysql -uroot -p直接敲回⻋
然后输⼊你的密码
1.停⽌mysql服务 运⾏输⼊services.msc 停⽌mysql服务 或者 cmd --> net stop mysql
2.在cmd下 输⼊ mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗⼝)
3.新打开cmd 输⼊mysql -u root -p 不需要密码
use mysql; update user set password=password(‘abc’) WHERE User=‘root’;
4.关闭两个cmd窗⼝ 在任务管理器结束mysqld 进程
5.在服务管理⻚⾯ 重启mysql 服务,密码修改完成
当我们在mysql5.7数据库中创建默认表的时候默认是latin1 编码集即是iso-8859-1
这样的编码集我们向表中出⼊数据的时候是⽆法插⼊中⽂的,所以针对此问题提供如
下解决⽅案:
⽅案⼀
我们在创建数据库时候可以指定编码集为gbk/utf8
create database mydb4 character set 'utf8';
或
create database mydb4 character set 'gbk';
以后再在此数据库中创建的表是默认gbk/utf8的编码
⽅案⼆
数据库已经默认存在了⽽且编码集是latin1,那么我们可以在创建表的时候指定表的默
认编码集,在建表语句的最后添加DEFAULT CHARSET=utf8或gbk
CREATE TABLE t_1 (
id int(11)
)DEFAULT CHARSET=utf8;
或
CREATE TABLE t_1 (
id int(11)
)DEFAULT CHARSET=gbk;
⽅案三
数据库已经默认存在了,表也默认存在了还是latin1编码集
修改表的编码集
alter table 表名 convert to character set utf8;
或
alter table 表名 convert to character set gbk;
修改数据库编码集
alter database 数据库名 character set utf8;
或
alter database 数据库名 character set gbk;
以上⽆论是使⽤哪种⽅式,⼀定要完全退出数据库后在重新进⼊就会发现字符集被修改了
以上三种⽅案都是治标不治本的,因为都是修改的其中⼀部分,但是以后建库或建表的时候还是latin1,这是因为我们在安装数据库的时候,mysql5.7的默认安装编码集是latin1,其实我们可以在cmd模式下查看编码集
show variables like ‘character%’;
所以我们要修改mysql安装路径和下的my.ini⽂件⽂件所在路径
C:\ProgramData\MySQL\MySQL Server 5.7
Ps:可能每个⽂的路径不同,但是安装的位置没有修改前提下⼤家都是相同的,如果修改了安装路径,那么就在你所安装的盘符下搜索my.ini⽂件,如果没有那⼀定是在C盘
使⽤编译⽂件软件或是使⽤记事本打开在下图标注的位置添加这两句话
添加完成后保存退出
windows键+R 出现运⾏界⾯ 在打开的后⾯输⼊
然后出现这个界⾯,点击重启动此服务
SQL:Structure Query Language。(结构化查询语⾔)SQL被美国国家标准局(ANSI)确定为关系型数据库语⾔的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语⾔的国际标准。 各数据库⼚商都⽀持ISO的SQL标准。
各数据库⼚商在标准的基础上做了⾃⼰的扩展。
DDL(Data Definition Language):数据定义语⾔,⽤来定义数据库对象:库、表、列等;
DML(Data Manipulation Language):数据操作语⾔,⽤来定义数据库记录(数据);
DCL(Data Control Language):数据控制语⾔,⽤来定义访问权限和安全级别;
DQL(重要)(Data Query Language):数据查询语⾔,⽤来查询记录(数据)。 注意:sql语句以;结尾
定义:操作数据库、表、列等
使⽤的关键字:CREATE、 ALTER、 DROP
创建
Create database mydb1;
Create database mydb2 character set gbk;
Create database mydb3 character set gbk COLLATE gbk_chinese_ci;
查询
查看当前数据库服务器中的所有数据库
Show databases;
查看前⾯创建的mydb2数据库的定义信息
Show create database mydb2;
删除前⾯创建的mydb3数据库
Drop database mydb3;
修改
查看服务器中的数据库,并把mydb2的字符集修改为utf8;
alter database mydb2 character set utf8;
删除
Drop database mydb3;
create table 表名(
字段1 字段类型,
字段2 字段类型,
...
字段n 字段类型
);
常⽤数据类型
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位⼩数,即最⼤值为
999.99;
char:固定⻓度字符串类型;
char(10): 'aaa ' 占10位
varchar:可变⻓度字符串类型;
varchar(10): 'aaa' 占3为
text:字符串类型;
blob:字节类型;
date:⽇期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会⾃动赋值
datetime:⽇期时间类型 yyyy-MM-dd hh:mm:ss
boolean:mysql不⽀持,oracle⽀持
常⽤操作
查看当前数据库中的所有表
SHOW TABLES;
查看表的字段信息
DESC employee;
在上⾯员⼯表的基本上增加⼀个image列。
ALTER TABLE employee ADD image blob;
修改job列,使其⻓度为60。
ALTER TABLE employee MODIFY job varchar(60);
删除image列,⼀次只能删⼀列。
ALTER TABLE employee DROP image;
表名改为user。
RENAME TABLE employee TO user;
查看表格的创建细节
SHOW CREATE TABLE user;
修改表的字符集为gbk
ALTER TABLE user CHARACTER SET gbk;
列名name修改为username
ALTER TABLE user CHANGE name username varchar(100);
备份表结构和表数据
create table tname2 as select * from tname1;
备份表结构
create table tname2 like tname1;
删除表
DROP TABLE user ;
DML是对表中的数据进⾏增、删、改的操作。不要与DDL混淆了。
INSERT 、UPDATE、 DELETE ⼩知识:在mysql中,字符串类型和⽇期类型都要⽤单引号括起来。空值:null
语法:
INSERT INTO 表名(列名1,列名2 …)VALUES(列值1,列值2…);注意:列名与列值的类型、个数、顺序要⼀⼀对应。
可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的⻓度。如果插⼊空值,请使⽤null插⼊的⽇期和字符⼀样,都使⽤单引号括起来。
⼩知识
查看数据库编码的具体信息Show variables like 'character%';
临时更改客户端和服务器结果集的编码
Set character_set_client=gbk;
Set character_set_results=gbk;
第⼆种插⼊数据的⽅法 insert into 新表 select 列 from 已有表
create table emp1(
id int,
name varchar(100),
gender varchar(10),
birthday date,
salary float(10,2),
entry_date date,
resume text
);
INSERT INTO emp1 select * from emp 将emp表的所有数据复制到emp1中
注意:
1.mysql不⽀持select into
2.在复制时是按照列的顺序依次进⾏
3.新表的列与原来表的列的名字,类型都可以不⼀样,照样复制成功.但是会出现数据转换错误.具体的:名字不⼀样,问题不⼤.类型不⼀样,出现错误,⽐如将int型的数据强制转换成varchar型,会显示0,反之亦然
语法
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值
语法
DELETE FROM 表名 【WHERE 列名=值】
truncate和delete的区别
DELETE 删除表中的数据,表结构还在;删除后的数据可以找回 TRUNCATE 删除是把表直接DROP掉,然后再创建⼀个同样的新表。 Truncate删除的数据不能找回。执⾏速度⽐DELETE快。
DQL数据查询语⾔ (重要)
数据库执⾏DQL语句不会对数据进⾏改变,⽽是让数据库发送结果集给客户端。查询
返回的结果集是⼀张虚拟表。
语法
SELECT 列名 FROM 表名
【WHERE --> GOUP BY -->HAVING–> ORDER BY LIMIT】
语法⼦句说明:
SELECT selection_list / 要查询的列名称 /
FROM table_list / 要查询的表名称 /
WHERE condition / ⾏条件 /
GROUP BY grouping_columns / 对结果分组
HAVING condition / 分组后的⾏条件 /
ORDER BY sorting_columns / 对结果排序 /
LIMIT offset_start, row_count / 结果限定
SELECT * FROM stu;
SELECT sid, sname, age FROM stu;
语法
条件查询介绍
条件查询就是在查询时给出WHERE⼦句,在WHERE⼦句中可以使⽤如下运算符及关键字:
=、!=、<>、<、<=、>、>=;BETWEEN…AND;IN(set);IS NULL; AND;OR;
NOT,XOR (逻辑异或);
例如:SELECT 1 XOR 0 返回结果 1
语法
当想查询姓名中包含a字⺟的学⽣时就需要使⽤模糊查询了。模糊查询需要使⽤关键
字LIKE。
通配符:
_ 任意⼀个字⺟
%:任意0~n个字⺟ ‘张%’
正则表达式
MySQL 同样也⽀持其他正则表达式的匹配, MySQL中使⽤ REGEXP 操作符来进⾏正则表达式匹配。
模式 描述
^ 匹配输⼊字符串的开始位置。如果设置了 RegExp 对象的
Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输⼊字符串的结束位置。如果设置了RegExp 对象的
Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使⽤象 '[.\n]' 的模式。
[...] 字符集合。匹配所包含的任意⼀个字符。例如, '[abc]' 可以匹配"plain"中的 'a'。
[^...] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配
"plain" 中的'p'。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或
"food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
* 匹配前⾯的⼦表达式零次或多次。例如,zo* 能匹配 "z" 以及
"zoo"。* 等价于{0,}。
+ 匹配前⾯的⼦表达式⼀次或多次。例如,'zo+' 能匹配 "zo" 以及
"zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是⼀个⾮负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配
"Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m} m 和 n 均为⾮负整数,其中n <= m。最少匹配 n 次且最多匹配 m次。
1.去除重复记录
去除重复记录(两⾏或两⾏以上记录中系列的上的数据都相同),例如emp表中sal
字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么
想去除重复记录,需要使⽤DISTINCT:
SELECT DISTINCT sal FROM emp;
2.查看雇员的⽉薪与佣⾦之和
因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有⼀个字段不是数值类型,那么会出错。
SELECT *,sal+comm FROM emp;
comm列有很多记录的值为NULL,因为任何东⻄与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下⾯使⽤了把NULL转换成数值0的函数IFNULL:
SELECT *,sal+IFNULL(comm,0) FROM emp;
3.给列名添加别名
在上⾯查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这⼀列给出⼀个别名,为total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
给列起别名时,是可以省略AS关键字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;
查询所有雇员,按⽉薪降序排序,如果⽉薪相同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
聚合函数
sum avg max min count
聚合函数是⽤来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录⾏数;
MAX():计算指定列的最⼤值,如果指定列是字符串类型,那么使⽤字符串排序运算;
MIN():计算指定列的最⼩值,如果指定列是字符串类型,那么使⽤字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1.COUNT
当需要纵向统计时可以使⽤COUNT()。
查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
查询emp表中有佣⾦的⼈数
SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列⾮NULL的⾏数。
2.SUM和AVG
当需要纵向求和时使⽤sum()函数。
查询所有雇员⽉薪和:
SELECT SUM(sal) FROM emp;
3.MAX和MIN
查询最⾼⼯资和最低⼯资:
SELECT MAX(sal), MIN(sal) FROM emp;
当需要分组查询时需要使⽤GROUP BY⼦句,例如查询每个部⻔的⼯资和,这说明要使⽤部⻔来分组。
注:凡和聚合函数同时出现的列名,则⼀定要写在group by 之后
1.分组查询
查询每个部⻔的部⻔编号和每个部⻔的⼯资和:
SELECT deptno, SUM(sal) FROM empGROUP BY deptno;
2.HAVING⼦句
查询⼯资总和⼤于9000的部⻔编号以及⼯资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
注:having与where的区别:
1.having是在分组后对数据进⾏过滤.
where是在分组前对数据进⾏过滤
2.having后⾯可以使⽤分组函数(统计函数)
where后⾯不可以使⽤分组函数。
WHERE是对分组前记录的条件,如果某⾏记录没有满⾜WHERE⼦句的条件,那么这⾏记录
不会参加分组;⽽HAVING是对分组后数据的约束
LIMIT
LIMIT⽤来限定查询结果的起始⾏,以及总⾏数。
1.查询5⾏记录,起始⾏从0开始
SELECT * FROM emp LIMIT 0, 5; 注意,起始⾏从0开始,即第⼀⾏开始!
3.分⻚查询
如果⼀⻚记录为10条,希望查看第3⻚记录应该怎么查呢?
第⼀⻚记录起始⾏为0,⼀共查询10⾏;
第⼆⻚记录起始⾏为10,⼀共查询10⾏;
第三⻚记录起始⾏为20,⼀共查询10⾏;
currentPage = 1
count = 5;
((currentPage-1)*count,count)
其他知识
查询语句书写顺序
elect – from- where- group by- having- order by-limit
查询语句执⾏顺序
from - where -group by - having - select - order by-limit
运算符的优先级
最⾼优先级为: !、BINARY、 COLLATE。