赞
踩
数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
innoDB
目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix这几种。以下是2021年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名: https://db-engines.com/en/ranking)
1979 年,Oracle 2 诞生,它是第一个商用的 RDBMS(关系型数据库管理系统)。随着 Oracle 软件的名气越来越大,公司也改名叫 Oracle 公司。2007年,总计85亿美金收购BEA Systems。2009年,总计74亿美金收购SUN。此前的2008年,SUN以10亿美金收购MySQL。意味着Oracle同时拥有了MySQL 的管理权,至此 Oracle 在数据库领域中成为绝对的领导者。2013年,甲骨文超越IBM,成为继Microsoft后全球第二大软件公司。如今 Oracle 的年收入达到了 400 亿美金,足以证明商用(收费)数据库软件的价值。
SQL Server 是微软开发的大型商业数据库,诞生于 1989 年。C#、.net等语言常使用,与WinNT完全集成,也可以很好地与Microsoft BackOffice产品集成。
IBM公司的数据库产品,收费的。常应用在银行系统中。
PostgreSQL 的稳定性极强,最符合SQL标准,开放源码,具备商业级DBMS质量。PG对数据量大的文本以及SQL处理较快
嵌入式的小型数据库,应用在手机端。 零配置,SQlite3不用安装,不用配置,不用启动,关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,再下次使用数据库的时候自动恢复。
IBM公司出品,取自Information 和Unix的结合,它是第一个被移植到Linux上的商业数据库产品。仅运行于unix/linux平台,命令行操作。 性能较高,支持集群,适应于安全性要求极高的系统,尤其是银行,证券系统的应用
JSON(JavaScript Object Notation)数据库是一种使用 JSON 格式存储和组织数据的数据库。它将数据以类似于 JavaScript 对象的形式进行存储,以键值对的方式表示。JSON 数据库适用于存储和查询半结构化和非结构化数据。
MySQL是一个 开放源代码的关系型数据库管理系统 ,由瑞典MySQL AB(创始人MichaelWidenius)公司1995年开发,迅速成为开源数据库的 No.1。
2008被 Sun 收购(10亿美金),2009年Sun被 Oracle 收购。 MariaDB 应运而生。(MySQL 的创造者担心 MySQL 有闭源的风险,因此创建了 MySQL 的分支项目 MariaDB)
MySQL6.x 版本之后分为 社区版 和 商业版 。
MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL是开源的,所以你不需要支付额外的费用。
MySQL是可以定制的,采用了 GPL(GNU General Public License) 协议,你可以修改源码来开发自己的MySQL系统。
MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持 4GB ,64位系统支持最大的表文件为 8TB 。可以处理拥有上千万条记录的大型数据库。
MySQL使用 标准的SQL数据语言形式。
MySQL可以允许运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP和Ruby等
MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
MySQL Cluster 集群版,开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
MySQL Cluster CGE 高级集群版,需付费。
MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。
开放源代码,使用成本低。
性能卓越,服务稳定。
软件体积小,使用简单,并且易于维护。
历史悠久,社区用户非常活跃,遇到问题可以寻求帮助。
许多互联网公司在用,经过了时间的验证。
Oracle 更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
MySQL 由于其体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了MySQL作为网站数据库(Facebook,Twitter,YouTube,阿里巴巴/蚂蚁金服,去哪儿,美团外卖,腾讯)。
在命令行中将 SQL 文件导入到 MySQL 的步骤:
打开命令行终端。
使用下面的命令连接到 MySQL 数据库:
mysql -u username -p
其中:
-u username
指定数据库用户名-p
提示输入密码(如果设置了密码)连接成功后,进入 MySQL 的命令行界面。
在 MySQL 命令行中,使用以下命令选择要导入数据的数据库:
USE database_name;
其中 database_name
是要导入数据的数据库名称。
使用以下命令导入 SQL 文件:
SOURCE /path/to/file.sql;
其中 /path/to/file.sql
是要导入的 SQL 文件的路径。请根据实际情况提供正确的文件路径。
等待导入操作完成。
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。表具有一些特性,这些特性定义了数据在表中如何存储,类似Java和Python中 “类”的设计。
ORM思想 (Object Relational Mapping)体现:
数据库中的一个表 <—> Java或Python中的一个类
表中的一条数据 <—> 类中的一个对象(或实体)
表中的一个列 <----> 类中的一个字段、属性(field)
表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示
三种:一对一,一对多,多对多
共享主键(Shared Primary Key)方式:
示例SQL语句:
CREATE TABLE 主表名 (
共享主键 数据类型 PRIMARY KEY
);
CREATE TABLE 从表名 (
共享主键 数据类型 PRIMARY KEY,
-- 其他从表字段
FOREIGN KEY (共享主键) REFERENCES 主表名(共享主键)
);
单独主键(Separate Primary Key)方式:
示例SQL语句:
CREATE TABLE 主表名 (
主键名 数据类型 PRIMARY KEY
);
CREATE TABLE 从表名 (
从表主键名 数据类型 PRIMARY KEY,
外键名 数据类型,
-- 其他从表字段
FOREIGN KEY (外键名) REFERENCES 主表名(主键名)
);
实现 :在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的UNIQUE
create table user(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '1:男 ,2:女',
phone char(11) comment '手机号'
)
create table edu(
id int auto_increment primary key comment '主键ID',
degree varchar(20) comment '学历',
......,
userid int unique comment '用户ID',
constraint fk_userid foreign key (userid) references user(id)
)
常见实例场景: 客户表和订单表 , 分类表和商品表 , 部门表和员工表 。
举例:
员工表:编号、姓名、…、所属部门— 从表
部门表:编号、名称、简介— 主表
一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
create table dept(
id int auto_increment comment '部门ID' primary key,
name varchar(10) comment '部门名称'
)
create table student(
id int auto_increment comment '学生ID' primary key,
name varchar(10) comment '学生名字',
dept_id int,
foreign key (dept_id) references dept(id)
)
要表示多对多关系,必须创建第三个中间表,该表通常称为 联接表 ,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。
举例:
create table student( id int auto_increment primary key comment '学生ID', name varchar(10), no varchar(10) ) create table course( id int auto_increment primary key comment '课程ID', name varchar(10) ) create table student_course( id int auto_increment primary key, studentid int not null comment '学生ID', courseid int not null comment '课程ID', constraint fk_courseid foreign key (courseid) references course(id), constraint fk_studentid foreign key (studentid) references student(id) )
版本:MySQL8.0.22
下载后解压,将解压文件下的bin路径添加到环境变量
在mysql文件夹下找到my.ini或my-default.ini,如果没有.ini结尾的文件,直接创建该文件。新增内容为如下,注意basedir和datadir是我自己的路径位置,自定义。记得新增一个文件Data文件夹
[mysqld] #设置3306端口 port=3306 # 设置mysql的安装目录 basedir=D:\DFRT\mysql-8.0.22-winx64 # 设置mysql数据库的数据的存放目录 datadir=D:\DFRT\mysql-8.0.22-winx64\data # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8
在mysql安装目录中打开bin文件夹,运行cmd,执行初始化数据库命令:
mysqld --initialize --console
root用户的初始化密码
**注意:**要是你不小心关掉cmd,或者没记住,那也没事,删掉初始化的 datadir 目录,再执行一遍初始化命令,又会重新生成的。
在mysql安装目录的bin下执行命令
mysql --install [服务名]
’
mysqld --install mysql8
如果提示以下错误,使用管理员身份执行:
安装后使用net start mysql8启动服务,使用net stop mysql8停止服务
mysql -h 主机名 -p 端口号 -u 用户名 -p 密码
实战:
mysql -u root -p
修改账户密码:
alter user 'root'@'localhost' identified with mysql_native_password BY '123456';
注意:命令行分号一定有
quit
exit
c:\>mysql --version
或
mysql>select version()
查看所有数据库
mysql>show databases;
Navicat MySQL是一个强大的MySQL数据库服务器管理和开发工具。它可以与任何3.21或以上版本的MySQL一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等,对于新手来说易学易用。其精心设计的图形用户界面(GUI)可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat支持中文,有免费版本提供。 下载地址:http://www.navicat.com/
SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。这款工具是使用C++语言开发的。该工具可以方便地创建数据库、表、视图和索引等,还可以方便地进行插入、更新和删除等操作,同时可以方便地进行数据库、数据表的备份和还原。该工具不仅可以通过SQL文件进行大量文件的导入和导出,还可以导入和导出XML、HTML和CSV等多种格式的数据。 下载地址:http://www.webyog.com/,读者也可以搜索中文版的下载地址。
SQL:Structure Query Language(结构化查询语言),SQL被美国国家标准局(ANSI)确定为关系型
数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
各数据库厂商都支持ISO的SQL标准,普通话
各数据库厂商在标准的基础上做了自己的扩展,方言
SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,查询内容,更新内容,并删除条目等操作。
Create, Read, Update, and Delete 通常称为CRUD操作。
#单行注释(MySQL特有)
-- 注释文字(--后面必须要有一个空格)
/*多行注释*/
mysql> source d:\mysqldb.sql
判断是否为空使用 is null
select * from departments;
一般不建议使用 *
使用**表别名(Table Alias)和列别名(Column Alias)**来为表和列提供更简洁或易读的名称。这对于复杂的查询或多个表连接非常有用
注意:一旦起了别名就必须使用别名
#表别名
SELECT alias.column FROM tablename AS alias;
SELECT alias.column FROM tablename alias;
#列别名
SELECT column AS alias FROM tablename;
SELECT column alias from tablename;
SELECT e.last_name AS employee_name, d.department_name AS dept_name FROM employees AS e JOIN departments AS d ON e.deptid = d.id;
SELECT DISTINCT department_id FROM employees;
多列去除,只对department_id生效,对salary无效
从 employees
表中选择不重复的 department_id
和 salary
列的数据。这将返回每个不同的 department_id
和对应的 salary
值
SELECT DISTINCT department_id,salary FROM employees;
DISTINCT 需要放到所有列名的前面,如果写成 SELECT salary, DISTINCT department_id FROM employees 会报错。
DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id),只需要写 DISTINCT department_id 即可,后面不需要再加其他的列名了。
所有运算符或列值遇到null结果均为null
空值不等于空字符串,一个空字符串长度是0,每个空值长度是空,MySQL中空值占用空间
SELECT 'MySQL' as corporation, last_name FROM employees;
DESC employees;或 DESCRIBE employees
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
数据类型 | 描述 |
---|---|
INT | 从-231到231-1的整型数据。存储大小为 4个字节 |
CHAR(size) | 定长字符数据。若未指定,默认为1个字符,最大长度255 |
VARCHAR(size) | 可变长字符数据,根据字符串实际长度保存,必须指定长度 |
FLOAT(M,D) | 单精度,占用4个字节,M=整数位+小数位,D=小数位。D<=M<=255,0<=D<=30, 默认M+D<=6 |
DOUBLE(M,D) | 双精度,占用8个字节,D<=M<=255,0<=D<=30,默认M+D<=15 |
DECIMAL(M,D) | 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与 |
DATE | 日期型数据,格式’YYYY-MM-DD’ |
BLOB | 二进制形式的长文本数据,最大可达4G |
TEXT | 长文本数据,最大可达4G |
Select A + B
Select A - B
Select A * B
Select A / B
Select A mod B
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于 | 值,字符串或表达式是否相等 | select C from table where A = B |
<=> | 安全等于 | 安全地判断值,字符串或表达式是否相等 | select C from table where A <=> B |
!= | 不等于 | 值、字符串、表达式是否不相等 | select C from table where A != B |
< | 小于 | 前面的值、字符串、表达式是否小于后面 | |
<= | 小于等于 | 前面的值、字符串、表达式是否小于等于后面 | |
> | 大于 | 前面的值、字符串、表达式是否大于后面 | |
>= | 大于等于 | 前面的值、字符串、表达式是否大于等于后面 | |
ISNULL | 为空运算符 | 值、字符串、表达式是否为空 | select b from table where a is null |
ISNOTNULL | 不为空运算符 | 值、字符串、表达式是否不为空 | |
BETWEEN AND | 两值之间的运算符 | 判断一个值是否在两个值之间 | where c between 12 and 18 |
IN | 属于运算符 | 判断一个值是否为列表中的任意一个值 | where c in(a,b) |
NOTE IN | 不属于运算符 | 判断一个值是否不是列表中的任意一个值 | |
LIKE | 模糊匹配运算符 | 判断一个值是否符合模糊匹配规则 | where name LIKE ‘%li%’ |
REGEXP | 正则表达式运算符 | 判断一个值是否符合正则表达式规则 | |
RLIKKE | 正则表达式运算符 | 判断一个值是否符合正则表达式规则 |
#工资大于10000的员工
SELECT * FROM employees WHERE salary > 10000
#查询department_id是90和60的员工
SELECT * FROM employees WHERE department_id IN (90, 60);
#模糊查询
SELECT * FROM employees WHERE first_name LIKE '%ex%' #是否区分大小写,看操作系统或者字符集
SELECT * FROM employees WHERE first_name like binary '%ex%' # 区分大小写
运算符 | 作用 | 示例 |
---|---|---|
NOT或! | 逻辑非 | select NOT A |
AND | 逻辑与 | select A AND B |
OR | 逻辑或 | SELECT A OR B |
XOR | 逻辑异或 | SELECT A XOR B |
案例
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary
>=10000 AND job_id LIKE %MAN%';
#查询基本薪资不在9000-12000之间的员工编号和基本薪资
SELECT employee_id,salary FROM employees WHERE NOT (salary >= 9000 AND
salary <= 12000);
SELECT employee_id,salary FROM employees WHERE salary <9000 OR salary >
12000;
SELECT employee_id,salary FROM employees WHERE salary NOT BETWEEN 9000 AND
12000;
#正则运算符
SELECT * FROM employees WHERE first_name REGEXP '^A';
运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
>> | 按位右移 |
<< | 按位左移 |
案例
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0。20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20。
案例
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY
hire_date ;
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY
hire_date DESC ;
SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY
annsal;
#多列排序
SELECT last_name, department_id, salary FROM employees ORDER BY
department_id, salary DESC;
LIMIT
实现分页,LIMIT [位置偏移量],一页行数
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
**注:**MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和 “LIMIT4,3;”返回的结果相同。
*分页显示公式:(当前页数-1)每页条数,每页条数
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;
分页查询优化
在进行分页查询时,可以采取一些优化策略以提高查询性能。以下是一些常用的分页查询优化方法:
除了以上的优化策略,还可以考虑数据库服务器硬件的优化、调整查询缓存大小以及并发连接数等因素,以进一步提高分页查询的性能。但需要注意的是,不同的数据库系统可能有各自的优化方法和工具,具体的优化方案需要根据实际情况和数据库系统来选择和实施。
#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments; #出现笛卡尔积
为了避免笛卡尔积,要在WHERE加入有效的连接条件,消除无效笛卡尔积
#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
当前表与自身连接查询,自连接必须使用表别名
例:管理者和工人都是员工
从 employees
表中选择每个员工的姓氏 (worker.last_name
) 和他们的经理的姓氏 (manager.last_name
),并在它们之间加上 ' works for '
字符串
非自连接
对两张不同但有关联的表的查询
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id;
内连接: 查询两张表交集的部分
隐式内连接:select 字段列表 from 表1,表2 where 条件;
select e.name,d.name from emp e,dept d where e.dept_id=d.id;
显示内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件;
select e.name,d.name from emp e inner join dept d on e.dept_id=d.id
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
左外连接,查询左表以及两表的交集数据(相当于查询左表的所有数据,包含交集)。连接条件中左边的表也称为 主表 ,右边的表称为 从表 。select 字段列表 from 表1 left [outer] join 表2 on 条件;
eg :查询emp表的所有数据,和对应的部门信息
右外连接,查询右表以及两表的交集数据。连接条件中右边的表也称为 主表 ,左边的表称为 从表 。select 字段列表 from 表1 right [outer] join 表2 on 条件;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。