MySQL基础
1.数据库
1.数据库(Database,简称DB):是按照数据结构来组织、存储和管理数据的仓库.保存有组织的数据的容器(通常是一个文件或一组文件)
2.数据库管理系统(Database Management System,简称DBMS)
3.数据库应用系统(Database Application System)
2.数据库的分类
1.数据库分类:
(1)层次数据库和网状数据库技术阶段
(2)关系数据库技术阶段
①经典的里程碑阶段,代表DBMS:Oracle、DB2、MySQL(重点学习)、SQL Server、SyBase等
(3)非关系数据库技术阶段
关系型数据库存在数据模型,性能,拓展伸缩性的缺点,出现了
①ORDBMS:面向对象数据库技术
②NoSQL :结构化数据库技术
③NoSQL数据库:
MongoDB、 Oracle的NoSQL、Hadoop的HBase、Lucene/Solr等
2.SQL介绍
1.概念:结构化查询语言(Structured Query Language),是关系数据库的标准语言。
2.特点:简单、灵活、功能强大
3.SQL包含六个部分
(1)数据查询语言(DQL):用来搜索数据库里面的数据
(2)数据操作语言(DML):对数据库(表)里的数据进行添加,修改,删除
(3)事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新
(4)数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问,某些RDBMS可用GRANT或REVOKE控制对表单个列的访问
(5)数据定义语言(DDL):创建删除修改数据库(表,列…)
(6)指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作
4.SQL的书写规范:
3.连接MySQL
在运行窗口或者命令提示符窗口输入如下的命令:
i.mysql -uroot -padmin -hlocalhost -P3306 root:用户名 admin:密码
或者:mysql -uroot -padmin -h127.0.0.1 -P3306
或者:mysql -uroot -padmin -h192.168.1.100 -P3306
localhost 和 127.0.0.1 都代表的本机
ii.如果数据库在本机并且端口是默认端口3306,可以这样简写:
mysql -uroot -padmin
iii.直接在开始 > 程序 > MySQL 中点开MySQL的命令提示符窗口, 然后输入密码即可
4.MySQL数据库操作:
(1)数据库和数据库对象:
数据库:存储数据库对象的容器。
数据库对象:存储,管理和使用数据的不同结构形式,如:表、视图、存储过程、函数、触发器、事件等。
数据库分两种:
7.查看表结构和删除表
SHOW TABLES; 查看数据库中存在哪些表:
DESC table_name; 查看表结构:
SHOW CREATE TABLE table_name; 查看表的详细定义(定义表的SQL语句)
DROP TABLE table_name; 删除表:
8.约束
约束就是给表中的数据规定取值的规定,比如能否为空,能否重复取值等
非空约束
字段名 类型(长度) Not Null,
不允许字段中的数据为空,Not Null
默认值
字段名 类型(长度) default 默认值,
当前列若没有值存入,则使用定义好的默认值,使用关键字default
唯一约束
字段名 类型(长度) unique,
当前列的取值必须是唯一的,不能重复,使用关键字unique
Null值在MYSQL中可以多个,但有些数据库不可以
主键约束
字段名 类型(长度) primary key,
主键约束就是唯一且非空的意思,使用关键字primary key
主键约束分类
主键的设计一般来说是选取某一列作为主键【推荐】
选取多列作为主键称之为复合主键【不推荐】
MySQL增强
1.多表查询
1.交叉查询:
(1)笛卡尔积:
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
实际运行环境下,应避免使用全笛卡尔集
注意:连接 n张表,至少需要 n-1个连接条件
(2)外键约束:
主键约束(PRIMARY KEY): 约束在当前表中,指定列的值非空且唯一
外键约束(FOREIGN KEY): A表中的外键列. A表中的外键列的值必须参照于B表中的某一列(B表主键).
2.内连接查询:
(1)分为:隐式内连接、显示内连接,其查询效果相同
(2)隐式:
SELECT
FROM A ,B WHERE A.列 = B.列
(3)显示:(推荐)
SELECT
FROM A [INNER] JOIN B ON A.列 = B.列
注:在做等值连接的时候,若A表中和B表中的列名相对. 则可以简写:
SELECT
FROM A [INNER] JOIN B USING(同名的列)
前提:在emp和dept表中都有deptno列. 并且是外键关系。
如: SELECT * FROM emp JOIN dept USING (deptno)
3.外连接查询:
(1)分为:左外链接与右外链接
(2)左外连接:查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据
(3)右外连接:查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据
(4)语法:
SELECT
FROM A LEFT/RIGHT OUTER JOIN B
ON (A.column_name = B.column_name)]
4.自连接查询:
(1)(分为隐式与显示)把一张表看成两张来做查询,一定要取别名
(2)隐式内连接:
SELECT sub.dirName,super.dirName
FROM productdir super,productdir sub
WHERE sub.parent_id = super.id
(3)显示内连接:
SELECT sub.dirName,super.dirName
FROM productdir super JOIN productdir sub
ON sub.parent_id = super.id
5.子查询:
(1)子查询(嵌套查询):一个查询语句嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件。
一般嵌套在WHERE或者FROM字句中
(2)单行单列子查询:
SELECT * FROM product
WHERE salePrice > (SELECT salePrice FROM product WHERE productName = ‘罗技MX1100’)
(3)单行多列子查询:
SELECT * FROM product
WHERE (dir_id,cutoff)=(SELECT dir_id,cutoff FROM product WHERE productName = ‘罗技M100’)
2.DML(操作数据:增删改)
MySQL高级
1.联合查询 (union)
1.作用:把两组结构相同的数据合并 (纵向即上下)
2.特点:
(1)合并的数据结构必须结构相等
(2)union(不允许重复值) 和union all(允许重复值,性能高)
3.语法:
select * from 表1
union /union all
select * from 表2
4.注意:
1.UNION联合查询返回的列名是由第一个SELECT查询的字段名确定。
2.所有的SELECT查询的字段数量必须一致,类型不做要求。
3.有排序需求时,每个SELECT语句需要使用()和LIMIT 使用子查询
2.索引(优化查询效率)
1.索引也是数据库里面的数据库对象
2.怎么创建索引:设计表的时候可以直接设置
3.哪些情况下要建索引:查询比较频繁的时候
4.主键自带索引,一般外键常伴随着索引
5.常见索引失效的情况:
like的”nihao%”这种形式以外的其他形式都会导致索引失效(因此查询的速度是非常慢的)
Select * from sss where 1=1 :索引失效
Sql注入。。。可百度查询
3.视图
1.视图是由SELECT语句组成的虚拟表
2.注:
(1)视图是虚拟表,可以把视图看着一个表,进行增删改查等操作。但视图不会存储数据,它的数据来源于SELECT查询语句
(2)视图每次执行,都会执行一次SELECT查询,获取最新的数据。相当于一次子查询
如果视图包含下述结构中的任何一种,那么它就是不可更新的:
(1)聚合函数;
(2)DISTINCT关键字;
(3)GROUP BY子句;
(4)ORDER BY子句;
(5)HAVING子句;
(6)UNION运算符;
(7)位于选择列表中的子查询;
(8)FROM子句中包含多个表;
(9)SELECT语句中引用了不可更新视图;
(10)WHERE子句中的子查询,引用FROM子句中的表;
(11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。
3.作用:
1.简化复杂的查询。常用的、比较复杂的SELECT语句,创建一个视图,就能方便以后多次调用。
2.安全原因。比如,只想让权限低的用户看到一个表的部分字段,而隐藏机密的部分
4.创建视图:create view 视图名字 as 查询语句
5.使用视图:怎么使用表就怎么使用视图
6.修改视图:alter view 视图名 as select 查询语句;
7.删除视图:drop view 视图名;
8.注意:
①视图的名字必须唯一,不能和其他表或视图重名。
②视图可以嵌套使用,也就是视图里面可以再次调用视图。
③视图的创建和删除只影响视图本身,不影响所使用的基本表
4.事务(transaction)
1.概念:事务是一组连续不可分割的SQL,要求要么全部成功要么全部撤销(同生共死)
注:MySQL的表类型必须是InnoDB,才能支持事务
2.为什么需要事务:
事务是数据库商用最基本最重要的特点。
事务是保证数据库数据完整性和安全性最重要的技术。
事务是要求一组连续的SQL语句要么全部成功执行,要么数据返回到开启事务前的状态。不允许部分SQL语句成功,部分不成功
3.事务使用场景:
(1)操作步骤需要回滚的。比如,银行转账、购物下单等
(2)遇到异常情况,数据需要回滚的。比如,断电、磁盘坏死等
4.事务的基本语法:
start transaction;
insert 语句
delete 语句
update 语句
select 语句
rollback;
commit;
start transaction是开启事务,commit是提交,表示一些列sql语句成功执行,提交到数据库
rollback是回滚,表示一些列sql语句没有全部成功执行,撤销所有的改动
注意:My SQL默认是自动提交模式。也就是一条SQL语句完成后,系统就自动提交了
5.查看当前的模式是否为自动提交模式:show variables like ‘%autocommit’;
6.开启自动提交模式:set autocommit=1;
7.关闭自动提交模式:set autocommit=0;
8.事务注意点:事务要求满足4点(简称ACID):
1.原子性(Atomicity):事务中的多个操作,不可分割,要么都成功,要么都失败
2.一致性(Consistency): 事务操作之后, 数据库所处的状态和业务规则是一致的; 比如a,b账户相互转账之后,总金额不变
3.隔离性(Isolation):事务必须与其他事务进行的数据更改相隔离。这意味着没有其他操作可以改变中间态(没有提交的)的数据。为了避免中间态数据被更改,事务必须要么等待来自其他事务的更改被提交,要么只能查看到处于上一个提交状态的数据
4.持久性(Durability):在一个事务完成,这些更改的数据将永久存在
5.表关系(了解)
1.表关系分为以下几种:
(1)一对多/多对一:由多发存储外键
(2)多对多:采用中间表,双主键、双外键
(3)一对一:大多数情况下,有先后顺序(一对多/多对一的特殊情况,给外键列加一个唯一约束)
6.函数、存储过程(了解)
1.聚集函数:count,sum,avg,max,min
2.cast函数
(1)CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型
(2)语法:cast(值 as 类型)
3.decimal类型
(1)DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列
(2)语法:column decimal(P,D)
P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
DECIMAL(P,D)表示列可以存储D位小数的P位数
(3)例:select cast(‘123.4’ as decimal(P,D))
4.convert函数
(1)对于简单类型转换,CONVERT()函数和CAST()函数的功能相同,只是语法不同。CAST()函数一般更容易使用,其功能也更简单
(2)语法:select convert(expr ,type) 例:select convert(‘123’,signed)
5.if null
(1)ifnull(expr1,expr2):如果expr1列里面的数据有为null的,则用expr2 去填充
6.自定义函数
(1)语法格式
create function(参数名 参数类型,…)
returns 返回值类型
begin(开始)
sql…
return 0;
end;(结束)
(2)调用方式:跟mysql自带的函数一样的调用方式
7.什么是存储过程:
一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行
8.存储过程的作用
①将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用
②批量处理:SQL+循环,减少流量,也就是“跑批”
③统一接口,确保数据的安全
④相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少
9.如何使用存储过程
(1)创建存储过程:
DELIMITER //
create procedure 存储过程名([存储过程参数列表])
begin
set 参数名=参数;
SQL语句
end //
(2)调用方法:
set @参数名
call 存储过程名(参数)
(3) mysql默认以分号作为sql语句的结束来进行执行,当我们在创建存储过程时,为了不让完整的存储过程语句由于分号而提前执行,需要临时规定以//或者$$来作为结束符号。这样的话,创建存储过程时,中间的分号会被忽略,直到遇到//符号才执行语句。
(4)参数分类:
①IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
delimiter //
create procedure 存储过程(in 变量名 类型)
begin
set 变量名=值;
SQL语句
end //
②OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
delimiter //
create procedure 存储过程(out 变量名 类型)
begin
set 变量名=值;
SQL语句
end //
call 存储过程名(参数值)
③INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
create procedure out_param(inout p_out int)
begin
select p_out;
set p_out=2;
select p_out;
end
set @p_out=1;
call out_param(@p_out);
select @p_out;
7.正则表达式
1.MySQL中使用 REGEXP 操作符来进行正则表达式匹配
例: SELECT name FROM emp WHERE name REGEXP ‘^Y’;