文章目录
Mysql数据库
数据库概述
概念
- 数据库(Database,简称DB) 是按照数据结构来组织、存储和管理数据的仓库.保存有组织的数据的容器(通常是一个文件或一组文件)
- 数据库管理系统(Database Management System,简称DBMS)
① 专门用于管理数据库的计算机系统软件;
② 能够为数据库提供数据的定义、建立、维护、查询和统计等操作功能,并对数据完整性、安全性进行控制;
③ 我们一般说的数据库,就是指的DBMS,例如我们马上学习的MySQL就是其中之一;
常见的关系型数据库服务器(DBMS)
数据库 | 公司 | 特点 |
---|---|---|
Oracle | Oracle(甲骨文/神域) | 运行稳定,可移植性高,功能齐全,性能超群!适用于大型企业领域 所需内存大 |
DB2 | IBM-收费 | 速度快、可靠性好,适于海量数据,恢复性极强。适用于大中型企业领域。 |
SQL Servser | 微软 | 全面,效率高,界面友好,操作容易,但是不跨平台。适用于于中小型企业领域。–有界面–中文 |
Mysql | AB–>SUN–>Oracle | 开源,体积小,速度快。适用于于中小型企业领域。数据库集群 |
SQL概述:
SQL:结构化查询语言(Structured Query Language),是关系数据库的标准语言,它的特点是:简单、灵活、功能强大。
sql包括六个部分
- 数据查询语句(DQL)
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
- 数据操作语句(DML)
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
- 事务处理语言(TPL)
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
- 数据控制语言(DCL)
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
- 数据定义语言(DDL)
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
- 指针控制语言
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
SQL的书写的注意事项:–请遵循一个程序员的基本素养
- 在MySQL数据库中,SQL语句大小写不敏感
- SQL语句可单行或多行书写
- 在SQL语句中,关键字不能跨多行或缩写
- 为了提高可读性,一般关键字大写,其他小写
- 空格和缩进使程序易读
Mysql数据库操作
查看数据库:show databases;
使用数据库:use 数据库名;
创建数据库:create database 数据库名;
删除数据库:drop database;
存储引擎
- MyISAM:拥有较高的插入,查询速度,但不支持事务,不支持外键。
- InnoDB:支持事务,支持外键,支持行级锁定,性能较低。
- 它提供了具有提交、回滚和崩溃恢复能力的事务安全。但对比MyISAM,处理效率差,且会占用更多 的磁盘空间以保留数据和索引
MySQL常用列类型
JAVA | Java备注 | MYSQL | MYSQL备注 |
---|---|---|---|
Int | 短整型 | int | 短整型 |
long | 长整型 | bigint | 长整型 |
float | 单精度 | float | 单精度 |
double | 双精度 | double | 双精度 |
bigdecimal | 金融数据 | decimal | 金融数据 |
String | 字符串 | char varchar | 不可变字符串 可变字符串 |
Boolean | 布尔值 | Bit | 取值0和1 |
查看表结构和删除表
SHOW TABLES; 查看数据库中存在哪些表:
DESC table_name; 查看表结构:
SHOW CREATE TABLE table_name; 查看表的详细定义(定义表的SQL语句)
DROP TABLE table_name; 删除表:
表的约束
- 非空约束(NK):NOT NULL,不允许某列的内容为空。
- 设置列的默认值:DEFAULT。
- 唯一约束(UK):UNIQUE,在该表中,该列的内容必须唯一。
- 主键约束:PRIMARY KEY, 非空且唯一。
- 主键自增长:AUTO_INCREMENT,从1开始,步长为1。
- 外键约束:FOREIGN KEY,A表中的外键列.A表中的外键列的值必须参照于B表中的某一列(B表主键)。
单表查询
简单查询
-
语法:SELECT {*, column [alias],…}
FROM table_name; -
运算:
- 对NUMBER型数据可以使用+ - * /
- 对DATE型数据可以使用+ -
消除结果中重复的数据
只对某一列有效
需求: 查询商品的分类编号。
语法: SELECT DISTINCT 列名,…
过滤查询
比较运算
= > < >= <= != <>
逻辑运算
- AND{&&}
- OR
- (!)NOT
语法:WHERE 条件1 AND/OR 条件2;
注意:字符串和日期要用单引号扩起来.
优先级
比较运算符 > NOT > AND > OR (括号大于一切)
范围查询
- BETWEEN AND
语法:WHERE 列名 BETWEEN
minvalue AND maxvalue:闭区间。
集合查询
- IN
WHERE 列名 IN (值1,值2…);
使用IN运算符,判断列的值是否在指定的集合中。
空值查询
- IS NULL
WHERE 列名 IS NULL;
判断列的值是否为空。
模糊查询
- LIKE
使用LIKE运算符执行通配查询,查询条件可包含文字字符或数字
%:通配符:可表示零或多个任意的字符
_:通配符:可表示任意的一个字符
通配符:用来实现匹配部分值得特殊字符
结果排序
- ORDER BY
ASC:升序 默认值
DESC:降序
ORDER BY 语句出现在查询语句的最后
WHERE 条件 ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC];
注意:别名不能使用引号括起来 否则不能排序
分页查询
SELECT*FROM table_name LIMIT beginIndex,pageSize;
beginIndex = (currentPage-1)*pageSize;
currentPage:需要查询的页数
聚集函数
- COUNT:统计结果个数 值为NULL的不会统计在内
- MAX:统计计算最大值
- MIN:统计计算最小值
- SUM:统计计算求和
- AVG:统计计算平均值 值为NULL的不会统计在内
分组查询
- GROUP BY
可以使用GROUP BY 子句将表中的数据分成若干组,再对分组之后的数据做统计计算
一般使用聚集函数才使用GROUP BY.
SELECT 聚集函数或者分组的列 FROM table_name
WHERE 条件 GROUP BY 列名 HAVING 分组之后的条件;
GROUP BY 后面的列名的值要有重复性分组才有意义
使用HAVING字句,对分组之后的结果作筛选
不能在 WHERE 子句中使用组函数
可以在 HAVING 子句中使用组函数
多表查询
迪卡尔积
- 没有连接条件的表关系返回的结果
- 多表查询会产生笛卡尔积
- 怎么去避免笛卡尔集?
- 在WHERE加入有效的连接条件 等值连接
内连接
隐式内连接
SELECT * FROM product ,productdir WHERE product.dir_id=productdir.id
显式内连接
SELECT * FROM product (INNER) JOIN productdir ON product.dir_id=productdir.id
外连接
左外连接
查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据
SELECT * FROM product p LEFT JOIN productdir pd ON p.dir_id = pd.id
右外连接
查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据.
SELECT * FROM product p RIGHT JOIN productdir pd ON p.dir_id = pd.id
自连接查询
把一张表看成两张来做查询.一定要取别名!!!!
隐式内连接
SELECT sub.dirName,super.dirName FROM productdir super,productdir sub WHERE sub.parent_id = super.id
显示内连接
SELECT sub.dirName,super.dirName FROM productdir super JOIN productdir sub ON sub.parent_id = super.id
子查询(嵌套查询)
一个查询语句嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件
UNION
把多张表的查询结果进行纵向连接
特点:
- UNION联合查询的内容,列的类型可以不一致
- UNION联合查询的内容列数必须一致
- UNION有去重效果 UNION ALL没有去重效果
- 判断去重的标准,查询的所有列必须全部一致
(SELECT ID,NAME FROM order2018)
UNION
(SELECT ID,NAME FROM order2019)
数据操作(DML)
插入数据
INSERT INTO 表(column1,column2,column3...) values(value1,value2,value3...)
插入查询结果
INSERT INTO table_name (column1,column2,column3...)
SELECT (column1,column2,column3...)
FROM table_name
INSERT INTO productdir (dirName,parent_id)
SELECT dirName,parent_id FROM productdir
修改数据
UPDATE 表 SET column=value WHERE condition
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
删除数据
DELETE FROM 表 WHERE condition
- 如果省略了where子句,则全表的数据都会被删除
函数
CONCAT函数
字符串拼接
SELECT CONCAT
(productName,‘的商品的零售价为:’,salePrice)
FROM product;
IFNULL
MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数。 否则,IFNULL函数返回第二个参数
IFNULL(expression_1,expression_2);
如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。