MySQL基础

一、数据库概述

1、SQL分类

SQL,Structure Query Language,结构化查询语言,主要有下面三种:

一、数据定义语言 Data Defination Language (DDL)

  数据库定义语言定义了数据库涉及的各种对象,定义数据的完整性约束、保密限制等约束。

二、数据操作语言 Data Manipulation Language (DML)

  数据操作语言实现了对数据的操作。基本数据操作有两类:检索(查询)和更新(插入、删除和修改)。

三、数据控制语言 Data Control Language (DCL)

  数据库控制语言实现对数据库的控制,包括数据完整性控制、数据安全性控制和数据库恢复等。

2、MySQL历史发展

1985年,David Axmark 、Allan Larsson 、 Michael Widenius 成立公司,该公司为 MySQL AB 的前身。

2000年4月,MySQL对搜索引擎进行整理,命名为MyISAM。

2001年,InnoDB集成到MySQL。

2004年10月,MySQL  4.1 版本发布。

2005年10月,MySQL5.0版本发布。5.0加入了游标 、存储过程、触发器、视图和事务支持。

2008年1月16日,MySQL被SUN收购。

2009年,SUN被Oracle收购。

... ...

3、MySQL优点

1、体积小

2、速度快

3、拥有成本低

4、开放源码

4、数据库设计三大范式

1、原子性,字段不可再分割

比如:在user中有“联系方式”字段,存储内容:“ 64558@163.com,15854215521  ”,就不符合原子性,要设计成:email、phone对邮箱和手机号分别进行存储。

不符合第一范式:

符合第一范式:

2、完全依赖,没有部分依赖

比如:学生选课表的设计:

这里可以通过(学生,课程)可以确定老师、教师、时间,可以把(学生,课程)作为主键。但是,教材并不完全依赖主键,教材可以根据课程直接确定。这就是出现了不完全依赖、部分依赖,这样的设计就不符合第二范式

符合第二范式的设计:

选课表:

教材表:

3、没有传递依赖

每个属性要跟主键直接联系,不能有传递关系。

比如,学生表:

学校的地址和学校的电话,就是和college有依赖关系,和student是没有直接依赖关系,不符合第三范式

符合第三范式的修改如下:

学生表:

学校表:

一般来讲,范式越复杂,性能会越差。我们工作中满足以上三大范式即可。

二、MySQL安装和配置

1、MySQL下载

1、MySQL官方网站:http://www.mysql.com/

2、MySQL版本分类:社区版 Community 和 企业版 Enterprise。

     社区办支持只有下载,并且完全免费,官方不提供技术支持;

     企业版不能自由下载并且收费,提供了更多的功能,享受完备的技术支持。

3、版本标识说明

    GA:通用版本,官方推荐

    RC:发布版

    Alpha:内测版

    Bean:公测版

4、社区版下载:

    进入网站首页——>Downloads——>Community——MySQL on Windows ——>MySQL  Installer,进入Windows版本下载页面。

    其中 1.7 M大小的 mysql-installer-web-community 为在线安装文件;

           385M大小的 mysql-installer-community 为本地安装。

2、MySQL安装

    Typical:默认安装

    Complete:完全安装

    Custom:自定义安装

3、MySQL配置

配置文件为:C:ProgramData/MySQL/MySQL 5.6/my.ini

常用配置项:

lower_case_table_names = 0        // 0 ,表名区分大小写  ;1 ,  表名不区分大小写

default_character_set = utf-8       //  客户端字符编码

character_set_server = utf-8        //服务端字符编码

port = 3306                               //端口号

default_storage_engin = INNODB     //默认存储引擎

三、MySQL对象操作

1、数据库操作

(1)创建数据库:

create database db_name;

(2)查看数据库: 

show databases ;

(3)使用数据库: 

use db_name;

(4)删除数据库: 

drop database db_name;

注意: SQL语句可以用   ;    g    G   三种方式结尾,其中  ;   和  g   效果相同  ;   G  优化结果显示。 

2、表操作

(1)创建表:

create table company ( company_id  INT , company_name  VARCHAR(20) , company_address  VARCHAR(64));

(2)查看表结构:

describe company;     --查看表定义

show create table company; --查看表详细定义

(3)删除表:

drop table company;

(4)修改表:

alter table company rename mycompany; --修改表名
alter table company add  tel varchar(20); --增加字段
alter table company add  desc varchar(32) first;--在表的第一个位置增加字段
alter table company add create_time varchar(32) after company_name; --在指定位置增加字段
alter table company drop company_name;--删除字段
alter table company modify company_name varchar(128);--修改字段类型
alter table company modify company_name first;--调整字段顺序到第一位
alter table company modify company_name after desc;--调整字段顺序到desc后面
alter table company change company_name new_name varchar(128);--修改字段名和字段类型

(5)操作表约束:

     数据的完整性是指数据的准确性与一致性,完整性检查是指检查数据的准确性和一致性。MySQL提供一致机制来检查数据库表中的数据是否满足规定的条件,以保证数据库表中数据的准确性和一致性,这种机制就是约束。

MySQL支持的完整性约束:

NOT NULL(NK):约束字段的值不能为空

DEFAULT:设置字段的默认值

UNIQUE KEY(UK):约束字段的值唯一

PRIMARY KEY(PK):约束字段为标的主键,作为表记录的唯一标识

AUTO_INCREMENT:约束字段的值为自动增加

FOREIGN KEY(FK):约束字段为表的外键

a、设置非空约束

create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) NOT NULL);

如果增加的记录中,设置NK的字段没有值,则数据库管理系统会报错。

命令行错误信息:

ERROR 1048 (23000) : Column 'member_name' cannot be null 

管理工具错误提示:

b、设置字段的默认值

create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) DEFAULT 'huiyuan');

c、设置唯一约束(UK)

create table member(member_id INT(11) NOT NULL, member_name VARCHAR(32) UNIQUE);

对唯一字段插入相同记录时,提示信息:

d、设置主键约束

主键字段要满足:唯一、非空,可以是单一字段,也可以是多个字段。

单字段主键的两种方法:

create table member(member_id INT(11) PRIMARY KEY, member_name VARCHAR(32) UNIQUE, create_time varchar(32));  --(1)设置主键
create table member(member_id INT(11), member_name VARCHAR(32) UNIQUE, create_time varchar(32),
CONSTRAINT pk_menberid PRIMARY KEY (member_id)); -- (2)设置主键并定义主键名称

 多字段主键:

create table member(member_id INT(11), member_name VARCHAR(32) UNIQUE, create_time varchar(32),
                    CONSTRAINT pk_id_name PRIMARY KEY (member_id,member_name)); -- 设置主键并定义主键名称

e、自增(AUTO INCREMENT)

一个数据库只能有一个字段使用自增约束,而且该字段类型必须是整数类型。自增约束一般设置在主键上。

create table t_dept (deptno INT PRIMARY KEY auto_increment, dname VARCHAR(20) , loc VARCHAR(40));

f、外键(FOREIGN KEY)

描述两个表之间的约束。子表中的某个字段的取值范围由父表决定。比如  部门 和 雇员 表。

create table t_dept (deptno INT PRIMARY KEY auto_increment, dname VARCHAR(20) , loc VARCHAR(40)); --部门表
create table t_employee(employee_id INT PRIMARY KEY,e_name VARCHAR(32),create_time VARCHAR(32),
            dept_no INT(11), CONSISTENT fk_deptno FOREIGN KEY(dept_no) REFERENCES t_tept(deptno));--雇员表

3、索引操作

    数据库的索引对象和书的目录类似,主要是为了提高从表中检索数据的速度(其次还可以保证字段唯一性,实现数据库表的完整性)。按索引的存储类型分类,可以分为:B型树索引(BTREE)和哈希索引(HASH),其中,InnoDB和MyISAM存储引擎支持BTREE索引,MEMORY支持HASH索引。

   MySQL支持的索引有6种:普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引

 (1)索引的适用场景

以下情况适合创建索引:

  • 经常被查询的字段,即在WHERE子句中出现的字段。
  • 在分组的字段,即在 GROUP BY 子句中出现的字段。
  • 存在依赖关系的子表和父表之间的联合查询,即主键和外键字段。
  • 设置唯一完整性约束的字段。

以下情况不适合创建索引:

  • 在查询中很少被使用的字段。
  • 拥有许多重复值的字段。

(2)创建索引

a、普通索引

普通索引:在创建索引时,不附加任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。

在创建索引时,可以指定索引的长度。这是因为不用的存储引擎定义了表的最大索引数和最大索引长度。MySQL每个表至少支持16个索引,总索引长度为256字节。

在创建索引时,可以定义索引的长度和排序。ASC  升序排列; DESC 降序排列

-- 创建表时创建普通索引
create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40),
INDEX index_deptno(deptno));
-- 在已经存在的表上创建索引
create INDEX index_deptno ON t_dept(deptno(16) ASC);
-- 通过Alter table 创建索引
alter table t_dept add INDEX index_deptno(deptno);

b、唯一索引

 唯一索引:创建索引时,限制索引的值必须是唯一的。唯一索引可以更快速的查询某条记录。

-- 创建表时创建 唯一 索引
create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40),
UNIQUE INDEX index_deptno(deptno));
-- 在已经存在的表上创建 唯一 索引
create UNIQUE INDEX index_deptno ON t_dept(deptno(16) ASC);
-- 通过Alter table 创建 唯一 索引
alter table t_dept add UNIQUE INDEX index_deptno(deptno);

c、全文索引

 全文索引主要是关联在数据类型为:CHAR 、VARCHAR 和 TEXT 的字段上,以便能够更加快速的查询数据量较大的字符串类型的字段。只能在存储引擎为MyISAM的数据库表上创建全文索引。默认情况下,全文索引的搜索执行方式 不区分大小写,如果全文索引所关联的字段为二进制数据类型,则以区分大小写的搜索方式执行。

-- 创建表时创建 全文 索引
create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40),
FULLTEXT INDEX index_deptno(deptno)) ENGINE = MyISAM;
-- 在已经存在的表上创建 全文 索引
create FULLTEXT INDEX index_deptno ON t_dept(deptno(16) ASC);
-- 通过Alter table 创建 全文 索引
alter table t_dept add FULLTEXT INDEX index_deptno(deptno);

d、多列索引

多列索引:创建索引时,所关联的字段不是一个字段,而是多个字段。只有查询条件中使用了所关联字段中的第一个字段,多列索引才被使用。

-- 创建表时创建  多列 索引
create table t_dept(deptno INT PRIMARY KEY,dname VARCHAR(20),loc VARCHAR(40),
INDEX index_deptno(deptno,loc));
-- 在已经存在的表上创建 多列 索引
create INDEX index_deptno ON t_dept(deptno,loc);
-- 通过Alter table 创建 多列 索引
alter table t_dept add INDEX index_deptno(deptno,loc);

(3)删除索引

-- 删除索引
DROP INDEX index_dname_loc ON t_dept;

4、视图操作

 (1)视图的特点

  • 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
  • 视图是由基本表(实表)产生的表(虚表)。
  • 视图的建立和删除不影响基本表。
  • 对视图内容的更新(添加、删除和修改)直接影响基本表。
  • 当视图来自多个基本表时,不允许添加和删除数据。

(2)创建视图

基本表结构:

创建视图:

CREATE VIEW view_selectproduct AS SELECT id,name FROM t_product;

注意:在SQL语句命名规范中,视图一般用 view_xxx 或者 v_xxx 命名。

(2)使用视图

视图的使用和正常的表查询一样:

SELECT * FROM view_selectproduct;

(3)不同种类的视图

a、常量视图

CREATE VIEW view_pi AS SELECT 3.1415926;

b、封装聚合函数(SUM/MIN/MAX/COUNT等)

CREATE VIEW view_count_name AS SELECT COUNT(name) FROM t_product;

c、封装排序(order by)

CREATE VIEW view_order_by AS SELECT name FROM t_product ORDER BY id DESC;

d、封装内连接

CREATE VIEW view_inner_join AS SELECT s.name FROM t_student AS s,t_group as g WHERE s.group_id = g.id;

e、封装外连接

CREATE VIEW view_left_join AS SELECT s.name FROM t_student AS s LEFT JOIN t_group AS g ON s.group_id = g.id;

其他 子查询、联合查询的视图创建方式相似。

(4)查看视图

SHOW TABLES;
SHOW TABLES STATUS FROM DB_NAME; -- 查看视图的详细信息
SHOW CREATE VIEW viewname; -- 查看视图的定义信息

(5)删除视图

DROP VIEW view_name1,view_name2; -- 可以同时删除多个视图

(6)视图操作基本表数据

INSERT INTO view_product (id, name, price ,order_id) VALUES (11,"apple",6,54); -- 插入数据
DELETE FROM view_product WHERE name = "apple"; -- 删除数据
UPDATE view_product SET price = 4 WHERE name = "apple"; -- 修改数据

5、触发器操作

 触发器:在表发生更改时,自动进行处理。

可以触发器执行的语句: delete 语句、insert 语句 、update 语句。

-- 触发器
CREATE TRIGGER tri_diarytime 
    BEFORE INSERT ON t_dept FOR EACH ROW
         INSERT INTO t_diary VALUES(null,"t_dept",NOW());

 四、MySQL数据操作

 1、增、改、删操作

(1)插入数据

-- 插入一条完整记录
INSERT INTO t_dept(deptno,dname,loc) VALUES (5,'开发部','程序开发'); -- 推荐使用
INSERT INTO t_dept VALUES (5,'开发部','程序开发');-- 缺省格式,不推荐使用

-- 插入一条部分记录
INSERT INTO t_dept(dname) VALUES ('设计部');

-- 插入多条记录
INSERT INTO t_dept(dname) VALUES ('设计部'),('产品部'),('市场部'),('行政部');

-- 插入查询的结果
INSERT INTO t_dept(dname) SELECT dname FROM t_company;

(2)更新数据

UPDATE t_dept SET dname = '测试部门' ,loc = '' where deptno = 1;

(3)删除

DELETE FROM t_dept WHERE deptno < 10;

2、单表查询

原始表:

 (1)简单数据记录查询

SELECT item_name,brand_id FROM z_item; -- 查询商品名称和品牌id
SELECT * FROM z_item; -- 查询商品表中的所有字段

   a、去重 DISTINCT:

SELECT DISTINCT  item_name ,brand_id FROM z_item;  -- 去重会取并集,即  去重的 所有字段 都重复 才进行 去重。

  b、四则运算:

MySQL支持的数学运算符:

+   加法 ; -  减法 ; * 乘法 ; /  除法 ;%  取余

SELECT price,(price+0.2) AS 'price+0.2',(price -0.2) AS 'price-0.2' , (price * 2) AS 'price * 2 ' ,
(price / 2) AS 'price/2',(price % 2 ) AS 'price % 2' FROM z_item ;

c、字符串连接CONCAT()

SELECT CONCAT('商品名称是',item_name,'的商品,价格为',price) FROM z_item;

(2)条件查询

 a、MySQL支持的比较运算符和逻辑运算符

>  大于; < 小于 ; =  等于 ; != (<>) 不等于 ; >= 大于等于; <=小于等于;

AND(&&)  逻辑与     OR(||) 逻辑或    XOR  逻辑异或   NOT(!) 逻辑非

b、简单条件查询

SELECT * FROM z_item WHERE item_name = '鞋子';
SELECT * FROM z_item WHERE item_id <= 10 AND price > 1000;
SELECT * FROM z_item WHERE item_id <= 10 && price > 1000;

c、BETWEEN AND 关键字

SELECT * FROM z_item WHERE price BETWEEN 100 AND 1000;
SELECT * FROM z_item WHERE price NOT BETWEEN 100 AND 1000;

d、NULL 和 NOT NULL

SELECT * FROM z_item WHERE item_name IS NULL;
SELECT * FROM z_item WHERE item_name IS NOT NULL;

e、IN

SELECT * FROM z_item WHERE item_name = '冰箱' OR item_name = '空调' OR item_name = '洗衣机';
SELECT * FROM z_item WHERE item_name IN('冰箱','空调','洗衣机');
SELECT * FROM z_item WHERE item_name NOT IN('冰箱','空调','洗衣机');

注意:在具体使用IN 关键字时,查询的结果如果存在NULL,则不会影响查询;如果使用关键字 NOT IN ,查询的集合中如果存在NULL,则不会有任何的查询结果。

f、LIKE

通配符:用来实现匹配部分值的特殊符号。

SELECT * FROM z_item WHERE item_name LIKE '%机';
SELECT * FROM z_item WHERE NOT item_name LIKE '%机';
SELECT * FROM z_item WHERE item_name NOT LIKE '%机';
SELECT * FROM z_item WHERE price LIKE '_9%';

g、ORDER BY

ASC  升序   DESC   降序

SELECT * FROM z_item ORDER BY price DESC , item_id ASC;

h、LIMIT  

SELECT * FROM z_item LIMIT 1;
SELECT * FROM z_item LIMIT 3,2; -- 第四条记录开始显示,显示2条

 i、统计函数和分组函数

-- 统计函数经常和分组一起使用
-- 统计条数   COUNT(*),统计所有值,包括null值和非null值; count(price)指定之后不统计null值。
SELECT COUNT(*) FROM z_item ;
-- 平均值
SELECT AVG(price) FROM z_item;
-- 求和
SELECT SUM(price) FROM z_item;
-- 最大值、最小值
SELECT MAX(price) FROM z_item;
SELECT item_name,MIN(price) FROM z_item;

-- 分组
SELECT *,SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id;
SELECT GROUP_CONCAT(item_name),SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id,is_delete;

SELECT GROUP_CONCAT(item_name),SUM(price) FROM z_item WHERE is_delete = 0 GROUP BY brand_id,is_delete HAVING AVG( price) > 1000;

注:资料来源为书籍《MySQL数据库应用从入门到精通》,本文为个人学习笔记。

原文地址:https://www.cnblogs.com/lashou/p/6140135.html