1.数据库概述
2.数据库(DataBase:DB):
数据库是按照数据数据结构,存储,组织和管理数据的仓库
ps:存储和管路仓库相当于就在磁盘上操作文件
数据库管理系统:
是用于专门管理数据库,是一个计算机软件,提供对数据库的简历,维护,查询,和统计等操作
ps:我们一般所说的数据库都是数据库服务器DBMS,指的是数据库的服务端
随着大数据的不断发展,此时出现一种数据库----非关系型数据库,NOSQL数据库
常见的非关系型数据库:
- 键值存储的数据库:Oracle、DBD、Redis、BeansDB
- 列式存储的数据库:HBase、Riak
- 文档型数据库:MongoDB、CouchDB
- 图形存储的数据库:Neo4J、InfoGrid
关系型数据库
MySQL:是一个典型的关系型的数据库
SQL Server 微软 :全面性高,效率高,界面友好,操作方便,但是不会跨平台,中小企业使用(免费。企业版收费)
DB2:大型的关系型数据库 IMB :速度快,可靠性好,适用于海量数据,恢复性极强,适用于银行,电力,金融(付费)
Oracle: 甲骨文(Oracle):运行稳定,速度慢,可移植性高,功能齐全,适用于大企业(付费)
MySQl:开源的,体积小,速度快,全面支持SQL,适用于中小企业(完全免费)
SQL:结构化查询语言,是关系型数据库的标准语言
特点:简单,灵活,功能强大
SQL被分为六个部分
- 数据查询语言(DQL):
- 语句也被称为“数据检索语句”,用表中获取数据,确定数据怎样在应用程序显示
- SELECT WHERE [ORDER BY] [GRPUPBY BY] HAVING
- 数据操作语言(DML)
- 操作数据库使用:INSERT UDDATE 和DELETE一般都是动词
- 事务处理语言(TPL)
- 它的语句是确保DML语言可以影响其行为BEDIN COMMIT 和 ROLLBACK
- 数据控制语言(DCL)
- 控制数据的操作GRANT REVOKE 对单个用户或用户主的数据库的访问
- 数据定义语言(DDL)
- 动词,CREATE和DROP 创建一个表或者删除一个表
- DDL语言中也包括查询的一部分
- 指针(游标)控制语言(CCL)
- 它可以操作数据库中的游标位置,通过位置可以单独的进行行的操作
- FETCH INTO 和 UPRDATE WHERE CURRENT
书写SQL的规则:
- 在数据库中SQL语言的大小不敏感, SELECT/select 。建议大写
- SQL语句单行或多行书写
- 在SQL语句汇总,关键字不能多行或缩写
- 为了可读性,建议关键字大写,其他小写
表的概念:
MySQL是一种关系型数据库,关系型数据库最重要的概念就是表
有固定的列数和任意的行数组成的关系--->表
数据库中的表,可以看做一个二维表(可以想象成二维数组),每一行都是一个实体
表中的列表示属性,每一行记录数据 就相当于属性的值
先以一个面向对象的思维来看待这张表:
public class Student {
private int stuNO;
private String name;
private int age;
}
Student stu = new Student();
stu.setStrNO(10086);
面向对象思维---->关系型数据库
类 ----->表
属性 ----->列(属性)
对象 ------>表中一行的数据
我们是不能直接操作表的,因为表示存储到数据库中的,先连接数据库,
安装MySQL:
如何卸载MySQL:
- 软件管家直接卸载MySQL
- 控制面板--->程序和功能---->卸载MySQL
- 在我的电脑中----->C盘下有一个隐藏文件C:\ProgramData\MySQL删除MySQL
登录MySQL
1.直接登录MySQL
1.1.直接通过cmd------->mysql -u root -p 回车
1.2.在开始菜单
- 常用命令
- 查看数据库中有哪些数据库:show databases;
- 使用那个数据库:use 对应的数据库名称---->得到一个打印结果
- Database change数据改变成功已经使用到所有使用的数据库
- 查询对应数据库中的所有表:show tables;
- 创建自己的数据库 create database 库的名字
- 删除数据库,drop database 库的名称,系统库不能删除:---->一旦库没有了,那么旗下的表都没有了,数据就没了
- 只要是命令就建议大写:因为在控制台dos命令下,所以,按方向键上下,可以获取上下次用的命令
- MySQL的存储引擎
- MySQL中的数据用这种不同的技术存储在文件(内存中),这些每一种技术都应用不同的存储机制,索引技巧,锁定水平,并且最终提供的功能也不相同
- MyISAM:用于较高的插入查询速度,但是不支持事务,不支持外键,一般不选择这个
- InnoDB:支持事务,支持外键,支持行锁定,性能低,一般建议使用
- MySQL中的常用类型
- 整数类型是最常用的,MySQL中存储整数------对应的java数据类型:INT/IN
- MySQL以一个可选的显示宽度指示器对SQL中的标准进行扩展,例如指定一个字段INT(6),就可以保证所有包含的数据少于6个的值从数据中检索出来时自动填充空格。需要注意的是使用一个宽度指示器,不会影响字段大小和他存储的范围,一般只是用于指定数字的宽
- 小数类型可以存放小数也可以存放整数FLOAT[(S,P)]---->S代表范围(最多有S位数组成),P代表精度(P位小数)。Double[(S,P)]一样
- 若使用存储货币,使用DECIMAL(高精度类型),使用方法可以参考double
MySQL的类型 java的数据类型
-----------------------------------------------------------
FLOAT float/Float
DOUBLE double/Double
DECIMAL BigDecimal
- 向MySQL中存储字符串
char(size)定长字符,size指N个字符数,若插入的字符长度超过指定长度,会被截取掉会给一个警告
varchar(size)是一个边长字符,size指N个字符数,若插入的字符长度超过指定长度,会被截取给一个警告
MySQL5之前char和varchar的取值长度都是0-255
但是在5之后,varchar存储范围最大是0-65535
若存储的是一些文章,可以参考存文本存储可以使用TEST系列类型
在MySQL中字符使用的是单引号‘’,相当于java中的String / StringBuffer/无论字符长度多长一律‘ ’引起来
char和varchar的对比:
char(5)---->所占用的空间是5个字节,表示char(5)的固定长度就是五个字节:例如:name char(5)插入值:‘1’和‘11111’---->都是5个字节,固定的
varchar(5)----->所占用的字节数会随着实际长度增加而逐渐+1,例如:name char(5)插入值:‘1’是一个字节,‘11’是两个字节
- MySQL中存储时间和日期
- 日期类型:DATETIME
- DATE
- TIME
- YEAR
- TIMESTAMP
- 在MySQL中存储日期使用 ‘ ’ 引起来,相当于java中Date/Calender
- MySQL中还可以存储二进制对象
- 存放图形声音和映像和视频,二进制对象,0-4G
- 但是,在开发中我们一般存储二进制文件保存的路径而非真实的数据
- BIT:开发中一般用来存储Boolean类型----->0->false,1->true
- 操作库:
-
创建一个数据库 CREATE DATABASES 创建数据库指定编码集 CREATE DATABASES 数据库名字 character set gbk; 查询数据库 SHOW DATABASES 查看定义的数据库信息 SHOW CTEATE database 对应的数据库名称 +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | mydb2 | CREATE DATABASE `mydb2` /*!40100 DEFAULT CHARACTER SET gbk */ | +----------+---------------------------------------------------------------+ 删除数据库: DROP database 数据库名; 删库之前要备份,库一旦没有,里面表没了,表没了,数据就没了 修改: 修改数据库编码表 alter database 数据名 character set utf8; 其他: 使用某个数据库 use 数据库名字 查询当前数据库 select database +------------+ | database() | +------------+ | NULL | +------------+
- 表的操作
创建表:
CREATE TABLE 表名{
列表1 列的类型 [约束]
列表2 列的类型 [约束]
列表3 列的类型 [约束]
..........
列表n 列的类型 [约束]
}
ps:创建表的时候需要大家换行书写
若在表中使用到了关键字
例如:创建一个订单表(order),但是order 是数据库中的关键字(排序)
此时表最好是使用X-order,就可以区分关键字
若需要列明需要使用order此时使用(`)`order`
ps:开发中一般X---->t代替---->table---->t-order
- 创建一张student表,记录学生的信息id,name,age
create table t-student{
id INT;
name varchar(100);
age INT;
};
ps:数据库中表示字符串数据类型
char和varchar
无论是char还是varchar,只要是超过存储范围,都会被截取,并提示警告
一般情况下,要存储字符串使用varchar
- 查询当前数据库中的表
show tables;
+-----------------+
| Tables_in_mydb1 |
+-----------------+
| t_student |
+-----------------+
- 查看表中的字段信息
desc 表名;
+属性 ---类型----+----------可以非空----+主键------+----默认值-+-额外的--------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
- 在表中添加一条新的列
alter table 表名 add 列名 数据类型;
- 删除表中的列(一次只能删除一列)
alter table 表名 drop 列名;
- 更改表的名称
rename table 原表名 to 新表名;
- 查看建表的细节
show crate table 表名;
- 修改表的字符集
alter table 表名 character set 字符集;
- 修改列名
alter table 表名 change 原有列名 新列名 数据类型;
- 删除表
drop table 表名;
- 表中的约束(只能针对列进行约束)
- 非空约束:NOT NULL 代表不允许当前列为空的内容
- 设置默认列的默认值:相当于DEFAULT
- 唯一约束:在当前列中的内容必须是唯一的,unique
- 主键PRIMARY KEY---->primary key, 非空且唯一
- 主键自增长:AUTO_INCREM
DML操作
DML是针对表中的数据进行增删改等操作不要和DDL(对库,表,列进行操作)混了
查询单独讲
ps:insert 插入 update 更改 delete 删改 ---->关键字
在MySQL中字符串类型和日期类型都需要使用 ‘单引号’ 引起来,空值是null
- 插入操作INSERT
- 语法:INSERT INTO 表名(列名) VALUES(列对应的值);
- 需要注意:列名和列值要一一对应,可以将插入表中的数据看做java中形参的赋值
- 值不能超过,定义的长度
- 如果插入的是空值,使用null
- 插入的日期和字符串一定要使用 ' 单引号 '。
- 如何查看数据库中的具体信息
show variables like ‘charater%’
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\ |
+--------------------------+---------------------------------------------------------+
- 修改操作UPDATE
- 语法:UPDATE 表名 SET 列名 = 列值..........;
- UPDATE 表名 SET 列名 = 列值 WHERE 列名 = 值;
1.将所有员工的薪水修改为5000元,
update emp set money=5000;
2.张三 改为 30000;
update emp set money=30000where name='zhangsan';
3.将姓名为lisi的员工 薪水改40000,gender 改 man
update emp set money=40000 gender='man' where name='lisi';
4.将性别是man 的员工薪水在原有基础上增加1000
update emp set money=money+1000 where gender='man';
- 删除操作 delete
语法:
- delete from 表名;-->删除表(表中的数据)
- delect from 表名 where 列名 =值 --->删除一条记录
1.删除表中ID为3的记录
delete from t_emp where id = 3;
2.删除表中所有的记录
delete from t_emp;
ps: 使用delete这种方式 删除表中的数据 表的结构还在 删除后可以找回
3.truncate 删除表中记录
truncate table emp;
ps:使用truncate 删除的 表 相当于drop掉了
若需要再使用,就需要重新创建一个新表 truncate删除的数据是不能找回的 删除速度是快于delete
- 排重 distinct
- select distinct dir_id from product;
通过工具将表导入到了数据库操作第一张表示商品表
id-----> 商品id 主键
productName--->商品的名称
dir-id--->商品分类编号
salePrice--->零售价格
suppiler 供货商
brand 品牌
cutoff 折扣价
简单查询
1.将product这张表所有数据都查询出来
可以使用 * 代表所有的列
- select * from product;
2.将product表中的商品id 商品名称,零售价格,查询出来
- select id,productName,salePrice from product;
- 排除重复
需求查询商品分类编号
select dir_id from product;
查询商品编号是不是有重复
select distinct dir_id from product;
使用了排重,使用了两列,只有两列数据都一样的时候才能被认为是同一条
- 数学运算查询:
对number类型数据(小数,整数,)可以使用算数运算符来创建表达式(+-*/)
对DATE可以使用部分运算符俩创建表达式(+ -)
同级运算符的顺序是从左到右计算,表达式中使用了()可以强行改变优先级
<小于 >大于 <=小于等于 >=大于等于 !=和<> 不等于
- 需求:查询所有货品id,名称,批发价格(批发价=零售*折扣)
ps:将列名看做属性或是参数,使用列名下面的数据计算即可
select id,productName,salePrice*cutoff from product;
- 需求2.查询所有货品id,名称,各进50各的成本价格
select id,productName, costPrice*50 from product;
- 需求3.并且每个产品运费是1元
select id,productName,(costPrice+1)*50 from product;
- 设置列的别名:------>AS
1.能改变列的标题头,并不会影响原表的表头
2.用于表示计算的结果
3.作为列的别名
4.如果别名中使用了特殊字符或者强制大小写,或者空格,都需要使用单引号引起来
select id,productName,(costPrice+1)*50 as totalCostPrice from product;
ps:AS是可以省略的,但是尽量带上AS
select id,productName,(costPrice+1)*50 totalCostPrice from product;
- 设置显示格式查询:
为了用户浏览数据更加方便,此时可以使用一个关键字,'concat 是一个函数'来连接字符串,
需求:查询商品的名字和零售价格,格式:xxx商品的零售价格为:xxx
select CONCAT(productName,'商品的零售价格为:',salePrice) as productSalePrice from product;
- 过滤查询:
语法:
select 列 from 表名 where 子句限定(查询限定条件)
where是一个条件限定语句where后面会紧跟着你所限定的条件
需求:查询零售价格为119的所有货品信息
select * from product WHERE salePrice=119;
需求:查询货品名称为'罗技G9X'的所有货品信息
select * from product WHERE productName='罗技G9X';
版本二:
select * from product WHERE productName<>'罗技G9X';
需求:查询分类编号不等于2的货品信息
select * from product WHERE dir_id<>2;
select productName,salePrice from product WHERE salePrice<=200;
select id,productName, salePrice*cutoff as pf from product HAVING pf>350;
- SQL中查询语句中的执行顺序
1.from子句 确定是从哪一张表中取做的查询
2.where子句 从表中直接筛选出符合条件的数据
3.select子句 从筛选之后的记录中集中显示出某些类
4.ORDER BY子句 对查询结果进行排序
- 逻辑运算符:
AND(&&)组合的条件都为true返回true
OR(||)组合条件只要有一个位true返回true
NOT(!)若条件是false返回true
需求:查询id,货品名称,批发价格,在300到400之间的货品
select id,productName,salePrice*cutoff as A FROM product HAVING A>300 AND A<400;
需求查询id,货品名称,分类编号为2,4的所有货品
select id,productName,dir_id as A FROM product HAVING A=2 OR A=4;
需求:查询id,货品名称,分类,编号不为2的所有商品
select id,productName,dir_id as A FROM product HAVING A!=2;
select id,productName,dir_id as A FROM product HAVING A<>2;
select id,productName,dir_id as A FROM product HAVING NOT A=2;
需求:查询id,货品名称,分类标号的货品零售大于等于250,或者成本大于等于200的所有商品
select id,productName,salePrice,costPrice FROM product WHERE salePrice>=250 OR costPrice>=200;
优先级关系:
1.比较运算符 2.NOT 取非 3.AND(&&) 4.OR(||)
- 范围查询:BETWEEN AND
使用BETWEEN AND运算符显示某一值的范围记录,这个操作符常见的使用在数字类型或者日期类型的范围上
语法:
select 列 from 表 where between 最小值 AND 最大值;
需求:查询id,货品名称,批发价格,在300到400之间的货品
select id,productName,salePrice*cutoff as A FROM product HAVING A>300 AND A<400;
select id,productName,salePrice*cutoff as A FROM product HAVING A between 300 AND 400;
select id,productName,salePrice*cutoff as A FROM product HAVING NOT A between 300 AND 400;
- 使用IN运算符
判断列的值,是否存在指定的集合中
语法:
select 列 from 表 where 列 IN(值1,值2)
需求查询id,货品名称,分类编号为2,4的所有货品
select id,productName,dir_id as A FROM product HAVING A IN(2,4);
需求:查询id,货品名称,分类,编号不为2,4的所有商品
select id,productName,dir_id from product where NOT dir_id IN(2,4);
- 空值查询---IS NULL
NULL表示某一列没有数据也不是空字符串
IS NULL:判断列的值是否为NULL
需求:查询商品名为NULL所有的商品
1.向表中插入一行数据都是NULL
INSERT INTO product(productName,dir_id,salePrice,supplier,brand,cutoff,costPrice)VALUES(null,null,null,null,null,null,null,null);
select * FROM product;
- 模糊查询:like
使用like运算符执行通配查询,查询条件可以包含文子字符或数字
通配符匹配模式:
%:可以表示零个或多个任意字符
%字符串在后 代表着以xxx开头, %在字符串前面,代表以xxx结尾
_:可以表示一个字符
需求:查询id,货品名称,匹配'罗技M'
select id,productName from product where productName like '罗技M%';
需求:查询id,货品名称,分类编号,零售价格大于等于200货品或名称名称能匹配'罗技M1'后两个的商品
select id,productName,dir_id,salePrice from product WHERE salePrice>=200 OR productName like '罗技M1__';
- 结果排序
使用当前ORDER BY子句将查询的记录进行排序
ASC:升序(可以省略)
DESC: 降序
ps:ORDER BY语句出现在SELECT语句的最后
语法:
select 列 from 表 where 列 条件 ORDER BY 列名[ASC/DESC]......
需求:查询id,货品名称,分类编号,零售价格,按照零售价格升序打印
select id,productName,dir_id,salePrice from product ORDER BY salePrice ASC;
需求:查询id,货品名称,分类编号,零售价格,按照分类编号排序降序,在按零售价格排序升序
select id,productName,dir_id,salePrice from product ORDER BY dir_id DESC,salePrice ASC;
需求:查询M系列并按照批发价格排序
select productName,salePrice*cutoff as A from product where productName like '%M%' ORDER BY salePrice*cutoff ASC;
需求:查询分类编号为2并按照批发价格排序
select dir_id,salePrice*cutoff as A from product where dir_id =2 ORDER BY salePrice*cutoff ASC;
select语句的执行顺序:
先执行from---->where--->select--->ORDER BY