MySQL

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的书写规范:

  1. 在MySQL数据库中,SQL语句大小写不敏感
  2. SQL语句可单行或多行书写
  3. 在SQL语句中,关键字不能跨多行或缩写
  4. 为了提高可读性,一般关键字大写,其他小写
  5. 空格和缩进使程序易读
    3.MySQL
    1.表:MySQL是一种关系型数据库,而关系数据库中表是非常重要的概念
    2.启动MySQL服务:
    必须先在操作系统中开启MySQL的服务,才能够使用MySQL软件,可以通过如下的一些方式来启动:
    1.运行中输入 services.msc 打开服务界面,找到MySQL服务;
    2.控制面板-管理工具-服务;
    3.Window7 开始 搜索 服务
    4.命令的方式:
    i.启动MySQL服务 : net start MySQL
    ii.关闭MySQL服务 : net stop MySQL
    提示: 如果启动出现下面的提示请使用管理员权限打开cmd在尝试

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)数据库和数据库对象:
数据库:存储数据库对象的容器。
数据库对象:存储,管理和使用数据的不同结构形式,如:表、视图、存储过程、函数、触发器、事件等。
数据库分两种:

  1. 系统数据库(系统自带的数据库):不能修改
    information_schema:存储数据库对象信息,如:用户表信息,列信息,权限,字符,分区等信息。
    performance_schema:存储数据库服务器性能参数信息。
    mysql:存储数据库用户权限信息。
    test:任何用户都可以使用的测试数据库。
  2. 用户数据库(用户自定义的数据库):一般的,一个项目一个用户数据库
    (2)数据库操作:
    1.查看数据库服务器中有哪些数据库 SHOW DATABASES;
    2.使用指定的数据库 USE database_name;
    3.创建数据库 CREATE DATABASE database_name;
    4.删除数据库 DROP DATABASE database_name;
    注意: 每一句后面都是有分号; 结束的
    (3)数据库存储引擎:
    MyISAM:拥有较高的插入,查询速度,但不支持事务,不支持外键。
    InnoDB:支持事务,支持外键,支持行级锁定,性能较低。
    它提供了具有提交、回滚和崩溃恢复能力的事务安全。但对比MyISAM,处理效率差,且会占用更多 的磁盘空间以保留数据和索引
    5.MySQL常用列类型
    (1)数据类型
    常用对照
    JAVA Java备注 MYSQL MYSQL备注
    Int 短整型 int 短整型
    long 长整型 bigint 长整型
    float 单精度 float 单精度
    double 双精度 double 双精度
    bigdecimal 金融数据 decimal 金融数据
    String 字符串 char 不可变字符串
    varchar 可变字符串
    Boolean 布尔值 Bit 取值0和1
    (2)日期类型
    日期类型
  3. DATETIME(年月日,时分秒)
  4. DATE(年月日)
  5. TIMESTAMP(时间戳–范围19700101080001 - 203801191111407 基本不会用它,了解)对于到Java中也是 Date时间
  6. TIME:存时间,不带日期
  7. YEAR:只存年份
    注意:在MySQL中,日期时间值使用单引号引起来
    6.创建表:语法
    CREATE TABLE 表名(
    列名1 列的类型 [约束],
    列名2 列的类型 [约束],

    列名N 列的类型 约束
    );
    注意:最后一行没有逗号,使用SQL语句创建表,需要指定表名,表中的字段名和类型,约束是可选项,多个字段之间使用逗号隔开

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
主键约束分类
主键的设计一般来说是选取某一列作为主键【推荐】
选取多列作为主键称之为复合主键【不推荐】

  1. 自然主键:主键中的数据是以后软件中要使用到的数据,比如:身份证号等
  2. 代理主键:主键中的数据和以后软件的数据完全无关联
    在实际项目当中,推荐使用代理主键,因为如果和业务相关了,那么当有一天要求数据可以重复了,那么这个字段就不能再作为主键了
    4.单表查询
    1.语法
    select * from 表名; //代表查询表中全部信息
    select 列1,列2 from 表名; //代表查询表中指定列的信息
    SQL语句中使用select关键字表示选择查询列表,而from后紧跟要查询的数据源,查询出列显示的数据和建表时的列的数据一致
    语句的执行顺序是:from—>select
    2.DISTINCT-数据去重
    Select distinct 列…. From 表名;
    3.CONCAT()拼接结果
    select concat(列1,列2) from 表名;
    4.数学运算
    对NUMBER型数据可以使用算数操作符创建表达式(+ - * /)
    对DATE型数据可以使用部分算数操作符创建表达式 (+ -)
    运算符优先级:
    1、乘法和除法的优先级高于加法和减法
    2、同级运算的顺序是从左到右
    3、表达式中使用"括号"可强行改变优先级的运算顺序
    select 列1[±
    /]列2 from 表名;
    直接在select语句中使用数学运算符
    5.别名AS
    select 列 as 别名 from 表名; //使用as关键字
    select 列 别名 from 表名; //省略AS关键字
    6.带条件查询WHERE
    where 条件; //使用where关键字
    条件:条件1 or/and 条件2
    7.范围查询-BETWEEN AND
    WHERE 列名 BETWEEN minvalue AND maxvalue:闭区间 []
  3. 集合查询- IN
    WHERE 列名 IN (值1,值2…);
    9.空值查询 IS NULL
    WHERE 列名 IS NULL;
    注意: 列的值是 null 和空字符串不一样,如果是空字符串,应该 = “”
    10.模糊查询 LIKE
    使用LIKE运算符执行通配查询,查询条件可包含文字字符或数字:
    %:通配符:可表示零或多个任意的字符。
    :通配符:可表示任意的一个字符。
    通配符:用来实现匹配部分值得特殊字符。
    SELECT 列…
    FROM 源表
    where 列 like ‘%条件
    ’ ;
    11.结果排序ORDER BY
    (1) ASC:升序(默认)
    (2)DESC:降序
    WHERE 条件
    ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC]…;
    注意:别名不能使用引号括起来,否则不能排序
  4. 分页查询 LIMIT
    分页设计:
    假分页(逻辑分页): 把数据全部查询出来,存在于内存中,翻页的时候,直接从内存中去截取.
    真分页(物理分页): 每次翻页都去数据库中去查询数据.
    假分页: 翻页比较快,但是第一次查询很慢,若数据过大,可能导致内存溢出.
    真分页: 翻页比较慢,若数据过大,不会导致内存溢出.
    SELECT * FROM table_name LIMIT ?,?;
    SELECT * FROM table_name LIMIT beginIndex,pageSize;
    beginIndex = (currentPage-1) * pageSize;
    第一个?: 表示本页,开始索引(从0开始).
    第二个?: 每页显示的条数
    pageSize:表示每页显示的条数
    13.聚集函数
    定义:聚集函数作用于一组数据,并对一组数据返回一个值
    COUNT:统计结果记录数 如果列的值为null 不会计算在内的
    MAX: 统计计算最大值
    MIN: 统计计算最小值
    SUM: 统计计算求和
    AVG: 统计计算平均值 如果列的值为null 不会计算在内的
    14.分组查询 GROUP BY
    可以使用GROUP BY 子句将表中的数据分成若干组,再对分组之后的数据做统计计算,一般使用聚集函数才使用GROUP BY.
    SELECT 聚集函数或者分组的列
    FROM table_name
    WHERE 条件
    GROUP BY 列名
    HAVING 分组之后的条件;
    注意:GROUP BY 后面的列名的值要有重复性分组才有意义;
    使用HAVING字句,对分组之后的结果作筛选;
    不能在 WHERE 子句中使用组函数(注意);
    可以在 HAVING 子句中使用组函数;

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(操作数据:增删改)

  1. 增(插入数据):
    (1)语法:插入语句:一次插入操作只插入一行.
    INSERT INTO table_name (column1,column2,column3…)
    VALUES (value1,value2,value3…);
    INSERT INTO table_name VALUES (value1,value2,value3…)
    1.插入完整数据记录
    2.插入数据记录一部分
    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
    INSERT INTO productdir (dirName,parent_id)
    SELECT dirName,parent_id FROM productdir
    2.改(修改数据):
    (1)语法:
    UPDATE table_name
    SET columnName = value [, columnName = value] …
    [WHERE condition];
    (2)如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
    3.删(删除数据):
    (1)语法:
    DELETE FROM tablename
    [WHERE condition];
    注意:如果省略了where子句,则全表的数据都会被删除
    3.备份与恢复
    1.导出:mysqldump -uroot -p密码 -hip -P3306 数据库>存储的地址
    2.导入:mysql -uroot -p密码 -hip -P3306 数据库<文件地址
    3.使用Navicat导入导出
    Navicat工具的导入和导出/Navicat工具的备份和还原、

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’;

你可能感兴趣的:(MySQL)