MySQL:(一)
数据库概述
什么是数据库
- 数据库是一个文件系统。通过标准SQL语言操作文件系统中数据——用来存放软件系统的数据!
- SQL:Structured Query Language 结构查询语言
常用数据库简介
Oracle:甲骨文公司,专门数据库厂商,收购SUN、MySQL ------- 收费,大型数据库 ,用于任何系统任何平台 神谕 代神说话的人;
MySQL:早期开源免费数据库产品,建议用5.0---5.5
LAMP组合 Linux + Apache + MySQL + PHP 完全开源免费 ,自从mysql被oracle收购后,从6.0开始出现收费版本- DB2:IBM数据库产品,大型收费数据库 与websphere服务器一起使用;
- SYBASE:中等规模数据库,收费 PowerDesigner 数据库建模工具;
- SQL Server:微软公司数据库产品,收费中等规模数据库,操作系统要求是windows 结合.net 一起使用;
Java开发者主要使用 MySQL、Oracle、DB2 三种数据库
MySQL安装配置和卸载
安装配置
- 安装mysql数据库
自定义安装目录:
MySQL Server 默认位置 C:\program files\mysql目录
Server Data File 数据文件 C:\Documents and Settings\All Users\Application Data\MySQL目录
⚠️⚠️⚠️当你需要卸载的时候 需要将此目录删除。否则会导致重新安装数据库失败!因为windoes默认卸载不会删除此目录的。 - 安装过程中配置
- 配置mysql默认字符集
默认latin1等价于ISO-8859-1改为utf8(mysql中没有utf-8) - 将mysql/bin目录配置环境变量path
Include Bin Directory in Window Path——☑️(勾选),自动配置好mysql环境变量,可以帮助我们快速进入mysql数据库的主界面。 - 输入超级管理员root/root,系统默认用户名、管理员:root!验证安装成功
测试mysql是否安装成功,启动cmd窗口:
输入 mysql -u root -p 回车 输入密码 root ==== 出现 mysql> 安装成功!
- 配置mysql默认字符集
- 重置root密码(一般不会重置密码,了解即可)
- 停止mysql服务器 运行输入services.msc 停止mysql服务;
- 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口);
- 新打开cmd 输入mysql -u root -p 不需要密码
- use mysql;
- update user set password=password('abc') WHERE User='root';
- use mysql;
- 关闭两个cmd窗口 在任务管理器结束mysqld 进程;
- 在服务管理页面 重启mysql 服务,密码修改完成。
卸载
- 在控制面板中卸载MySQL;
- 删除mysql 安装目录;
- 删除MySQL数据文件目录(⚠️数据存放目录一定要删除),此目录是隐藏的,需要通过my.ini文件查找,用编辑器打开此文件查找datadir 的路径位置!
MySQL数据库存储结构
数据存储方式
- mysql数据库服务器可以创建多个数据库 :database ,每个database 都是独立的,开发中一般是一个工程对应一个数据库;
- 每一个数据库可以创建多张数据表 table,表是数据库的基本单元,每张数据表用来保存数据记录(表对应java中的对象)。
- SQL语句 (简称: 结构化查询语句 )
特点:非过程性 一条SQL语句一个执行结果
为了使用SQL 编写复杂程序,各个数据库厂商对SQL 进行增强,SQL Server TSQL 、Oracle PLSQL 。
SQL语句分类
按功能分类:定义(DDL)、管理(DML)、控制(DCL)、查询(DQL)
⚠️所有表结构操作语句都是DDL语句
数据库操作语句
创建数据库
- 基本语法:create database 数据库名称;(采用默认字符集)
- create database mydb1;
- 复杂语法:create database 数据库名称 character set 字符集;
- create database mydb2 character set utf8;
- ⚠️每次创建一个数据库,在数据存放目录中生成一个文件夹,每个文件夹中存在db.opt 存放默认字符集和校对规则!
查询数据库
- -- 查看所有数据库
- show DATABASES;
- -- 查看数据库定义信息
- show create DATABASE db_name;
- -- 查看当前使用的数据库
- select DATABASE();
- -- 切换当前数据库
- use db_name;
删除数据库
- -- 删除数据库
- drop DATABASE db_name;
修改数据库编码集
- -- 修改数据库db_name编码集
- alter DATABASE db_name CHARACTER SET gbk;
数据库表结构操作语句
创建表
- 建表语法:create table 表名(列名 类型(长度),列名 类型(长度)... );
一个数据表可以存在很多列,每列具有类型和长度
- ⚠️只有字符串类型必须指定长度,而其它类型都有默认长度;
- ⚠️创建表时没有指定字符集,将采用数据库默认字符集;
- ⚠️创建表之前记得切库,必须使用use db 语法指定操作数据库!
- MySQL常用数据类型
- mysql中字符串型VACHAR、CHAR<--->java中String、char
CHAR是固定长度、VARCHAR是可变长度;例如:char(8) 保存 lisi,因为lisi 只有四个字符,所有会补充四个空格,成为8个字符存入 char(8)中 ,
如果有 varchar(8) 自动根据存放内容改变长度 - mysql数值类型TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE<--->java中byte、short、int、long、float、double
- mysql逻辑性BIT存放一位数值0/1<--->java中boolean
- mysql日期型DATE(只有日期)、TIME(只有时间)、DATETIME(日期时间都有)、TIMESTAMP(日期时间都有)<--->java中Date
DATETIME和TIMESTAMP 表现形式上完全相同,区别就在于TIMESTAMP 在数据库可以自动更新(当前时间) - mysql大数据类型BLOB(存储大二进制数据)、TEXT(存储大文本文件)<--->java中blob(二进制文件)、text(文本文件)
- tinyblob tinytext 255字节
- blob text 64KB
- mediumblob mediumtext 16MB
- longblob longtext 4GB
表约束操作
约束用来保证数据有效性和完整性。
- 主键约束-primary key
- 主键:区分记录中不同记录的唯一字段,该字段赋予主键,称之主键约束(唯一、非空);
- 结论:⚠️表必须含有主键,否则表非法!
- 唯一约束-unique
- 该字段的值不允许重复,比如email 邮箱是不可以重复的
- 一张表中可以有很多个唯一约束,可以设置多个字段联合作为主键--联合主键;
- null值不做比较,即使设置了唯一约束的字段,也可以存在多个null值!
- 该字段的值不允许重复,比如email 邮箱是不可以重复的
- 非空约束-not null
该字段不能为空,必须有值! - 自增长-auto_increment
一般用于主键字段,插入数据时,其值交给数据库去维护! - 建表
- CREATE TABLE `operate_record` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
- `manage_id` bigint(20) NOT NULL DEFAULT '' COMMENT '管理表id',
- `product_id` bigint(20) NOT NULL DEFAULT '' COMMENT '产品编号',
- `product_type` tinyint(4) NOT NULL DEFAULT '' COMMENT '产品类型',
- `trans_id` varchar(50) NOT NULL DEFAULT '' COMMENT '交易编号',
- `user_id` bigint(20) NOT NULL DEFAULT '' COMMENT '用户编号',
- `STATUS` tinyint(4) DEFAULT '' COMMENT '操作:1:额度退出 2:额度恢复 3:额度调整',
- `amount` decimal(18,6) DEFAULT '0.000000' COMMENT '操作金额',
- `is_delete` tinyint(4) NOT NULL DEFAULT '' COMMENT '是否删除:0.不删除 1.删除',
- `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
- `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
- `creator` bigint(20) NOT NULL DEFAULT '' COMMENT '创建人',
- `updator` bigint(20) NOT NULL DEFAULT '' COMMENT '更新人',
- `VERSION` int(11) NOT NULL DEFAULT '' COMMENT '版本',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uniq_operate_record` (`trans_id`,`STATUS`,`is_delete`),
- KEY `idx_manage_id` (`manage_id`),
- KEY `idx_trans_id` (`trans_id`),
- KEY `idx_user_id` (`user_id`),
- KEY `idx_product_id` (`product_id`),
- KEY `idx_product_type` (`product_type`),
- KEY `idx_STATUS` (`STATUS`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作记录表';
- CREATE TABLE `operate_record` (
表结构操作
- 表结构修改
- -- 增加列 语法:alter table 表名 add 列(可以省略列column) 列名 类型(长度) 约束;
- ALTER TABLE `table_name` ADD COLUMN `lock_amount` DECIMAL(18,6) NOT NULL DEFAULT '0.00' COMMENT '锁定金额' AFTER `amount`;
- -- 修改现有列类型、长度和约束 语法:alter table 表名 modify 列名 类型(长度) 约束;
- ALTER TABLE `table_name` MODIFY COLUMN `product_type` TINYINT(10) NOT NULL COMMENT '产品类型...';
- -- 修改现有列(名称、约束等) 语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
- ALTER TABLE `table_name` CHANGE old_column_name new_column_name TINYINT(10) NOT NULL COMMENT '产品类型...';
- -- 删除现有列 语法:alter table 表名 drop 列名;
- ALTER TABLE `table_name` DROP column_name;
- -- 修改表名 语法:rename table 旧表名 to 新表名;
- RENAME TABLE old_table_name to new_table_name;
- -- 修改表字符集
- RENAME TABLE table_name character set utf8;
- -- 增加列 语法:alter table 表名 add 列(可以省略列column) 列名 类型(长度) 约束;
- 数据表删除
- -- 数据表删除
- DROP TABLE table_name;
- -- 数据表删除
- 查看表结构
- -- 查看表结构
- DESC table_name;
- -- 查看当前库所有表
- SHOW TABLES;
- -- 查看建表语句和字符集
- SHOW CREATE TABLE table_name;
- -- 查看表结构
数据库表记录操作语句
Insert语句
- INSERT INTO table_name (`manage_id`, `product_id`, `product_type`, `trans_id`, `user_id`, `STATUS`, `amount`)
- VALUES
- (18, 1008927, 26, '', 1008927, 1, 8000.00);
⚠️补充小知识:
- 通过cmd窗口插入一条中文记录 可能会出现下面的现象:
- insert into employee(id,name,job,salary) values(4,'小明','清洁员',1500);
出错了:
- ERROR 1366 (HY000): Incorrect string value: '\xC3\xF7' for column 'name' at row 1 ;
错误原因:cmd窗口,接受的字符只能是gbk,所以mysql client采用默认字符集编码gbk
查看系统所有字符集:
- show variables like 'character%';
MYSQL中共6处使用了字符集
client、connetion、result 和客户端相关,database、server、system 和服务器端相关- 解决办法:修改客户端字符集位gbk
- 第一种方案:当前窗口临时修改,只对当前窗口有效,关闭后就会失效
- -- 仅对cmd 窗口使用
- set names gbk;
- /* 或 */set character_set_results=gbk;
- -- 仅对cmd 窗口使用
- 第二中方案:配置mysql/my.ini 文件(永久改变字符。一般习惯是utf8 所以不建议修改)
⚠️my.ini文件中,出现[mysql] 表示客户端配置,[mysqld] 表示服务器端配置修改客户端字符集 [mysql] 后字符集 default-character-set=gbk,当修改my.ini配置文件之后,需要重启Mysql 数据库!
- 第一种方案:当前窗口临时修改,只对当前窗口有效,关闭后就会失效
Update语句
- update table_name set status=1 where id in (。。。);
⚠️如果没有where条件语句,默认修改所有行数据,危险操作,三思!
Delete语句
- 语法:delete from 表名 where条件语句; 如果没有where语句,将删除表中所有记录
- ⚠️使用 truncate table 表名;等价于delete from 表名;删除表所有数据;
- delete语句不能删除某一列的值(可使用update)针对记录的删除操作;
- 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table 表名;语句。
- delete from employee where name='zhangsan';
- 面试题:delete删除表所有数据和truncate删除表记录,有什么区别?
- 分类:truncate 属于DDL ,delete 属于DML;
- truncate 删除数据,过程先将整个表删除,再重新创建;delete 删除数据,逐行删除记录 ,表结构存在!
- truncate效率要高于delete;
- 事务管理只能对DML有效,被事务管理SQL语句可以回滚到SQL执行前状态;Truncate数据删除不能回滚,数据无法恢复,相当于delete+commit;
- start transaction;-- 开启事务
- -- truncate table employee;-- truncate删除数据操作,事务不能回滚,数据无法恢复,相当于delete+commit,数据永久删除
- delete from employee;-- 删除表中记录,delete删除的数据可以通过回滚操作来恢复数据!
- select * from test1;-- 查询表,记录不存在
- rollback;-- 事务回滚,表中数据恢复!
- start transaction;-- 开启事务
Select语句
- 基本select查询
- -- 语法一:基本select语句
- -- 查询表中所有列信息
- select * from table_name;
- -- 查询表中指定列的信息
- select 列名,列名... from table_name;
- -- distinct 用于过滤重复数据
- select [distinct] * 列名,列名... from table_name;
- -- 语法二:使用表达式对查询对列进行运算
- select 表达式(列名执行运算) from table_name;
- select name,chinese+math+english as 总分 from exam;
- -- 使用as定义列别名,as可以省略
- select 列名 as 别名 from table_name;
- -- 语法三:使用where子句,进行条件过滤查询
- select * from table_name where name='关羽';
- -- 语法一:基本select语句
- 查询之运算符
- between ... and ... 闭区间(between 70 and 80 等价于 >=70 and <=80);
- select * from exam where english>=90 and english <= 100;
- select * from exam where english between 90 and 100;
- select * from exam where math in(65,75,85);
- select * from exam where name like '赵%';
- select * from exam where chinese is null;
- select * from exam where chinese is not null;
- select * from exam where english>=90 and english <= 100;
- between ... and ... 闭区间(between 70 and 80 等价于 >=70 and <=80);
- 查询之排序
- -- 语法:select * from 表名 order by 列名 asc|desc ; ---- asc升序 desc降序
- -- 默认asc升序
- select * from exam order by math;
- -- 按照英语进行降序排序,英语相同学员按照数学降序
- select * from exam order by english desc,math desc;
- -- 语法:select * from 表名 order by 列名 asc|desc ; ---- asc升序 desc降序
- 查询之函数
聚集函数:指SQL语句中内置函数;
分组函数:用于统计- count:统计查询结果记录条数
- -- 统计总分大于220的人数
- select count(*) from exam where chinese+math+english > 220;
- -- 统计总分大于220的人数
- sum:统计某列数据的和
- -- 统计一个班级语文、英语、数学的成绩总和(使用ifnull函数处理 null情况)
- select sum(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
- -- 统计一个班级语文、英语、数学的成绩总和(使用ifnull函数处理 null情况)
- avg:统计某列平均值
- -- 求一个班级总分平均分(使用ifnull函数处理 null情况)
- select avg(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
- -- 求一个班级总分平均分(使用ifnull函数处理 null情况)
- max:统计某列最大值,min:统计某列最小值
- -- 求班级最高分和最低分(数值范围在统计中特别有用)
- select max(chinese+math+english) ,min(ifnull(chinese,0)+ifnull(math,0)+ifnull(english,0)) from exam;
- -- 求班级最高分和最低分(数值范围在统计中特别有用)
- 语法:select 分组函数 from exam group by 列名;
- -- 按照某列进行分组统计(分组操作,就是具有相同数据记录分到一组中,便于统计)
- -- 查询购买了几类商品,并且每类总价大于100的商品
- select product,sum(price) from orders group by product having sum(price) > 100;
- -- 按照某列进行分组统计(分组操作,就是具有相同数据记录分到一组中,便于统计)
- 面试题:where 和 having 条件语句的区别 ?
- where 是在分组前进行条件过滤,having 是在分组后进行条件过滤;
- 使用where地方都可以用 having替换;
- having可以使用分组函数,而where后不可以用分组函数
- count:统计查询结果记录条数
- SELETE语法小结
- -- select 语句写法 :
- -- S-F-W-G-H-O 组合 select ... from ... where ... group by... having... order by ... ;
- -- 数据库解析的顺序:不能改变
- -- 解析顺序 : from - where - group by - having - select - order by
- -- select 语句写法 :
MySQL数据库备份和恢复
- 数据库备份
备份命令 mysql/bin/mysqldump 将数据库SQL语句导出
语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径
⚠️备份时,脚本没有建库语句! - 恢复数据库
- mysql命令~cmd下
- 先登录mysql必须要手动添加数据库db_name--->exit
- mysql/bin/mysql 将sql文件导入到数据库
- 脚本里面添加建库语句
- 登录mysql > source e:/kk.sql 回车
- 补充:恢复SQL也可以在数据库内部执行 source e:\kk.sql
source
- mysql命令~cmd下
案例练习
链接: https://pan.baidu.com/s/1i4JU1NJ 密码: yfqn
MySQL:(一)的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- mysql每秒最多能插入多少条数据 ? 死磕性能压测
前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...
- LINUX篇,设置MYSQL远程访问实用版
每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- 当忘记mysql数据库密码时如何进行修改
因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...
随机推荐
- 2019春第九周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 能解更多的题 参考文献与网址 C语言 ...
- Centos7 HyperLedger Fabric 1.4 生产环境部署
Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...
- C++ MFC万能的类向导
MFC的类向导 只要你掌握了类向导,你基本就已经掌握了MFC了,毕竟布局和代码都是自动生成,再加上C++基础上手还是挺快的,剩下的就是多多练习了. 转自: https://blog.csdn.net/ ...
- sping_依赖注入的三种方式
1. set注入:通过setxxx()给属性赋值 <!--id是对象--> <!--class是类--> <bean id = "student" ...
- SQLServer无法打开用户默认数据库 登录失败错误4064的解决方法
无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除. 解决办法是使用管理员帐户修改此登录帐户的默认数据库. 1.使用管理员帐号登入企业管理器,在“对象资源管理器”中,展开“安全性”— ...
- RESTful API 最佳实践----转载阮一峰
文章地址http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
- sql server导出数据,本地数据库远程连接不上,怎样设置防火墙(自用)
控制面板——>系统安全——>windows防火墙——>高级设置 新建入站规则: 将一下两个应用 允许入站: D:\Program Files (x86)\Microsoft SQL ...
- sitecore 获取item的URL
给出一个简单的sitecore项: Item item; 该项目本身不包含它的网址.要获取项目的URL,您需要调用static类Sitecore.Links.LinkManager string ur ...
- jdk5升8问题记录-Spring2升4
Spring2.x升4.x Hibernate3.x升5.0 jdbcOperations.queryForInt 替换为 queryForObject(sql, parameters, Intege ...
- pycharm2018安装教程 pycharm2018永久激活教程
安装教程 下载pycharm 2018.3.2安装文件,可以直接点击下载网盘下载 激活码地址:http://demo.liuy88.cn/jp0876.html 下载完成后,双击exe即可开始安装 点 ...