Mysql加强
文章目录
1. 多表查询
1.1 笛卡尔积
没有连接条件的表关系返回的结果(表之间数据组合的结果)。
注意:连接 n张表,至少需要 n-1个连接条件。
1.2 外键约束
主键约束(PRIMARY KEY): 约束在当前表中,指定列的值非空且唯一。
外键约束(FOREIGN KEY): A表中的外键列. A表中的外键列的值必须参照于B表中的某一列(B表主键)。
1.3 内连接查询
1.3.1 显示内连接
SELECT <selectList> FROM A [INNER] JOIN B ON A.列 = B.列
1.3.2 隐式内连接
SELECT <selectList> FROM A ,B WHERE A.列 = B.列
- 在做等值连接的时候,若A表中和B表中的列名相对. 则可以简写:
SELECT <selectList>
FROM A [INNER] JOIN B USING(**同名的列)**
前提:在emp和dept表中都有deptno列. 并且是外键关系。
如: SELECT * FROM emp JOIN dept USING (deptno)
1.4 外连接查询
- 左外连接:查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据。
- 右外连接:查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据。
SELECT
<selectList>
FROM
A
LEFT/RIGHT OUTER JOIN B ON
(A.column_name = B.column_name);
1.5 自连接查询
自连接查询:把一张表看成两张来做查询,一定要取别名。
1.6 子查询
一个查询语句嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件。一般嵌套在WHERE或者FROM字句中。
- 单行单列子查询:
-- 需求: 查询零售价比罗技MX1100更高的所有商品信息。
SELECT * FROM product
WHERE salePrice > (
SELECT salePrice FROM product WHERE productName = '罗技MX1100'
)
- 单行多列子查询
-- 需求: 查询分类编号和折扣与罗技M100相同的所有商品信息。
SELECT * FROM product
WHERE (dir_id,cutoff)=(
SELECT dir_id,cutoff FROM product WHERE productName = '罗技M100'
)
2. 数据操作(DML)
2.1 插入数据
1.插入完整数据记录
INSERT INTO table_name (column1,column2,column3...)VALUES (value1,value2,value3...);
2.插入数据记录一部分
INSERT INTO table_name VALUES (value1,value2,value3...);
3.插入多条数据记录(MySQL特有)
INSERT INTO table_name (column1,column2,column3...)
VALUES (value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3...)..;
4.插入查询结果
INSERT INTO table_name (column1,column2,column3...)
SELECT (column1,column2,column3...)
FROM table_name
2.2 修改数据
UPDATE table_name
SET columnName = value [, columnName = value] …
[WHERE condition];
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
2.3 删除数据
DELETE FROM tablename [WHERE condition];
如果省略了where子句,则全表的数据都会被删除
3. 数据库的备份与恢复
- 导出:
mysqldump -u账户 -p密码 数据库名称>脚本文件存储地
mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql
- 导入:
mysql -u账户 -p密码 数据库名称< 脚本文件存储地址
mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql
4. 函数
- cast函数
cast(值 as 类型)
cast('123' as SIGNED) 将123转换为int类型,返回值为整型类型
- convert函数
convert('123',SIGNED)
可以转换的类型有限制:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
- decimal类型
column decimal(P,D)
P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。
- ifnull函数
IFNULL(expression_1,expression_2);
如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果。
5. 索引
索引是创建表在表上,是对数据库表中一列或者多列的值进行排序的一种结构。索引可以提高检索的速度。缺点创建和维护索引会耗费内存、时间,索引需要占用物理空间,影响数据插入的速度(解决办法是:先删除表中的索引,然后插入数据,插入数据完成后再创建索引)。
创建索引的语法:
-- 在studnet表的age字段上添加索引,此索引按照从小到大的顺序排列。
CREATE INDEX index_age ON student(age ASC);
6. 视图
视图是一种虚拟的表,是从一个或者多个表中导出来的数据。数据库中只存放了视图的定义,没有存放视图中的数据。这些数据还是存放在原来的表中。因此,视图中的数据依赖于原来的表中的数据。
创建视图的语法:
-- 创建一个视图,包括studnet的姓名和年龄
CREATE VIEW student_view AS SELECT name,age from student;
7.数据库三大范式
-
第一范式:要求表的每个字段必须是独立的不可分割的单元(数据库表的每一列都是不可分割的原子数据项)。
-
第二范式:在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系的(属性完全依赖于主键)。
-
第三范式:在第二范式的基础上,要求表的除主键以外的字段只能和主键有直接决定的依赖关系(任何非主属性不依赖于其它非主属性)。