mysql数据库_mysql数据库优化 - CSDN
mysql数据库 订阅
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。 展开全文
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
信息
标    志
sakila
说    明
数据库管理系统
中文名
MySQL数据库
类    型
开放源代码的关系型
MySQL数据库数据库简介
[1]  MySQL这个名字,起源不是很明确。一个比较有影响的说法是,基本指南和大量的库和工具带有前缀“my”已经有10年以上,而且不管怎样,MySQL AB创始人之一的Monty Widenius的女儿也叫My。这两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。MySQL的海豚标志的名字叫“sakila”,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。MySQL,虽然功能未必很强大,但因为它的开源、广泛传播,导致很多人都了解到这个数据库。它的历史也富有传奇性。
收起全文
精华内容
参与话题
  • mysql 基础教程 很全

    万次阅读 多人点赞 2018-11-02 11:27:46
    (一)数据库操作 1、创建数据库 create database 数据库名; create database runoob; 2、选择数据库 use 数据库名; use runoob; 3、删除数据库 drop database 数据库名; ...

    (一)数据库操作

    1、创建数据库

    create database 数据库名;
    
    create database runoob;
    

    2、选择数据库

    use 数据库名;
    
    use runoob;
    

    3、删除数据库

    drop database 数据库名;
    
    drop database runoob;
    

    (二)数值类型
    这里写图片描述

    (三)数据表

    1、创建数据表

    CREATE TABLE 数据表名 (字段名 字段类型);
    
    CREATE TABLE `runoob_tbl`(
       `runoob_id` INT UNSIGNED AUTO_INCREMENT,
       `runoob_title` VARCHAR(100) NOT NULL,
       `runoob_author` VARCHAR(40) NOT NULL,
       `submission_date` DATE,
       PRIMARY KEY ( `runoob_id` )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    2、删除数据表

    DROP TABLE 数据表名 ;
    
    DROP TABLE runoob_tbl ;
    

    (四)数据操作

    1、增

    INSERT INTO table_name ( field1, field2,...fieldN ) 
    VALUES 
    ( value1, value2,...valueN );
    
    INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
    VALUES
    ("学习 PHP", "菜鸟教程", NOW());
    

    2、删

    DELETE FROM table_name [WHERE Clause];
    
    DELETE FROM runoob_tbl WHERE runoob_id=1;
    

    3、改

    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause];
    
    UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=1;
    

    4、查

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
    [WHERE condition1 [AND [OR]] condition2.....
    
    SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程';
    

    (五)查询

    1、WHERE
    这里写图片描述

    2、ORDER BY

    SELECT field1, field2,...fieldN table_name1, table_name2...
    ORDER BY field1, [field2...] [ASC [DESC]];
    
    SELECT * from runoob_tbl ORDER BY submission_date ASC;
    

    3、GROUP BY

    GROUP BY 语句根据一个或多个列对结果集进行分组。

    在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

    SELECT column_name, function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;
    
    SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
    

    4、JOIN

    JOIN 按照功能大致分为如下三类:

    INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a 
    INNER JOIN tcount_tbl b 
    ON a.runoob_author = b.runoob_author
    

    (六)MySQL 事务

    1、事务介绍

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

    在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
    事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
    事务用来管理 insert,update,delete 语句

    2、事务控制语句

    BEGIN或START TRANSACTION;显式地开启一个事务;

    COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;

    ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

    (七)字段操作

    1、增

    ALTER TABLE 数据表名 ADD 新增字段 字段类型;
    
    ALTER TABLE runoob_tbl ADD status tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0正常 1删除';
    

    2、删

    ALTER TABLE 数据表名 DROP 字段名;
    
    ALTER TABLE runoob_tbl  DROP status;
    

    3、改

    #例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
    ALTER TABLE testalter_tbl MODIFY c CHAR(10);
    ALTER TABLE testalter_tbl CHANGE c c CHAR(10);
    
    #修改字段类型及名称
    #在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:
    #例如,把字段 c 改成 字段 j ,类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
    ALTER TABLE testalter_tbl CHANGE c j CHAR(10);
    
    #ALTER TABLE 对 Null 值和默认值的影响
    ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
    
    #修改字段默认值
    ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
    
    #修改表名
    ALTER TABLE testalter_tbl RENAME TO alter_tbl;
    
    

    (八)索引

    1、创建普通索引

    #这是最基本的索引,它没有任何限制。它有以下几种创建方式:
    #(1)创建索引
    
    CREATE INDEX indexName ON mytable(username(length)); 
    #如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
    
    #(2)创建表的时候直接指定
    CREATE TABLE mytable(  
    	ID INT NOT NULL,   
    	username VARCHAR(16) NOT NULL,  
    	INDEX [indexName] (username(length)) 
    ); 
    

    2、创建唯一索引

    #它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它#有以下几种创建方式:
    
    #(1)创建索引
    CREATE UNIQUE INDEX indexName ON mytable(username(length)) ;
    
    #(2)创建表的时候直接指定
    CREATE TABLE mytable( 
    	ID INT NOT NULL,  
    	username VARCHAR(16) NOT NULL,  
    	UNIQUE [indexName] (username(length))  
    );  
    

    3、删除索引

    DROP INDEX [indexName] ON mytable; 
    

    4、使用ALTER 命令添加和删除索引

    有四种方式来添加数据表的索引:
    #(1)该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);
    
    #(2)这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
    
    #(3)添加普通索引,索引值可出现多次。
    ALTER TABLE tbl_name ADD INDEX index_name (column_list);
    
    #(4)该语句指定了索引为 FULLTEXT ,用于全文索引。
    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);
    
    #添加索引实例
    ALTER TABLE testalter_tbl ADD INDEX (c);
    
    #删除索引实例
    ALTER TABLE testalter_tbl DROP INDEX c;
    

    实战应用

    1、mysql统计-关于学生成绩
    https://blog.csdn.net/mayanyun2013/article/details/50845667

    展开全文
  • 数据库MySQL详解

    万次阅读 多人点赞 2020-04-30 23:19:31
    第2章MySql数据库 2.1MySql安装 2.2登录MySQL数据库 2.3SQLyog(MySQL图形化开发工具) 第3章SQL语句 3.1SQL语句 3.2SQL通用语法 3.3数据库操作:database 3.4表结构相关语句 3.4.1创建表...

    目录

    第1章 数据库

    1.1 数据库概述

    1.2 数据库表

    1.3 表数据

    第2章 MySql数据库

    2.1 MySql安装

    2.2 登录MySQL数据库

    2.3 SQLyog(MySQL图形化开发工具)

    第3章 SQL语句

    3.1 SQL语句

    3.2 SQL通用语法

    3.3 数据库操作:database

    3.4 表结构相关语句

    3.4.1 创建表

    3.4.2 查看表

    3.4.3 删除表

    3.4.4 修改表结构格式

    3.5 DOS操作数据乱码解决

    第4章 字段属性

    4.1 主键

    4.1.1增加主键

    4.1.2 主键约束

    4.1.3 更新主键 & 删除主键

    4.1.4 主键分类

    4.2 自动增长

    4.2.1 新增自增长

    4.2.2 自增长使用

    4.2.3 修改自增长

    4.2.4 删除自增长

    4.3 唯一键

    4.3.1 增加唯一键

    4.3.2 唯一键约束

    4.3.3 更新唯一键 & 删除唯一键

    4.4 外键

    4.4.1 增加外键

    4.4.2 修改外键&删除外键

    4.4.3 外键作用

    4.4.4 外键条件

    4.4.5 外键约束

    4.5 索引

    第5章 关系

    5.1 一对一

    5.2 一对多

    5.3多对多

    第6章 范式

    6.1 1NF

    6.2 2NF

    6.3 3NF

    6.4 逆规范化

    第7章 数据高级操作

    7.1 新增数据

    7.1.1主键冲突

    7.1.2 蠕虫复制

    7.2 更新数据

    7.3 删除数据

    7.4 查询数据

    7.4.1 Select选项

    7.4.2 字段别名

    7.4.3 数据源

    7.4.4 Where子句

    7.4.5 Group by子句

    7.4.6 Having子句

    7.4.7 Order by子句

    7.4.8 Limit子句

    第8章 连接查询

    8.1 连接查询分类

    8.2 交叉连接

    8.3 内连接

    8.4 外连接

    8.5 自然连接

    8.6 子连接

    8.6.1 子查询分类

    8.6.2 标量子查询

    8.6.3 列子查询

    8.6.4 行子查询

    8.6.5 表子查询

    8.6.6 Exists子查询

    第9章 视图

    9.1 创建视图

    9.2 查看视图

    9.3 使用视图

    9.4 修改视图

    9.5 删除视图

    9.6 视图意义

    9.7 视图数据操作

    9.7.1 新增数据

    9.7.2 删除数据

    9.7.3 更新数据

    9.8 视图算法

    第10章 数据备份与还原

    10.1 数据表备份

    10.2 单表数据备份

    10.3 SQL备份

    10.4 增量备份

    第11章 事务安全

    11.1 事务操作

    11.2 自动事务处理

    11.3 事务原理

    11.4 回滚点

    11.5 事务特性

    第12章 触发器

    12.1 创建触发器

    12.2 查看触发器

    12.3 使用触发器

    12.4 修改触发器&删除触发器

    12.5 触发器记录

    第13章 函数

    13.1 系统函数

    13.2 自定义函数

    13.2.1 创建函数

    13.2.2 查看函数

    13.2.3 修改函数&删除函数

    13.2.4 函数参数

    13.2.5 作用域

    第14章 存储过程

    14.1 创建过程

    14.2 查看过程

    14.3 调用过程

    14.4 修改过程&删除过程

    14.5 过程参数


     

    第1章 数据库

    1.1 数据库概述

    什么是数据库

    数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。

    什么是数据库管理系统

    数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。

     

    常见的数据库管理系统

    MYSQL :开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。

    Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。

    DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中.

    SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。

    SyBase :已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。

    SQLite : 嵌入式的小型数据库,应用在手机端。

    Java相关的数据库:MYSQL,Oracle.

    这里使用MySQL数据库。MySQL中可以有多个数据库,数据库是真正存储数据的地方。

    数据库与数据库管理系统的关系

     

    1.2 数据库表

    数据库中以表为组织单位存储数据。

    表类似我们的Java类,每个字段都有对应的数据类型。

    那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。

    类----------表

    类中属性----------表中字段

    对象----------记录

    1.3 表数据

    根据表字段所规定的数据类型,我们可以向其中填入一条条的数据,而表中的每条数据类似类的实例对象。表中的一行一行的信息我们称之为记录。

    表记录与java类对象的对应关系

     

    第2章 MySql数据库

    2.1 MySql安装

    安装

    自行百度

    安装后,MySQL会以windows服务的方式为我们提供数据存储功能。开启和关闭服务的操作:右键点击我的电脑→管理→服务→可以找到MySQL服务开启或停止。

     

    也可以在DOS窗口,通过命令完成MySQL服务的启动和停止(必须以管理运行cmd命令窗口)

     

    2.2 登录MySQL数据库

    MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录。

    格式1:cmd>  mysql –u用户名 –p密码

    例如:mysql -uroot –proot

     

    格式2:cmd>  mysql --host=ip地址 --user=用户名 --password=密码

    例如:mysql --host=127.0.0.1  --user=root --password=root

     

    2.3 SQLyog(MySQL图形化开发工具)

    安装:

    提供的SQLyog软件为免安装版,可直接使用

    使用:

    输入用户名、密码,点击连接按钮,进行访问MySQL数据库进行操作

     

    在Query窗口中,输入SQL代码,选中要执行的SQL代码,按F8键运行,或按执行按钮运行。

     

    第3章 SQL语句

    数据库是不认识JAVA语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言SQL语句,它是数据库的代码。

    结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

    创建数据库、创建数据表、向数据表中添加一条条数据信息均需要使用SQL语句。

    3.1 SQL语句

    SQL分类:

    数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等

    数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等

    数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。

    数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等

    3.2 SQL通用语法

    1.SQL语句可以单行或多行书写,以分号结尾

    2.可使用空格和缩进来增强语句的可读性

    3.MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user。

    4.同样可以使用/**/的方式完成注释

    5.MySQL中的我们常使用的数据类型如下

    详细的数据类型如下

    分类

    类型名称

    说明

    整数类型

    tinyInt

    很小的整数

    smallint

    小的整数

    mediumint

    中等大小的整数

    int(integer)

    普通大小的整数

    小数类型

    float

    单精度浮点数

    double

    双精度浮点数

    decimal(m,d)

    压缩严格的定点数

    日期类型

    year

    YYYY  1901~2155

    time

    HH:MM:SS  -838:59:59~838:59:59

    date

    YYYY-MM-DD 1000-01-01~9999-12-3

    datetime

    YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59

    timestamp

    YYYY-MM-DD HH:MM:SS  1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC

    文本、二进制类型

    CHAR(M)

    M为0~255之间的整数

    VARCHAR(M)

    M为0~65535之间的整数

    TINYBLOB

    允许长度0~255字节

    BLOB

    允许长度0~65535字节

    MEDIUMBLOB

    允许长度0~167772150字节

    LONGBLOB

    允许长度0~4294967295字节

    TINYTEXT

    允许长度0~255字节

    TEXT

    允许长度0~65535字节

    MEDIUMTEXT

    允许长度0~167772150字节

    LONGTEXT

    允许长度0~4294967295字节

    VARBINARY(M)

    允许长度0~M个字节的变长字节字符串

    BINARY(M)

    允许长度0~M个字节的定长字节字符串

    3.3 数据库操作:database

    创建数据库

    格式:

        * create database 数据库名;

        * create database 数据库名 character set 字符集;

    例如:

    #创建数据库 数据库中数据的编码采用的是安装数据库时指定的默认编码 utf8

    CREATE DATABASE day21_1;

    #创建数据库 并指定数据库中数据的编码

    CREATE DATABASE day21_2 CHARACTER SET utf8;

     

    查看数据库

    查看数据库MySQL服务器中的所有的数据库:

    show databases;

    查看某个数据库的定义的信息:

    show create database 数据库名;

    例如:

    show create database day21_1;

     

    删除数据库

    drop database 数据库名称;

    例如:

    drop database day21_2;

     

    其他的数据库操作命令

    切换数据库:

    use 数据库名;

    例如:

    use day21_1;

     

    查看正在使用的数据库:

    select database();

    3.4 表结构相关语句

    3.4.1 创建表

    格式:

    create table 表名(

       字段名 类型(长度) 约束,

       字段名 类型(长度) 约束

    );

    例如:

    ###创建分类表

    CREATE TABLE sort (

      sid INT, #分类ID

      sname VARCHAR(100) #分类名称

    );

     

    3.4.2 查看表

    查看数据库中的所有表:

    格式:show tables;

    查看表结构:

    格式:desc 表名;

    例如:desc sort;

     

    3.4.3 删除表

    格式:drop table 表名;

    例如:drop table sort;

     

    3.4.4 修改表结构格式

    alter table 表名 add 列名 类型(长度) 约束;

    作用:修改表添加列.

    例如:

    #1,为分类表添加一个新的字段为 分类描述 varchar(20)

    ALTER TABLE sort ADD sdesc VARCHAR(20);

     

    alter table 表名 modify 列名 类型(长度) 约束;

    作用:修改表修改列的类型长度及约束.

    例如:

    #2, 为分类表的分类名称字段进行修改,类型varchar(50) 添加约束 not null

    ALTER TABLE sort MODIFY sname VARCHAR(50) NOT NULL;

     

    alter table 表名 change 旧列名 新列名 类型(长度) 约束;

    作用:修改表修改列名.

    例如:

    #3, 为分类表的分类名称字段进行更换 更换为 snamesname varchar(30)

    ALTER TABLE sort CHANGE sname snamename VARCHAR(30);

     

    alter table 表名 drop 列名;

    作用:修改表删除列.

    例如:

    #4, 删除分类表中snamename这列

    ALTER TABLE sort DROP snamename;

     

    rename table 表名 to 新表名;

    作用:修改表名

    例如:

    #5, 为分类表sort 改名成 category

    RENAME TABLE sort TO category;

     

    alter table 表名 character set 字符集;

    作用:修改表的字符集

    例如:

    #6, 为分类表 category 的编码表进行修改,修改成 gbk

    ALTER TABLE category CHARACTER SET gbk;

     

    3.5 DOS操作数据乱码解决

    我们在dos命令行操作中文时,会报错

    insert into user(username,password) values(‘张三’,’123’);

    ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'username' at row 1

    原因:因为mysql的客户端编码的问题我们的是utf8,而系统的cmd窗口编码是gbk

    解决方案(临时解决方案):修改mysql客户端编码。

    show variables like 'character%'; 查看所有mysql的编码

     

    在图中与客户端有关的编码设置:

    client connetion result 和客户端相关

    database server system 和服务器端相关

    将客户端编码修改为gbk.

    set character_set_results=gbk; / set names gbk;

    以上操作,只针对当前窗口有效果,如果关闭了服务器便失效。如果想要永久修改,通过以下方式:

    在mysql安装目录下有my.ini文件

    default-character-set=gbk 客户端编码设置

    character-set-server=utf8 服务器端编码设置

    注意:修改完成配置文件,重启服务

     

     

     

    第4章 字段属性

    主键, 唯一键和自增长.

    4.1 主键

    主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.

    一张表只能有最多一个主键.

    4.1.1增加主键

    SQL操作中有多种方式可以给表增加主键: 大体分为三种.

    方案1: 在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)

    优点: 非常直接; 缺点: 只能使用一个字段作为主键

     

    方案2: 在创建表的时候, 在所有的字段之后, 使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)

     

    方案3: 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加.

    Alter table 表名  add primary key(字段列表);

    前提: 表中字段对应的数据本身是独立的(不重复)

     

    4.1.2 主键约束

    主键对应的字段中的数据不允许重复: 一旦重复,数据操作失败(增和改)

     

    4.1.3 更新主键 & 删除主键

    没有办法更新主键: 主键必须先删除,才能增加.

    Alter table 表名 drop primary key;

     

    4.1.4 主键分类

    在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号); 大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段主键称之为逻辑主键.

    Create table my_student(
    
    Id int primary key auto_increment comment ‘逻辑主键: 自增长’, -- 逻辑主键
    
    Number char(10) not null  comment ‘学号’,
    
    Name varchar(10) not null
    
    )
    
    

     

    4.2 自动增长

    自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发, 系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段.

    自增长通常是跟主键搭配.

     

    4.2.1 新增自增长

    自增长特点: auto_increment

       任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值)

     

       自增长字段必须是数字(整型)

     

      一张表最多只能有一个自增长

     

    4.2.2 自增长使用

    当自增长被给定的值为NULL或者默认值的时候会触发自动增长.

     

    自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最大值+1)

     

    如何确定下一次是什么自增长呢? 可以通过查看表创建语句看到.

     

    4.2.3 修改自增长

    自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)

     

    修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效)

    Alter table 表名 auto_increment  = 值;

     

    向上修改可以

     

    思考: 为什么自增长是从1开始?为什么每次都是自增1呢?

    所有系统的变现(如字符集,校对集)都是由系统内部的变量进行控制的.

    查看自增长对应的变量: show variables like ‘auto_increment%’;

     

    可以修改变量实现不同的效果: 修改是对整个数据修改,而不是单张表: (修改是会话级)

    Set auto_increment_increment = 5; -- 一次自增5

     

    测试效果: 自动使用自增长

     

    4.2.4 删除自增长

    自增长是字段的一个属性: 可以通过modify来进行修改(保证字段没有auto_increment即可)

    Alter table 表名 modify 字段 类型;

     

    4.3 唯一键

    一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.

    唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

     

    4.3.1 增加唯一键

    基本与主键差不多: 三种方案

    方案1: 在创建表的时候,字段之后直接跟unique/ unique key

     

    方案2: 在所有的字段之后增加unique key(字段列表); -- 复合唯一键

     

    方案3: 在创建表之后增加唯一键

     

    4.3.2 唯一键约束

    唯一键与主键本质相同: 唯一的区别就是唯一键默认允许为空,而且是多个为空.

    如果唯一键也不允许为空: 与主键的约束作用是一致的.

     

    4.3.3 更新唯一键 & 删除唯一键

    更新唯一键

    先删除后新增(唯一键可以有多个: 可以不删除).

    删除唯一键

    Alter table 表名 drop unique key; -- 错误: 唯一键有多个

    Alter table 表名 drop index 索引名字; -- 唯一键默认的使用字段名作为索引名字

     

    4.4 外键

    外键: foreign key, 外面的键(键不在自己表中): 如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键.

    4.4.1 增加外键

    外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题).

    一张表可以有多个外键.

     

    创建表的时候增加外键: 在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

     

    在新增表之后增加外键: 修改表结构

    Alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

     

    4.4.2 修改外键&删除外键

    外键不可修改

    只能先删除后新增.

    删除外键语法

    Alter table 表名 drop foreign key 外键名; -- 一张表中可以有多个外键,但是名字不能相同

     

    4.4.3 外键作用

    外键默认的作用有两点: 一个对父表,一个对子表(外键字段所在的表)

     

    对子表约束: 子表数据进行写操作(增和改)的时候, 如果对应的外键字段在父表找不到对应的匹配: 那么操作会失败.(约束子表数据操作)

     

    对父表约束: 父表数据进行写操作(删和改: 都必须涉及到主键本身), 如果对应的主键在子表中已经被数据所引用, 那么就不允许操作

     

    4.4.4 外键条件

    1.外键要存在: 首先必须保证表的存储引擎是innodb(默认的存储引擎): 如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果.
    2.外键字段的字段类型(列类型)必须与父表的主键类型完全一致.
    3.一张表中的外键名字不能重复.
    4,增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应.

     

    4.4.5 外键约束

    所谓外键约束: 就是指外键的作用.

    之前所讲的外键作用: 是默认的作用; 其实可以通过对外键的需求, 进行定制操作.

     

    外键约束有三种约束模式: 都是针对父表的约束

    District: 严格模式(默认的), 父表不能删除或者更新一个已经被子表数据引用的记录

    Cascade: 级联模式: 父表的操作, 对应子表关联的数据也跟着被删除

    Set null: 置空模式: 父表的操作之后,子表对应的数据(外键字段)被置空

     

    通常的一个合理的做法(约束模式): 删除的时候子表置空, 更新的时候子表级联操作

    指定模式的语法

    Foreign key(外键字段) references 父表(主键字段) on delete set null on update cascade;

     

    更新操作: 级联更新

     

    删除操作: 置空

     

    删除置空的前提条件: 外键字段允许为空(如果不满足条件,外键无法创建)

    外键虽然很强大, 能够进行各种约束: 但是对于PHP来讲, 外键的约束降低了PHP对数据的可控性: 通常在实际开发中, 很少使用外键来处理.

     

    4.5 索引

    几乎所有的索引都是建立在字段之上.

    索引: 系统根据某种算法, 将已有的数据(未来可能新增的数据),单独建立一个文件: 文件能够实现快速的匹配数据, 并且能够快速的找到对应表中的记录.

     

    索引的意义

    提升查询数据的效率
    约束数据的有效性(唯一性等)
    增加索引的前提条件: 索引本身会产生索引文件(有时候有可能比数据文件还大) ,会非常耗费磁盘空间.

     

    如果某个字段需要作为查询的条件经常使用, 那么可以使用索引(一定会想办法增加);

    如果某个字段需要进行数据的有效性约束, 也可能使用索引(主键,唯一键)

     

    Mysql中提供了多种索引

    主键索引: primary key
    唯一索引: unique key
    全文索引: fulltext index
    普通索引: index
    全文索引: 针对文章内部的关键字进行索引

    全文索引最大的问题: 在于如何确定关键字

     

    英文很容易: 英文单词与单词之间有空格

    中文很难: 没有空格, 而且中文可以各种随意组合(分词: sphinx)

     

    第5章 关系

    将实体与实体的关系, 反应到最终数据库表的设计上来: 将关系分成三种: 一对一, 一对多(多对一)和多对多.

    所有的关系都是指的表与表之间的关系.

    5.1 一对一

    一对一: 一张表的一条记录一定只能与另外一张表的一条记录进行对应; 反之亦然.

    学生表: 姓名,性别,年龄,身高,体重,婚姻状况, 籍贯, 家庭住址,紧急联系人

    Id(P)

    姓名

    性别

    年龄

    体重

    身高

    婚姻

    籍贯

    住址

    联系人

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    表设计成以上这种形式: 符合要求. 其中姓名,性别,年龄,身高,体重属于常用数据; 但是婚姻,籍贯,住址和联系人属于不常用数据. 如果每次查询都是查询所有数据,不常用的数据就会影响效率, 实际又不用.

     

    解决方案: 将常用的和不常用的信息分离存储,分成两张表

    常用信息表

    Id(P)

    姓名

    性别

    年龄

    体重

    身高

    1

     

     

     

     

     

     

     

     

     

     

     

    不常用信息表: 保证不常用信息与常用信息一定能够对应上: 找一个具有唯一性(确定记录)的字段来共同连接两张表

    Id(P)

    婚姻

    籍贯

    住址

    联系人

    2

     

     

     

     

    1

     

     

     

     

    一个常用表中的一条记录: 永远只能在一张不常用表中匹配一条记录;反过来,一个不常用表中的一条记录在常用表中也只能匹配一条记录: 一对一的关系

     

    5.2 一对多

    一对多: 一张表中有一条记录可以对应另外一张表中的多条记录; 但是返回过, 另外一张表的一条记录只能对应第一张表的一条记录. 这种关系就是一对多或者多对一.

     

    母亲与孩子的关系: 母亲,孩子两个实体

    妈妈表

    ID(P)

    名字

    年龄

    性别

     

     

     

     

     

     

     

     

    孩子表

    ID(P)

    名字

    年龄

    性别

     

     

     

     

     

     

     

     

    以上关系: 一个妈妈可以在孩子表中找到多条记录(也有可能是一条); 但是一个孩子只能找到一个妈妈: 是一种典型的一对多的关系.

     

    但是以上设计: 解决了实体的设计表问题, 但是没有解决关系问题: 孩子找不出妈,妈也找不到孩子.

     

    解决方案: 在某一张表中增加一个字段,能够找到另外一张表的中记录: 应该在孩子表中增加一个字段指向妈妈表: 因为孩子表的记录只能匹配到一条妈妈表的记录.

     

    妈妈表

    ID(P)

    名字

    年龄

    性别

     

     

     

     

     

     

     

     

    孩子表

    ID(P)

    名字

    年龄

    性别

    妈妈ID

     

     

     

     

    妈妈表主键

     

     

     

     

     

     

    5.3多对多

    多对多: 一张表中(A)的一条记录能够对应另外一张表(B)中的多条记录; 同时B表中的一条记录也能对应A表中的多条记录: 多对多的关系

     

    老师教学: 老师和学生

    老师表

    T_ID(P)

    姓名

    性别

    1

    A

    2

    B

     

    学生表

    S_ID(P)

    姓名

    性别

    1

    张三

    2

    小芳

    以上设计方案: 实现了实体的设计, 但是没有维护实体的关系.

    一个老师教过多个学生; 一个学生也被多个老师教过.

     

    解决方案: 在学生表中增加老师字段: 不管在哪张表中增加字段, 都会出现一个问题: 该字段要保存多个数据, 而且是与其他表有关系的字段, 不符合表设计规范: 增加一张新表: 专门维护两张表之间的关系

    老师表

    T_ID(P)

    姓名

    性别

    1

    A

    2

    B

    学生表

    S_ID(P)

    姓名

    性别

    1

    张三

    2

    小芳

    中间关系表: 老师与学生的关系

    ID

    T_ID(老师)

    S_ID(学生)

    1

    1

    1

    2

    1

    2

    3

    2

    1

    4

     

     

     

    增加中间表之后: 中间表与老师表形成了一对多的关系: 而且中间表是多表,维护了能够唯一找到一表的关系; 同样的,学生表与中间表也是一个一对多的关系: 一对多的关系可以匹配到关联表之间的数据.

     

    学生找老师: 找出学生id -> 中间表寻找匹配记录(多条) -> 老师表匹配(一条)

    老师找学生: 找出老师id -> 中间表寻找匹配记录(多条) -> 学生表匹配(一条)

     

    第6章 范式

    范式: Normal Format, 是一种离散数学中的知识, 是为了解决一种数据的存储与优化的问题: 保存数据的存储之后, 凡是能够通过关系寻找出来的数据,坚决不再重复存储: 终极目标是为了减少数据的冗余.

     

    范式: 是一种分层结构的规范, 分为六层: 每一次层都比上一层更加严格: 若要满足下一层范式,前提是满足上一层范式.

     

    六层范式: 1NF,2NF,3NF...6NF, 1NF是最底层,要求最低;6NF最高层,最严格.

     

    Mysql属于关系型数据库: 有空间浪费: 也是致力于节省存储空间: 与范式所有解决的问题不谋而合: 在设计数据库的时候, 会利用到范式来指导设计.

    但是数据库不单是要解决空间问题,要保证效率问题: 范式只为解决空间问题, 所以数据库的设计又不可能完全按照范式的要求实现: 一般情况下,只有前三种范式需要满足.

     

    范式在数据库的设计当中是有指导意义: 但是不是强制规范.

     

    6.1 1NF

    第一范式: 在设计表存储数据的时候, 如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说表的设计不满足第一范式: 第一范式要求字段的数据具有原子性: 不可再分.

     

    讲师代课表

    讲师

    性别

    班级

    教室

    代课时间

    代课时间(开始,结束)

    朱元璋

    Male

    php0226

    D302

    30天

    2014-02-27,2014-05-05

    朱元璋

    Male

    php0320

    B206

    30天

    2014-03-21,2014-05-30

    李世民

    Male

    php0320

    B206

    15天

    2014-06-01,2014-06-20

    上表设计不存在问题: 但是如果需求是将数据查出来之后,要求显示一个老师从什么时候开始上课,到什么时候节课: 需要将代课时间进行拆分: 不符合1NF, 数据不具有原子性, 可以再拆分.

    解决方案: 将代课时间拆分成两个字段就解决问题.

     

    6.2 2NF

    第二范式: 在数据表设计的过程中,如果有复合主键(多字段主键), 且表中有字段并不是由整个主键来确定, 而是依赖主键中的某个字段(主键的部分): 存在字段依赖主键的部分的问题, 称之为部分依赖: 第二范式就是要解决表设计不允许出现部分依赖.

     

    讲师带课表

    以上表中: 因为讲师没有办法作为独立主键, 需要结合班级才能作为主键(复合主键: 一个老师在一个班永远只带一个阶段的课): 代课时间,开始和结束字段都与当前的代课主键(讲师和班级): 但是性别并不依赖班级, 教室不依赖讲师: 性别只依赖讲师, 教室只依赖班级: 出现了性别和教室依赖主键中的一部分: 部分依赖.不符合第二范式.

     

    解决方案1: 可以将性别与讲师单独成表, 班级与教室也单独成表.

    解决方案2: 取消复合主键, 使用逻辑主键

    ID = 讲师 + 班级(业务逻辑约束: 复合唯一键)

     

    6.3 3NF

    要满足第三范式,必须满足第二范式.

     

    第三范式: 理论上讲,应该一张表中的所有字段都应该直接依赖主键(逻辑主键: 代表的是业务主键), 如果表设计中存在一个字段, 并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键: 把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖. 第三范式就是要解决传递依赖的问题.

     

    讲师带课表

    以上设计方案中: 性别依赖讲师存在, 讲师依赖主键; 教室依赖班级,班级依赖主键: 性别和教室都存在传递依赖.

     

    解决方案: 将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表, 然后在需要对应的信息的时候, 使用对应的实体表的主键加进来.

    讲师代课表

     

       讲师表                                                                               班级表

                                 

               讲师表: ID = 讲师                                                               班级表中: ID = 班级

     

    6.4 逆规范化

    有时候, 在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息. 理论上讲, 的确可以获取到想要的数据, 但是就是效率低一点. 会刻意的在某些表中,不去保存另外表的主键(逻辑主键), 而是直接保存想要的数据信息: 这样一来,在查询数据的时候, 一张表可以直接提供数据, 而不需要多表查询(效率低), 但是会导致数据冗余增加.

     

    如讲师代课信息表

    逆规范化: 磁盘利用率与效率的对抗

     

    第7章 数据高级操作

    数据操作: 增删改查

     

    7.1 新增数据

    基本语法

    Insert into 表名 [(字段列表)] values (值列表);

     

    在数据插入的时候, 假设主键对应的值已经存在: 插入一定会失败!

     

    7.1.1主键冲突

    当主键存在冲突的时候(Duplicate key),可以选择性的进行处理: 更新和替换

     

    主键冲突:更新操作

    Insert into 表名[(字段列表:包含主键)] values(值列表) on duplicate key update 字段 = 新值;

     

    主键冲突: 替换

    Replace into 表名 [(字段列表:包含主键)] values(值列表);

     

    7.1.2 蠕虫复制

    蠕虫复制: 从已有的数据中去获取数据,然后将数据又进行新增操作: 数据成倍的增加.

     

    表创建高级操作: 从已有表创建新表(复制表结构)

    Create table 表名 like 数据库.表名;

     

    蠕虫复制: 先查出数据, 然后将查出的数据新增一遍

    Insert into 表名[(字段列表)] select 字段列表/* from 数据表名;

    蠕虫复制的意义

    从已有表拷贝数据到新表中
    可以迅速的让表中的数据膨胀到一定的数量级: 测试表的压力以及效率
     

    7.2 更新数据

    基本语法

    Update 表名 set 字段 = 值 [where条件];

     

    高级新增语法

    Update 表名 set 字段 = 值 [where条件] [limit 更新数量];

     

    7.3 删除数据

    与更新类似: 可以通过limit来限制数量

    Delete from 表名 [where条件] [limit 数量];

     

    删除: 如果表中存在主键自增长,那么当删除之后, 自增长不会还原

     

    思路: 数据的删除是不会改变表结构, 只能删除表后重建表

    Truncate 表名; -- 先删除改变,后新增改变

     

    7.4 查询数据

    基本语法

    Select 字段列表/* from 表名 [where条件];

     

    完整语法

    Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句] [limit 子句];

     

    7.4.1 Select选项

    Select选项: select对查出来的结果的处理方式

    All: 默认的,保留所有的结果

    Distinct: 去重, 查出来的结果,将重复给去除(所有字段都相同)

     

    7.4.2 字段别名

    字段别名: 当数据进行查询出来的时候, 有时候名字并一定就满足需求(多表查询的时候, 会有同名字段). 需要对字段名进行重命名: 别名

     

    语法

    字段名 [as] 别名;

     

    7.4.3 数据源

    数据源: 数据的来源, 关系型数据库的来源都是数据表: 本质上只要保证数据类似二维表,最终都可以作为数据源.

     

    数据源分为多种: 单表数据源, 多表数据源, 查询语句

     

    单表数据源: select * from 表名;

     

    多表数据源: select* from 表名1,表名2...;

    从一张表中取出一条记录,去另外一张表中匹配所有记录,而且全部保留:(记录数和字段数),将这种结果成为: 笛卡尔积(交叉连接): 笛卡尔积没什么卵用, 所以应该尽量避免.

     

    子查询: 数据的来源是一条查询语句(查询语句的结果是二维表)

    Select * from (select 语句) as 表名;

     

    7.4.4 Where子句

    Where子句: 用来判断数据,筛选数据.

    Where子句返回结果: 0或者1, 0代表false,1代表true.

     

    判断条件:

    比较运算符: >, <, >=, <= ,!= ,<>, =, like, between and, in/not in

    逻辑运算符: &&(and), ||(or), !(not)

     

    Where原理: where是唯一一个直接从磁盘获取数据的时候就开始判断的条件: 从磁盘取出一条记录, 开始进行where判断: 判断的结果如果成立保存到内存;如果失败直接放弃.

    条件查询1: 要求找出学生id为1或者3或者5的学生

     

    条件查询2: 查出区间落在180,190身高之间的学生:

     

    Between本身是闭区间; between左边的值必须小于或者等于右边的值

     

    7.4.5 Group by子句

    Group by:分组的意思, 根据某个字段进行分组(相同的放一组,不同的分到不同的组)

     

    基本语法: group  by 字段名;

     

    分组的意思: 是为了统计数据(按组统计: 按分组字段进行数据统计)

    SQL提供了一系列统计函数

    Count(): 统计分组后的记录数: 每一组有多少记录

    Max(): 统计每组中最大的值

    Min(): 统计最小值

    Avg(): 统计平均值

    Sum(): 统计和

     

    Count函数: 里面可以使用两种参数: *代表统计记录,字段名代表统计对应的字段(NULL不统计)

     

    分组会自动排序: 根据分组字段:默认升序

    Group by 字段 [asc|desc]; -- 对分组的结果然后合并之后的整个结果进行排序

     

    多字段分组: 先根据一个字段进行分组,然后对分组后的结果再次按照其他字段进行分组

     

    有一个函数: 可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段): group_concat(字段);

     

    回溯统计: with rollup: 任何一个分组后都会有一个小组, 最后都需要向上级分组进行汇报统计: 根据当前分组的字段. 这就是回溯统计: 回溯统计的时候会将分组字段置空.

     

    多字段回溯: 考虑第一层分组会有此回溯: 第二次分组要看第一次分组的组数, 组数是多少,回溯就是多少,然后加上第一层回溯即可.

     

    7.4.6 Having子句

    Having子句: 与where子句一样: 进行条件判断的.

     

    Where是针对磁盘数据进行判断: 进入到内存之后,会进行分组操作: 分组结果就需要having来处理.

     

    Having能做where能做的几乎所有事情, 但是where却不能做having能做的很多事情.

     1.分组统计的结果或者说统计函数都只有having能够使用.

     

    2.Having能够使用字段别名: where不能: where是从磁盘取数据,而名字只可能是字段名: 别名是在字段进入到内存后才会产生.

     

    7.4.7 Order by子句

    Order by: 排序, 根据某个字段进行升序或者降序排序, 依赖校对集.

     

    使用基本语法

    Order by 字段名 [asc|desc]; -- asc是升序(默认的),desc是降序

     

    排序可以进行多字段排序: 先根据某个字段进行排序, 然后排序好的内部,再按照某个数据进行再次排序:

     

    7.4.8 Limit子句

    Limit子句是一种限制结果的语句: 限制数量.

     

    Limit有两种使用方式

     

    方案1: 只用来限制长度(数据量): limit 数据量;

     

    方案2: 限制起始位置,限制数量: limit 起始位置,长度;

     

    Limit方案2主要用来实现数据的分页: 为用户节省时间,提交服务器的响应效率, 减少资源的浪费.

    对于用户来讲: 可以点击的分页按钮: 1,2,3,4

    对于服务器来讲: 根据用户选择的页码来获取不同的数据: limit offset,length;

     

    Length: 每页显示的数据量: 基本不变

    Offset: offset = (页码 - 1) * 每页显示量

     

     

    第8章 连接查询

    连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)

    连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表.

    连接查询: join, 使用方式: 左表 join 右表

    左表: 在join关键字左边的表

    右表: 在join关键字右边的表

    8.1 连接查询分类

    SQL中将连接查询分成四类: 内连接,外连接,自然连接和交叉连接

    8.2 交叉连接

    交叉连接: cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积.

    基本语法: 左表 cross join 右表; ===== from 左表,右表;

     

    笛卡尔积没有意义: 应该尽量避免(交叉连接没用)

    交叉连接存在的价值: 保证连接这种结构的完整性

     

    8.3 内连接

    内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

     

    基本语法

    左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

     

    字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

     

    内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)

     

    内连接还可以使用where代替on关键字(where没有on效率高)

     

    8.4 外连接

    外连接: outer join, 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能比配,正确保留; 不能匹配,其他表的字段都置空NULL.

    外连接分为两种: 是以某张表为主: 有主表

    Left join: 左外连接(左连接), 以左表为主表

    Right join: 右外连接(右连接), 以右表为主表

     

    基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

     

    左连接

     

    右连接

     

    虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.

     

    左连接和右连接可以互转.

    8.5 自然连接

    自然连接: natural join, 自然连接, 就是自动匹配连接条件: 系统以字段名字作为匹配模式(同名字段就作为条件, 多个同名字段都作为条件).

     

    自然连接: 可以分为自然内连接和自然外连接.

     

    自然内连接: 左表 natural join 右表;

     

    自然外连接: 左表 natural left/right join 右表;

     

    其实, 内连接和外连接都可以模拟自然连接: 使用同名字段,合并字段

    左表 left/right/inner join 右表 using(字段名); -- 使用同名字段作为连接条件: 自动合并条件

     

    多表连接: A表 inner join B表 on 条件 left join C表 on条件 ...

    执行顺序: A表内连接B表,得到一个二维表, 左连接C表形成二维表..

    8.6 子连接

    子查询: sub query, 查询是在某个查询结果之上进行的.(一条select语句内部包含了另外一条select语句).

     

    8.6.1 子查询分类

    子查询有两种分类方式: 按位置分类; 按结果分类

     

    按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置

    From子查询: 子查询跟在from之后

    Where子查询: 子查询出现where条件中

    Exists子查询: 子查询出现在exists里面

     

    按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

    标量子查询: 子查询得到的结果是一行一列

    列子查询: 子查询得到的结果是一列多行

    行子查询: 子查询得到的结果是多列一行(多行多列)

    上面几个出现的位置都是在where之后

    表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)

     

    8.6.2 标量子查询

    需求: 知道班级名字为PHP0710,想获取该班的所有学生.

     

    确定数据源: 获取所有的学生
    Select * from my_student where c_id = ?;

    获取班级ID: 可以通过班级名字确定
    Select id from my_class where c_name = ‘PHP0710’; -- id一定只有一个值(一行一列)

     

    标量子查询实现

     

    8.6.3 列子查询

    需求: 查询所有在读班级的学生(班级表中存在的班级)

    1.确定数据源: 学生

    Select * from my_student where c_id in (?);

    2.确定有效班级的id: 所有班级id

    Select id from my_class;

     

    列子查询

     

    列子查询返回的结果会比较: 一列多行, 需要使用in作为条件匹配: 其实在mysql中有还有几个类似的条件: all, some, any

     

    =Any  ====  in; -- 其中一个即可

    Any ====== some; -- any跟some是一样

    =all    ==== 为全部

     

    肯定结果

     

    否定结果

     

    8.6.4 行子查询

    行子查询: 返回的结果可以是多行多列(一行多列)

     

    需求: 要求查询整个学生中,年龄最大且身高是最高的学生.

    1.确定数据源

    Select * from my_student where age = ? And height = ?;

    2.确定最大的年龄和最高的身高;

    Select max(age),max(height) from my_student;

     

    行子查询: 需要构造行元素: 行元素由多个字段构成

     

    8.6.5 表子查询

    表子查询: 子查询返回的结果是多行多列的二维表: 子查询返回的结果是当做二维表来使用

     

    需求: 找出每一个班最高的一个学生.

     

    1.确定数据源: 先将学生按照身高进行降序排序

    Select * from my_student order by height desc;

    2.从每个班选出第一个学生

    Select * from my_student group by c_id; -- 每个班选出第一个学生

     

    表子查询: from子查询: 得到的结果作为from的数据源

     

    8.6.6 Exists子查询

    Exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后: exists返回的结果只有0和1.

     

    需求: 查询所有的学生: 前提条件是班级存在

    1.确定数据源

    Select * from my_student where ?;

    2.确定条件是否满足

    Exists(Select * from my_class); -- 是否成立

     

    Exists子查询

     

    第9章 视图

    视图: view, 是一种有结构(有行有列)但是没结果(结构中不真实存放数据)的虚拟表, 虚拟表的结构来源不是自己定义, 而是从对应的基表中产生(视图的数据来源).

     

    9.1 创建视图

    基本语法

    Create view 视图名字 as select语句; -- select语句可以是普通查询;可以是连接查询; 可以是联合查询; 可以是子查询.

     

    创建单表视图: 基表只有一个

    创建多表视图: 基表来源至少两个

     

    9.2 查看视图

    查看视图: 查看视图的结构

     

    视图是一张虚拟表: 表, 表的所有查看方式都适用于视图: show tables [like]/desc 视图名字/show create table 视图名;

     

    视图比表还是有一个关键字的区别: view. 查看”表(视图)”的创建语句的时候可以使用view关键字

     

    视图一旦创建: 系统会在视图对应的数据库文件夹下创建一个对应的结构文件: frm文件

     

    9.3 使用视图

    使用视图主要是为了查询: 将视图当做表一样查询即可.

     

    视图的执行: 其实本质就是执行封装的select语句.

     

    9.4 修改视图

    视图本身不可修改, 但是视图的来源是可以修改的.

     

    修改视图: 修改视图本身的来源语句(select语句)

    Alter view 视图名字 as 新的select语句;

     

    9.5 删除视图

    Drop view 视图名字;

     

    9.6 视图意义

    1. 视图可以节省SQL语句: 将一条复杂的查询语句使用视图进行保存: 以后可以直接对视图进行操作
    2. 数据安全: 视图操作是主要针对查询的, 如果对视图结构进行处理(删除), 不会影响基表数据(相对安全).
    3. 视图往往是在大项目中使用, 而且是多系统使用: 可以对外提供有用的数据, 但是隐藏关键(无用)的数据: 数据安全
    4. 视图可以对外提供友好型: 不同的视图提供不同的数据, 对外好像专门设计
    5. 视图可以更好(容易)的进行权限控制
     

    9.7 视图数据操作

    视图是的确可以进行数据写操作的: 但是有很多限制

    将数据直接在视图上进行操作.

     

    9.7.1 新增数据

    数据新增就是直接对视图进行数据新增.

     

    1.多表视图不能新增数据

     

    2.可以向单表视图插入数据: 但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)字段

     

    3.视图是可以向基表插入数据的.

     

    9.7.2 删除数据

    多表视图不能删除数据

     

    单表视图可以删除数据

     

    9.7.3 更新数据

    理论上不能单表视图还是多表示视图都可以更新数据.

     

    更新限制: with check option, 如果对视图在新增的时候,限定了某个字段有限制: 那么在对视图进行数据更新操作时,系统会进行验证: 要保证更新之后,数据依然可以被实体查询出来,否则不让更新.

     

    9.8 视图算法

    视图算法: 系统对视图以及外部查询视图的Select语句的一种解析方式.

     

    视图算法分为三种

    Undefined: 未定义(默认的), 这不是一种实际使用算法, 是一种推卸责任的算法: 告诉系统,视图没有定义算法, 系统自己看着办

    Temptable: 临时表算法: 系统应该先执行视图的select语句,后执行外部查询语句

    Merge: 合并算法: 系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高: 常态)

     

    算法指定: 在创建视图的时候

    Create algorithm = 指定算法 view 视图名字 as select语句;

     

    视图算法选择: 如果视图的select语句中会包含一个查询子句(五子句), 而且很有可能顺序比外部的查询语句要靠后, 一定要使用算法temptable,其他情况可以不用指定(默认即可).

    第10章 数据备份与还原

    备份: 将当前已有的数据或者记录保留

    还原: 将已经保留的数据恢复到对应的表中

     

    为什么要做备份还原?

    防止数据丢失: 被盗, 误操作
    保护数据记录
     

    数据备份还原的方式有很多种: 数据表备份, 单表数据备份, SQL备份, 增量备份.

     

    10.1 数据表备份

    不需要通过SQL来备份: 直接进入到数据库文件夹复制对应的表结构以及数据文件, 以后还原的时候,直接将备份的内容放进去即可.

     

    数据表备份有前提条件: 根据不同的存储引擎有不同的区别.

     

    存储引擎: mysql进行数据存储的方式: 主要是两种: innodb和myisam(免费)

     

    对比myisam和innodb: 数据存储方式

    Innodb: 只有表结构,数据全部存储到ibdata1文件中

    Myisam: 表,数据和索引全部单独分开存储

     

    这种文件备份通常适用于myisam存储引擎: 直接复制三个文件即可, 然后直接放到对应的数据库下即可以使用.

     

    10.2 单表数据备份

    每次只能备份一张表; 只能备份数据(表结构不能备份)

     

    通常的使用: 将表中的数据进行导出到文件

     

    备份: 从表中选出一部分数据保存到外部的文件中(outfile)

    Select */字段列表 into outfile 文件所在路径 from 数据源; -- 前提: 外部文件不存在

     

    高级备份: 自己制定字段和行的处理方式

    Select */字段列表 into outfile 文件所在路径 fields 字段处理 lines 行处理 from 数据源;

    Fields: 字段处理

    Enclosed by: 字段使用什么内容包裹, 默认是’’,空字符串

    Terminated by: 字段以什么结束, 默认是”\t”, tab键

    Escaped by: 特殊符号用什么方式处理,默认是’\\’, 使用反斜杠转义

    Lines: 行处理

    Starting by: 每行以什么开始, 默认是’’,空字符串

    Terminated by: 每行以什么结束,默认是”\r\n”,换行符

     

    数据还原: 将一个在外部保存的数据重新恢复到表中(如果表结构不存在,那么sorry)

    Load data infile 文件所在路径 into table 表名[(字段列表)] fields字段处理 lines 行处理; -- 怎么备份的怎么还原

     

    10.3 SQL备份

    备份的是SQL语句: 系统会对表结构以及数据进行处理,变成对应的SQL语句, 然后进行备份: 还原的时候只要执行SQL指令即可.(主要就是针对表结构)

     

    备份: mysql没有提供备份指令: 需要利用mysql提供的软件: mysqldump.exe

    Mysqldump.exe也是一种客户端,需要操作服务器: 必须连接认证

    Mysqldump/mysqldump.exe -hPup 数据库名字 [数据表名字1[ 数据表名字2...]] > 外部文件目录(建议使用.sql)

     

    单表备份

     

    整库备份

    Mysqldump/mysqldump.exe -hPup 数据库名字 > 外部文件目录

     

    SQL还原数据: 两种方式还原

    方案1: 使用mysql.exe客户端还原

    Mysql.exe/mysql -hPup 数据库名字 < 备份文件目录

     

    方案2: 使用SQL指令还原

    Source 备份文件所在路径;

     

    SQL备份优缺点

    优点: 可以备份结构
    缺点: 会浪费空间(额外的增加SQL指令)
     

    10.4 增量备份

    不是针对数据或者SQL指令进行备份: 是针对mysql服务器的日志文件进行备份

    增量备份: 指定时间段开始进行备份., 备份数据不会重复, 而且所有的操作都会备份(大项目都用增量备份)

     

    第11章 事务安全

    事务: transaction, 一系列要发生的连续的操作

    事务安全: 一种保护连续操作同时满足(实现)的一种机制

    事务安全的意义: 保证数据操作的完整性

     

    11.1 事务操作

    事务操作分为两种: 自动事务(默认的), 手动事务

    手动事务: 操作流程

    1.开启事务: 告诉系统以下所有的操作(写)不要直接写入到数据表, 先存放到事务日志

    Start transaction;

     

    2.进行事务操作: 一系列操作

    a) 李四账户减少

     

    b) 张三账户增加

     

    3.关闭事务: 选择性的将日志文件中操作的结果保存到数据表(同步)或者说直接清空事务日志(原来操作全部清空)

    a) 提交事务: 同步数据表(操作成功): commit;

     

    b) 回滚事务: 直接清空日志表(操作失败): rollback;

     

    11.2 自动事务处理

    在mysql中: 默认的都是自动事务处理, 用户操作完会立即同步到数据表中.

    自动事务: 系统通过autocommit变量控制

    Show variables like ‘autocommit’;

     

    关闭自动提交: set autocommit = off/0;

     

    再次直接写操作

     

    自动关闭之后,需要手动来选择处理: commit提交, rollback回滚

     

    注意: 通常都会使用自动事务

     

    11.3 事务原理

    事务操作原理: 事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空(rollback, 断电, 断开连接)

     

    11.4 回滚点

    回滚点: 在某个成功的操作完成之后, 后续的操作有可能成功有可能失败, 但是不管成功还是失败,前面操作都已经成功: 可以在当前成功的位置, 设置一个点: 可以供后续失败操作返回到该位置, 而不是返回所有操作, 这个点称之为回滚点.

     

    设置回滚点语法: savepoint 回滚点名字;

     

    回到回滚点语法: rollback to 回滚点名字;

     

    11.5 事务特性

    事务有四大特性: ACID

    A: Atomic原子性, 事务的整个操作是一个整体, 不可分割,要么全部成功,要么全部失败;

    C: Consistency, 一致性, 事务操作的前后, 数据表中的数据没有变化

    I: Isolation, 隔离性, 事务操作是相互隔离不受影响的.

    D: Durability, 持久性, 数据一旦提交, 不可改变,永久的改变数据表数据

     

    锁机制: innodb默认是行锁, 但是如果在事务操作的过程中, 没有使用到索引,那么系统会自动全表检索数据, 自动升级为表锁

    行锁: 只有当前行被锁住, 别的用户不能操作

    表锁: 整张表被锁住, 别的用户都不能操作

     

    第12章 触发器

    触发器: trigger, 事先为某张表绑定好一段代码 ,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,执行.

    触发器: 事件类型, 触发时间, 触发对象

    事件类型: 增删改, 三种类型insert,delete和update

    触发时间: 前后: before和after

    触发对象: 表中的每一条记录(行)

     

    一张表中只能拥有一种触发时间的一种类型的触发器: 最多一张表能有6个触发器

     

    12.1 创建触发器

    在mysql高级结构中: 没有大括号,  都是用对应的字符符号代替

     

    触发器基本语法

    -- 临时修改语句结束符

    Delimiter 自定义符号: 后续代码中只有碰到自定义符号才算结束

     

    Create trigger 触发器名字 触发时间 事件类型 on 表名 for each row

    Begin -- 代表左大括号: 开始

    -- 里面就是触发器的内容: 每行内容都必须使用语句结束符: 分号

    End -- 代表右带括号: 结束

    -- 语句结束符

    自定义符号

    -- 将临时修改修正过来

    Delimiter  ;

     

    12.2 查看触发器

    查看所有触发器或者模糊匹配

    Show triggers [like ‘pattern’];

    \g 的作用是分号和在sql语句中写’;’是等效的

    \G 的作用是将查到的结构旋转90度变成纵向

     

    可以查看触发器创建语句

    Show create trigger 触发器名字;

     

    所有的触发器都会保存一张表中: Information_schema.triggers

     

    12.3 使用触发器

    触发器: 不需要手动调用, 而是当某种情况发生时会自动触发.(订单里面插入记录之后)

     

    12.4 修改触发器&删除触发器

    触发器不能修改,只能先删除,后新增.

    Drop trigger 触发器名字;

     

    12.5 触发器记录

    触发器记录: 不管触发器是否触发了,只要当某种操作准备执行, 系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来, 供触发器使用: 其中, 要操作的当前状态保存到old中, 操作之后的可能形态保存给new.

    Old代表的是旧记录,new代表的是新记录

    删除的时候是没有new的; 插入的时候是没有old

     

    Old和new都是代表记录本身: 任何一条记录除了有数据, 还有字段名字.

    使用方式: old.字段名 / new.字段名(new代表的是假设发生之后的结果)

     

    查看触发器的效果

     

    如果触发器内部只有一条要执行的SQL指令, 可以省略大括号(begin和end)

    Create trigger 触发器名字 触发时间 事件类型 on 表名 for each row

    一条SQL指令;

    触发器: 可以很好的协调表内部的数据处理顺序和关系. 但是从JAVA角度出发, 触发器会增加数据库维护的难度, 所以较少使用触发器.

    第13章 函数

    函数: 将一段代码块封装到一个结构中, 在需要执行代码块的时候, 调用结构执行即可.(代码复用)

    函数分为两类: 系统函数和自定义函数

     

    13.1 系统函数

    系统定义好的函数, 直接调用即可.

    任何函数都有返回值, 因此函数的调用是通过select调用.

     

    Mysql中,字符串的基本操作单位(最常见的是字符)

    Substring: 字符串截取(字符为单位)

     

    char_length: 字符长度

    Length: 字节长度

     

    Instr: 判断字符串是否在某个具体的字符串中存在, 存在返回位置

     

    Lpad: 左填充, 将字符串按照某个指定的填充方式,填充到指定长度(字符)

     

    Insert: 替换,找到目标位置,指定长度的字符串,替换成目标字符串

     

    MySQL函数

     

    13.2 自定义函数

    函数要素: 函数名, 参数列表(形参和实参), 返回值, 函数体(作用域)

    13.2.1 创建函数

    创建语法

    Create function  函数名([形参列表]) returns 数据类型 -- 规定要返回的数据类型

    Begin

    -- 函数体

    -- 返回值: return 类型(指定数据类型);

    End

     

    定义函数

     

    自定义函数与系统函数的调用方式是一样: select 函数名([实参列表]);

     

    13.2.2 查看函数

    查看所有函数: show function status [like ‘pattern’];

     

    查看函数的创建语句: show create function 函数名;

     

    13.2.3 修改函数&删除函数

    函数只能先删除后新增,不能修改.

    Drop function 函数名;

     

    13.2.4 函数参数

    参数分为两种: 定义时的参数叫形参, 调用时的参数叫实参(实参可以是数值也可以是变量)

    形参: 要求必须指定数据类型

    Function 函数名(形参名字 字段类型) returns 数据类型

     

    在函数内部使用@定义的变量在函数外部也可以访问

     

    13.2.5 作用域

    Mysql中的作用域与js中的作用域完全一样

    全局变量可以在任何地方使用; 局部变量只能在函数内部使用.

    全局变量: 使用set关键字定义, 使用@符号标志

    局部变量: 使用declare关键字声明, 没有@符号: 所有的局部变量的声明,必须在函数体开始之前

     

    第14章 存储过程

    存储过程简称过程,procedure, 是一种用来处理数据的方式.

    存储过程是一种没有返回值的函数.

     

    14.1 创建过程

    Create procedure 过程名字([参数列表])

    Begin

    -- 过程体

    End

     

    14.2 查看过程

    函数的查看方式完全适用于过程: 关键字换成procedure

    查看所有过程: show procedure status [like ‘pattern’];

     

    查看过程创建语句: show create procedure 过程名;

     

    14.3 调用过程

    过程没有返回值: select是不能访问的.

     

    过程有一个专门的调用关键字: call

     

    14.4 修改过程&删除过程

    过程只能先删除,后新增

    Drop procedure 过程名;

     

    14.5 过程参数

    函数的参数需要数据类型指定, 过程比函数更严格.

    过程还有自己的类型限定: 三种类型

    In: 数据只是从外部传入给内部使用(值传递): 可以是数值也可以是变量

    Out: 只允许过程内部使用(不用外部数据), 给外部使用的.(引用传递: 外部的数据会被先清空才会进入到内部): 只能是变量

    Inout: 外部可以在内部使用,内部修改也可以给外部使用: 典型的引用传递: 只能传变量

     

    基本使用

    Create procedure 过程名(in 形参名字 数据类型, out 形参名字 数据类型, inout 形参名字 数据类型)

     

    调用: out和inout类型的参数必须传入变量,而不能是数值

     

    正确调用: 传入变量

     

    存储过程对于变量的操作(返回)是滞后的: 是在存储过程调用结束的时候,才会重新将内部修改的值赋值给外部传入的全局变量.

     

    测试: 传入数据1,2,3: 说明局部变量与全局变量无关

     

    最后: 在存储过程调用结束之后, 系统会将局部变量重复返回给全局变量(out和inout)

     

    关注、留言,我们一起学习。

     

    ===============Talk is cheap, show me the code================

    展开全文
  • MySQL数据库入门学习(多图预警+新手向~)

    万次阅读 多人点赞 2020-09-22 12:40:32
    现在市场上有很多图形化的数据库,没有什么可讲的,读者如果愿意,自行下载研究即可,本文章讲的全是在DOS环境下的一系列操作。

    1. 前言

    作者作为一名大二在校生,因为正在学习网页设计,考虑到后台问题,所以便自学了数据库,可能给大家总结的不是很全,但是一些必要的点肯定会讲到。现在市场上有很多图形化的数据库,没有什么可讲的,读者如果愿意,自行下载研究即可,本文章讲的全是在DOS环境下的一系列操作。


    2. MySQL基础知识

    MySQL经常和“数据库”连在一起读,这很容易对新手造成误解,认为MySQL就是一个数据库,其实不是这样,MySQL是数据库的集合,MySQL里面有很多数据库,那么数据是直接存在数据库里的吗?并不,数据库底下还有一个叫做数据表的存储单元,数据表里面才存储数据。打个比方,好比一座大图书馆,就是MySQL,图书馆里面分南库,北库,这就是数据库,每个库里面的书都是放在书架上的,书架就是数据表,而放在书架上的很多本书,就是数据。这么说,读者应该理解了吧,所以按大小顺序排个序就应该是,MySQL>数据库>数据表>数据,所以我们接下来的内容也是按照这个顺序来展开。


    3. 进入MySQL

    工欲善其事必先利其器,如果连MySQL如何打开都不知道,那如何进行操作学习呢,所以接下来讲解的就是,如何在DOS环境下进入MySQL。
    这里写图片描述

    在这里,我们首先找到MySQL的安装路径,找到“bin”文件夹下的“mysql.exe”,记住这个路径,然后在DOS环境下输入你的路径“D:\BtSoft\WebSoft\mysql\MySQL5.7\bin\mysql -uroot -p”,这里解释一下后面加上“-uroot -p”的作用,因为进入MySQL是需要账号密码进行登陆的,账号密码默认都是“root”,所以当你输完路径之后,摁下回车,就会要求你输入密码。
    这里写图片描述

    既然讲到了账号密码,这里就给大家补充一点,如何免密码登陆

    这里写图片描述

    打开MySQL安装的文件夹,在里面找到一个名为“my.ini”的配置文件,通过记事本或者其他文本编辑的方式打开,在“[mysqld]”的下面加上一句话“skip-grant-tables”然后重启MySQL服务即可

    这里写图片描述

    再次进入MySQL的时候,出现“Enter password”要你输入密码,直接摁回车即可。然后会列出一系列MySQL的版本信息,不用管他,现在可以看到,底下出现了一个“mysql>”接下来就可以对MySQL数据库进行操作了

    这里写图片描述


    **4.数据库的基本操作 **

    1. 查询数据库

    show databases;
    

    下面图片上展示的就是你当前有哪些数据库,这里因为作者之前创建过一些数据库,所以读者如果是第一次查询,可能我图片上的某些数据库你没有,这没有关系。这里要注意,因为数据库不止一个,即便是刚安装好的MySQL,里面默认存在的数据库也不止一个,所以是“databases”,千万别漏了“s”。

    这里写图片描述

    2. 创建数据库

    create database XX(数据库名);
    

    这里我创建了一个名为“hello”的数据库,显示“OK”,表示成功

    这里写图片描述

    在这里给大家补充一点,创建数据库的时候,默认的字符是”latin“,也就是拉丁文,现在读者可能体会不到有什么区别,等到数据表的操作的时候再讲。不过这里还是告诉大家,如何创建数据库的时候,自己定义为什么字符

    create database XX(数据库名) charset = (字符编码,例如utf8);
    

    我们平时学的中文的字符编码是“utf-8”,但是在MySQL里面,中文字符编码是“utf8”,这点希望读者注意。

    创建数据库还有一些细节性的操作,这里也给读者提一下。

    如果我们创建已存在的数据库,会发生什么事呢?下面我就创建一个已经存在的“test”数据库
    这里写图片描述

    果然,报错了,它告诉我,不能创建数据库“test”,因为这个数据库已经存在了,所以我们创建数据库的时候判断一下,如果不存在就创建

    create database if not exists XX(数据库名); 
    

    这段代码的好处是显而易见的,在我们这里可能体现不出来,但如果是做项目的时候或者在企业中,数据库非常非常多,你用肉眼看都要看花了,到底哪些数据库已经存在了,名字被用过了?所以就可以用上面这句代码,下面我们用这段代码创建一下“test”数据库,看会发生什么事情
    这里写图片描述

    看到没,显示“OK”,没有报错了,但是有一个警告,这个警告就是告诉用户,”test“这个数据库存在。

    还有个问题,有的人创建数据库起的名字和关键字相同,会发生什么呢?(关键字就是MySQL中有特定作用的词,比如说“show”、“create”)
    这里写图片描述

    这里英文太长了,有兴趣的读者可以自己去翻译一下,但是这里我们可以确实看到的是,名为“create”的这个数据库没有创建成功,报错了,那如果有的人说我就想创建一个名为“create”的数据库,怎么办呢?下面给出解决办法

    create database `XX`(数据库名);(注意,这里``是反引号,在键盘tab上面)
    

    这里写图片描述

    3. 显示数据库信息

    show create database XX(数据库名);
    

    这里写图片描述

    这里可以看到,我刚才创建的“test”数据库,默认的字符是拉丁的,我之前创建的数据库,我设定了它的字符是中文,所以显示是“utf8”

    4. 更改数据库的字符编码

    alter database XX(数据库名) character set utf8;
    

    5. 删除数据库

    drop database XX(数据库名);
    

    下面我删除刚创建的“hello”数据库
    这里写图片描述

    还是老问题,如果这个数据库不存在,我删除它,会发生什么呢?
    这里写图片描述

    很明显,报错了,因为不存在“a”这个数据库,我们可以判断一下,这个数据库存在才删除,下面给出代码。这里就不演示了,跟创建一样的。

    drop database if exists XX (数据库名字);	
    

    5. 选择数据库
    这是数据库的最后一个基本操作,我们如果想要创建数据,必须要创建一个数据库,然后在数据库当中创建数据表,在数据表中进行操作,但是这么多数据库,计算机怎么知道我们选择的是哪个数据库呢?下面给出代码

    use XX(数据库名);
    

    这里写图片描述

    选择数据库在我的理解更像是“进入数据库”,因为好比图书馆,我得进入一个某一个库,才能进行书架和图书的操作。


    **5.数据表的基本操作 **

    数据表的基本操作全都是在选择了数据库的前提下,请读者注意,下面的所有例子,都是在“test”的数据库内的操作

    1. 创建表

    create table XX(表名)(
    字段1名 数据类型,
    字段2名 数据类型,
    .......
    字段n名 数据类型
    );
    

    在讲解代码之前,请读者先想想,如果要你用Excel做一份班级成绩表,你会怎么做?肯定先有个标题吧,比方说“16级软件一班期末成绩表”,这里的标题就相当于我们的表名。标题有了,我们得在第一行写上“学号”、“姓名"、“总成绩"吧,来告诉看这个表的人,每一列代表的什么东西,这里的“学号”、“姓名"、“总成绩"就相当于我们的字段名。到这里,都这应该对这段代码有所了解了,下面我们创建一个数据表。

    这里写图片描述

    这里需要给大家补充一点MySQL数据类型的知识

    数据类型:int 整型
    		 tinyint 整型(0-256) 
    		 decimal 浮点型(总位数,小数位数) 例如 decimal(3,1)
    	     char(X) 定长字符型 例如 char(10)
    		 varchar(X) 可变长度字符型 例如varchar(10)
    		 text 大段文本
    		 binary 二进制(存储照片等)
    

    具体的没必要多说,只要了解常用的数据类型即可。现在我可以讲讲“Latin”和“utf8”的区别了,如果是在“Latin”字符下创建的数据表,那么一个中文等于两个字符,也就相当于,如果名字是四个字,就要char(8)。但如果是在“utf8”字符下创建的数据表,一个中文等于一个字符,如果名字是四个字,只需要char(4)就够了。

    提醒读者一句,如果用关键字做字段名或者表名,要用反引号

    创建数据表还有一些字段属性的设置,比方说

    null:空
    not null:不为空
    default 'XXXX':默认值
    auto_increment:自动增长
    primary key:主键(主键的特点,不为空,不重复,一个表只能有一个主键,但是一个主键可以由多个列组成)
    

    这些初学者用不到,讲起来很复杂,所以这里就不讲了,有兴趣的读者可以去百度自行了解。

    2. 查看所有表

    show tables;
    

    我在前面就提过,一个MySQL里面有多个数据库,所以,一个数据库里面也可以有多个表,当然,一个表里面也可以有多个数据

    这里写图片描述

    这里因为我只在“test”数据库里创建了一个数据表“stu”,所以显示了一个

    3. 显示创建表

    show create table XX(表名);
    show create table XX(表名) \G;
    

    上面两段代码都是显示创建表,只不过显示的样式不同,读者随意选择一种即可

    show create table stu

    show create table stu \G;

    4. 显示表结构

    describe(或desc) XX(表名);
    

    显示表结构就会展示表中有哪些字段,分别是什么类型,有没有默认值,为不为空,哪个是主键

    这里写图片描述

    5. 删除表(删除多个表)

    drop table XX(表名);
    drop table XX,XX,XX......; 
    

    上面的一句代码是删除一个表,下面的代码是一次性删除多个表


    **5.数据的基本操作 **

    数据的操作算是整个MySQL中最复杂的部分,虽然概括起来无非就是“增删查改”,但每一项底下包含的内容非常之多,作者在这里只能尽量为大家解释比较重要的操作

    1. 插入数据(增加)

    insert into XX(表名) (字段1,字段2,字段3......) values (值1,值2,值3.......);
    

    这里写图片描述

    这里,我插入两组数据,分别是学号为“2016101”,姓名为“李白”,成绩是“83”和学号为“2016102”,姓名为“杜甫”,成绩是“91”的两位同学的信息

    这里还需要给大家做一点补充,如果大家还记得之前我们创建数据表的时候,“id”和“name”都是varchar型,也就是字符串型,字符串型的数据,插入的时候就要加上""
    字段可以和数据库中的字段顺序不一致,但是值和插入字段的顺序必须一致
    插入字段是可以省略的,这时插入的值和数据表的字段顺序和个数必须一致

    2. 查询数据(查)

    这里本来应该按照顺序给大家讲删除数据的,但是因为想给的大家看一下插入数据之后,表内变成什么样了,让大家加深印象,所以这里讲查询数据,首先给大家介绍一个知识点——运算符

    比较运算符 >、>=、<、<=、=(比较和赋值都是"=")、<>(不等于)
    逻辑运算符 and(与)、or(或)、非(not)

    • 查询该表内的所有数据
    select * from XX(表名);
    

    举个例子,我们查询stu表下的所有数据,因为我等会讲的例子涉及到“性别”,所以我提前新增了一个字段名叫“sex”

    这里写图片描述

    • 查询该表内某字段的所有数据
    select 字段1,字段2,字段3......(或用"*"代替所有字段) from XX(表名);
    

    举个例子,我们查询“id”字段底下所有的数据,那么”id“下有哪些数据,就会展现出来

    • 查询某条件的所有数据
    select * from XX(表名)where 字段1 = 值1 and 字段2 = 值2 and ......;
    

    这段代码的意思是,从某个表中找出满足条件一且满足条件二的数据,例如,我们想要寻找成绩等于91分,且性别为女的学生信息

    这里写图片描述

    这里也可以改成,我们想寻找成绩大于90分或者成绩小于60分的学生信息,那么代码就应该是

    select * from stu where score > 90 or score < 60;
    
    • 由低到高排序
    select * from XX(表名) order by 字段x asc;(默认就是升序)
    
    • 由高到低排序
    select * from XX(表名) order by 字段x desc;
    
    • 按某条件排序
    select * from XX(表名) where 字段x = 值x oreder by 字段x asc(desc);
    
    • 取前n条数据
    select * from XX(表名) limit n;
    
    • 从第n条开始(起始位置是0)取m条
    select * from XX(表名) limit n,m;
    
    • 查询某排序下的前n条数据
    select * from XX(表名) order by 字段x asc(desc) limit n;
    

    这几条语句之所以不附上例子,是因为考虑到读者如果有耐心看到了这里,那么你应该基本掌握了MySQL的语法,不再需要例子去模仿,只需要告诉你使用什么语句,所以下面的代码也是一样,不再附上例子

    3. 删除数据(删)

    delete from XX(表名) where 字段x = 值x;
    

    4. 修改数据(改)

    update XX(表名) set 字段1 = 值1,字段2 = 值2 where 条件;
    update XX(表名) set 字段1 = 值1;
    

    下面一条的作用是修改某一字段的所有值,所以不需要加条件

    5.聚合函数

    • sum(); 求和 select sum(字段x) from XX(表名);
    • avg(); 求平均值 select avg(字段x) from XX(表名);
    • max(); 求最大值 select max(字段x) from XX(表名);
    • min(); 求最小值 select min(字段x) from XX(表名);
    • count(); 记录数 select count(字段x) from XX(表名);/select max(*) from XX(表名);
    • 在某字段条件下使用函数 select 函数名() from XX(表名) where 字段x = 值x;

    **6.结语 **

    现在在DOS环境下使用如此繁多的代码操作MySQL数据库已经不多见了,包括我们老师每次都跟我说让我使用图形化工具去操作MySQL,但是作为新手来说,一开始先掌握好这些基础的,再去使用图形化工具,能够很好的理解每一步操作,所以这也是一个打基础的过程。当然,作者水平有限,可能还有很多操作我没有讲到,这些都要靠读者自己去学习,作者只是为初学者领路,入门MySQL,如有任何问题,可以加群689696631交流。最后,感谢观看!

    展开全文
  • mysql数据库学习(一)

    千次阅读 2019-04-02 17:22:40
    数据库(database)数据表(table)字段(column)(字段类型(数据类型)) 列 column 行 row SQL 结构查询语言 查询规则: 1.以分号结束; 2.关键字不区分大小写(推荐大写); 3.三种注释:#,–,/* *...

    数据库(database)数据表(table)字段(column)(字段类型(数据类型))
    列 column 行 row
    SQL 结构查询语言
    查询规则:
    1.以分号结束;
    2.关键字不区分大小写(推荐大写);
    3.三种注释:#,–,/* */;
    mysql支持的数据类型:
    数据类型分类:
    这里写图片描述
    1.数值类型
    这里写图片描述
    一般常用int型数据;
    2.浮点类型
    这里写图片描述
    3.字符串类型
    这里写图片描述
    4.时间日期类型
    这里写图片描述
    一般都使用timestamp类型;
    何为时间戳; 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。它的提出主要是为用户提供一份电子证据,以证明用户的某些数据的产生时间。
    运算符:
    这里写图片描述
    这些在对数据库里内容进行修改,及查找删除时都可以用到;
    对字段名的修饰:
    这里写图片描述
    SQL语句的分类:
    DDL(data defination language)数据库定义语言
    作用:创建 删除 修改 库表结构
    DML(data manipulation language)数据操作语言
    作用:增 删 改表的记录
    DCL(data control lanuage)数据控制语言
    作用:用户的创建以及授权
    DQL(data query lanuage)数据查询语言
    作用:查询数据

    DDL
    show databases; 查看所有数据库
    use 数据库名;切换数据库
    create database 数据库名; 创建数据库
    drop database 数据库名; 删除数据库
    这里写图片描述
    这里写图片描述
    在对表进行操作时,必须进入指定数据库才可以对表进行操作;
    创建数据表:
    create table 表名(
    列名 列类型 其它的关键词
    ···········
    列名 列类型
    );
    查看表结构:
    desc 表名;
    查看创建表的SQL语句:
    show create table 表名
    删除表:
    drop table 表名;
    修改表sql语句:
    alter table 表名 modify 表中字段名(如 列表中的列表名称) 字段修饰词 ;
    其中的modify可以换成其它的词;
    (设置默认值:alter table aa modify gender enum(‘男’,‘女’) not null default ‘男’)
    如果要改变字段名称,用change;
    如果要添加新的列表名称用add,相反删除用drop;
    对表重命名:
    alter table 原表明 rename to 新表名;
    对上面的演示如下图:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • MySQL数据库学习

    万次阅读 2018-08-13 20:41:03
    虽然笔者从事的是Android客户端的开发,平时和数据库打的交道并不多,但是我们对于数据库这一块的学习还是很重要的,今天笔者想总结下MySQL关系型数据库的一些常用知识点 数据库概述 一、常见的概念 数据库...
  • MySql数据库的下载安装及使用教程

    万次阅读 多人点赞 2018-08-12 21:10:21
    这段时间一直在使用python操作mysql数据库,这里简要叙述一下mysql的安装过程。后续的博客中也会讲到python操作mysql的步骤,这里不作介绍。 一、MySql的下载与安装 1.MySQL的下载 在浏览器中输入网址:...
  • mysql 5.7.22 自带的四个数据库 介绍

    万次阅读 2018-05-29 21:36:39
    https://blog.csdn.net/dj673344908/article/details/804828441.终端登录mysql数据库,显示全部数据库(或者直接用客户端工具展示),如下:show databases; 1 四个系统自带库为:information_schema、mysql、...
  • python3基础:操作mysql数据库

    万次阅读 多人点赞 2018-12-10 23:16:49
    mysql -uroot -p(本机不用写host) 退出mysql:ctrl+z+回车,或者exit 端口号默认是3306,但是可以通过安装目录下的配置文件修改。 使用流程 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 ...
  • MySQL数据库命令

    万次阅读 多人点赞 2018-10-30 11:50:34
    1.对数据库常用命令 1.连接数据库 mysql -u用户名 -p密码 2.显示已有数据库 show databases; 3.创建数据库 create database sqlname; 4.选择数据库 use database sqlname; 5.显示数据库中的表(先选择...
  • 本文采用我软件里面的内置改密功能,可以一键强制修改Mysql数据库的密码, 在修改过程中,会强制干掉Mysql主程序,修改完成后重新启动Mysql就可以了。 首先讲解如何一键强制修改PHPWAMP自身的Mysql密码 ...
  • 最新mysql数据库源码编译安装。

    万次阅读 2020-08-21 17:53:55
    一、下载安装相关的工具。 1、yum安装编译工具 yum install -y gcc gcc-c++ cmake ncurses ncurses-devel bison openssl openssl-devel 2、下载mysql5.7.28源码安装包...1、创建数据库存放目录。 mkdir -p /mysql/data
  • 在线设计mysql数据库网站

    万次阅读 2020-01-04 12:50:56
    https://dbdiagram.io/home
  • Android中连接MySql数据库获取数据的简单实现

    万次阅读 多人点赞 2019-02-20 19:37:37
    但是今天我们就来尝试实现直接连接到MySql数据库获取数据的功能。 代码实现 demo很简单,xml布局文件显示的是一个按钮和一个textView控件。 点击按钮实现连接MySql数据库并获取表中的数据;textView用来显示...
  • vs2017连接mysql数据库操作步骤

    万次阅读 多人点赞 2020-05-14 19:41:10
    没有连接过mysql数据库的vs,在创建实体模型的时候,数据源选项没有MySql database ,这是因为没有安装vs使用的MySQL驱动,需要在MySQL官网下载相关驱动,需要下载的文件总共有三个,(这三个是我亲测可用的,没有...
  • MySQL数据库改名最简单的方法

    万次阅读 多人点赞 2020-07-15 15:16:46
    PS:如下操作最好提前先做一次数据库的备份以防万一,谨慎些为好。 我们现在有一个数据库数据库的名称是testbase。 我们现在想将其改为newTestbase。那么我们就需要创建一个名称叫newTestbase的数据库。 重点...
  • MySQL数据库基础讲解

    万次阅读 多人点赞 2020-03-03 12:04:38
    本文讲述了MySQL下的基础操作,希望能对您有所帮助。
  • Android 连接MySQL数据库并进行增删改查操作

    万次阅读 多人点赞 2020-09-20 17:13:46
    1.Android 连接MySQL数据库 public class DBOpenHelper { private static String driver = "com.mysql.jdbc.Driver";//MySQL 驱动 private static String url = "jdbc:mysql://IP:3306/数据库&...
  • IntelliJ IDEA连接Mysql数据库

    千次阅读 多人点赞 2019-05-25 11:25:28
    IntelliJ IDEA连接Mysql数据库 1、首先找到右边的Database的显示框、没有的话在工具栏中View,现在Tool Windows下拉菜单,继续选择Database,就可以出现。 2、然后点击有上角处的那个的“+”,选择Data Source...
  • 忘记 mysql 数据库连接密码(解决方案)

    万次阅读 多人点赞 2019-04-16 18:52:46
    由于 CSDN 的目录只在固定地方显示,并不是很方便阅读,又占空间,所以本文章已同步更新到个人博客上,在个人博客上的...个人博客地址:http://zwd596257180.gitee.io/blog/2019/04/16/mysql_change_password/ ...
  • 登录mysql数据库的几种方式

    万次阅读 多人点赞 2019-04-27 10:05:30
    登录mysql数据库的几种方式 第1种 (通过mysql自带的客户端,MySQL 5.5 Command Line Client) 不推荐这种方式 注意:这种登录方式,只适用于root用户,不够灵活!(只适合于root用户登录,只限于root用户,...
1 2 3 4 5 ... 20
收藏数 1,466,288
精华内容 586,515
关键字:

mysql数据库