一、数据库介绍
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1)数据以表格的形式出现
2)每行为各种记录名称
3)每列为记录名称所对应的数据域
4)许多的行和列组成一张表单
5)若干的表单组成database
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
数据库: 数据库是一些关联表的集合。.
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余可以使系统速度更快。(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询;而进行连接操作会降低查询速度。例如,学生的信息存储在student表中,院系信息存储在department表中。通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查找学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称。如果经常需要进行这个操作时,连接查询会浪费很多的时间。因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称。这样就不用每次都进行连接操作了。)
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
二、MySQL管理
由于我使用的是windows平台,附上windows安装MySql详细教程:https://blog.csdn.net/hetongun/article/details/77367638,注意安装完成后环境变量的配置。
1、数据类型
MySQL中定义数据字段的类型对于数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
① 数值类型:
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。
下面的表显示了需要的每个整数类型的存储和范围:
② 日期和时间类型:
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
③ 字符串类型:
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
该节描述了这些类型如何工作以及如何在查询中使用这些类型:
1)CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
2)BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
3)BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
4)有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求
2、管理命令
以下列出了使用Mysql数据库过程中常用的命令:
1)USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
2)SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表。
3)SHOW TABLES: #显示指定数据库的所有表,使用该命令前需要使用 use命令来选择要操作的数据库。
4)SHOW COLUMNS FROM 数据表/ dsec 数据表: #显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
5)create database testdb charset "utf8"; #创建一个叫testdb的数据库,且让其支持中文
6)drop database testdb; #删除数据库
7)SHOW INDEX FROM 数据表:显示数据表的详细索引信息,包括PRIMARY KEY(主键)
1、创建数据库
1 #创建数据库 2 3 mysql> create database testdab charset"utf8"; 4 Query OK, 1 row affected (0.23 sec) 5 6 mysql> show databases; 7 +--------------------+ 8 | Database | 9 +--------------------+ 10 | information_schema | 11 | mysql | 12 | performance_schema | 13 | sakila | 14 | sys | 15 | testdab | 16 | world | 17 +--------------------+ 18 7 rows in set (0.04 sec)
2、创建数据表
1 #创建数据表 2 3 mysql> create table student( 4 -> stu_id int not null auto_increment, 5 -> name char(32) not null, 6 -> age int not null, 7 -> register_date date, 8 -> primary key(stu_id) 9 -> ); 10 Query OK, 0 rows affected (1.34 sec) 11 12 mysql> desc student; 13 +---------------+----------+------+-----+---------+----------------+ 14 | Field | Type | Null | Key | Default | Extra | 15 +---------------+----------+------+-----+---------+----------------+ 16 | stu_id | int(11) | NO | PRI | NULL | auto_increment | 17 | name | char(32) | NO | | NULL | | 18 | age | int(11) | NO | | NULL | | 19 | register_date | date | YES | | NULL | | 20 +---------------+----------+------+-----+---------+----------------+ 21 4 rows in set (0.13 sec)
注: 1)AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1;
2)如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错;
3)PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
3、插入数据表:
1 #插入数据表 2 3 mysql> insert into student (name,age,register_date) values ("visonwong",27,"2018-06-06"); 4 Query OK, 1 row affected (0.01 sec) 5 6 mysql> select * from student; 7 +--------+-----------+-----+---------------+ 8 | stu_id | name | age | register_date | 9 +--------+-----------+-----+---------------+ 10 | 1 | visonwong | 27 | 2018-06-06 | 11 +--------+-----------+-----+---------------+ 12 1 row in set (0.00 sec)
4、查询数据表:
语法:
1 SELECT column_name,column_name 2 FROM table_name 3 [WHERE Clause] 4 [OFFSET M ][LIMIT N]
1、查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
2、SELECT 命令可以读取一条或者多条记录。
3、你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
4、你可以使用 WHERE 语句来包含任何条件。
5、你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
6、你可以使用 LIMIT 属性来设定返回的记录数。
1 #查询数据表 2 3 mysql> select * from student; 4 +--------+--------------+-----+---------------+ 5 | stu_id | name | age | register_date | 6 +--------+--------------+-----+---------------+ 7 | 1 | visonwong | 27 | 2018-06-06 | 8 | 2 | chenxiaohe | 26 | 2018-06-07 | 9 | 3 | yanglikang | 23 | 2018-06-09 | 10 | 4 | wangshuguang | 24 | 2018-06-09 | 11 | 5 | sungongming | 22 | 2018-06-10 | 12 +--------+--------------+-----+---------------+ 13 5 rows in set (0.00 sec) 14 15 mysql> select * from student limit 2 offset 1; 16 +--------+------------+-----+---------------+ 17 | stu_id | name | age | register_date | 18 +--------+------------+-----+---------------+ 19 | 2 | chenxiaohe | 26 | 2018-06-07 | 20 | 3 | yanglikang | 23 | 2018-06-09 | 21 +--------+------------+-----+---------------+ 22 2 rows in set (0.00 sec) 23 24 #比如这个SQL ,limit后面是返回2条数据,offset后面是从第2条开始读取 25 26 mysql> select * from student limit 2,3; 27 +--------+--------------+-----+---------------+ 28 | stu_id | name | age | register_date | 29 +--------+--------------+-----+---------------+ 30 | 3 | yanglikang | 23 | 2018-06-09 | 31 | 4 | wangshuguang | 24 | 2018-06-09 | 32 | 5 | sungongming | 22 | 2018-06-10 | 33 +--------+--------------+-----+---------------+ 34 3 rows in set (0.00 sec) 35 36 #而这个SQL,limit后面是从第3条开始读,读取3条信息
where子句:
语法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
1 mysql> select * from student; 2 +--------+--------------+-----+---------------+ 3 | stu_id | name | age | register_date | 4 +--------+--------------+-----+---------------+ 5 | 1 | visonwong | 27 | 2018-06-06 | 6 | 2 | chenxiaohe | 26 | 2018-06-07 | 7 | 3 | yanglikang | 23 | 2018-06-09 | 8 | 4 | wangshuguang | 24 | 2018-06-09 | 9 | 5 | sungongming | 22 | 2018-06-10 | 10 +--------+--------------+-----+---------------+ 11 5 rows in set (0.00 sec) 12 13 mysql> select * from student where stu_id >3; 14 +--------+--------------+-----+---------------+ 15 | stu_id | name | age | register_date | 16 +--------+--------------+-----+---------------+ 17 | 4 | wangshuguang | 24 | 2018-06-09 | 18 | 5 | sungongming | 22 | 2018-06-10 | 19 +--------+--------------+-----+---------------+ 20 2 rows in set (0.06 sec) 21 22 mysql>
模糊查询:
1 mysql> select * from student; 2 +--------+--------------+-----+---------------+ 3 | stu_id | name | age | register_date | 4 +--------+--------------+-----+---------------+ 5 | 1 | visonwong | 27 | 2018-06-06 | 6 | 2 | chenxiaohe | 26 | 2018-06-07 | 7 | 3 | yanglikang | 23 | 2018-06-09 | 8 | 4 | wangshuguang | 24 | 2018-06-09 | 9 | 5 | sungongming | 22 | 2018-06-10 | 10 +--------+--------------+-----+---------------+ 11 5 rows in set (0.00 sec) 12 13 mysql> select * from student where register_date like "2018-%-09"; 14 +--------+--------------+-----+---------------+ 15 | stu_id | name | age | register_date | 16 +--------+--------------+-----+---------------+ 17 | 3 | yanglikang | 23 | 2018-06-09 | 18 | 4 | wangshuguang | 24 | 2018-06-09 | 19 +--------+--------------+-----+---------------+ 20 2 rows in set, 1 warning (0.00 sec) 21
查询排序:
1 #查询排序 2 3 SELECT field1, field2,...fieldN table_name1, table_name2... 4 ORDER BY field1, [field2...] [ASC [DESC]] 5 使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列 6 7 mysql> select * from student order by age desc; 8 +--------+--------------+-----+---------------+ 9 | stu_id | name | age | register_date | 10 +--------+--------------+-----+---------------+ 11 | 1 | visonwong | 27 | 2018-06-06 | 12 | 2 | chenxiaohe | 26 | 2018-06-07 | 13 | 4 | wangshuguang | 24 | 2018-06-09 | 14 | 3 | yanglikang | 23 | 2018-06-09 | 15 | 5 | sungongming | 22 | 2018-06-10 | 16 +--------+--------------+-----+---------------+ 17 5 rows in set (0.05 sec)
分组统计:
1 #分组统计 2 3 SELECT column_name, function(column_name) 4 FROM table_name 5 WHERE column_name operator value 6 GROUP BY column_name; 7 8 mysql> select * from student; 9 +--------+--------------+-----+---------------+ 10 | stu_id | name | age | register_date | 11 +--------+--------------+-----+---------------+ 12 | 1 | visonwong | 27 | 2018-06-06 | 13 | 2 | chenxiaohe | 26 | 2018-06-07 | 14 | 3 | yanglikang | 23 | 2018-06-09 | 15 | 4 | wangshuguang | 24 | 2018-06-09 | 16 | 5 | sungongming | 22 | 2018-06-10 | 17 | 6 | visonwong | 24 | 2018-06-09 | 18 | 7 | visonwong | 26 | 2018-06-07 | 19 | 8 | visonwong | 29 | 2018-06-07 | 20 +--------+--------------+-----+---------------+ 21 8 rows in set (0.00 sec) 22 23 #接下来我们使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录: 24 25 mysql> select name,count(*) from student group by name; 26 +--------------+----------+ 27 | name | count(*) | 28 +--------------+----------+ 29 | chenxiaohe | 1 | 30 | sungongming | 1 | 31 | visonwong | 4 | 32 | wangshuguang | 1 | 33 | yanglikang | 1 | 34 +--------------+----------+ 35 5 rows in set (0.00 sec) 36 37 mysql> select register_date,count(*) from student group by register_date; 38 +---------------+----------+ 39 | register_date | count(*) | 40 +---------------+----------+ 41 | 2018-06-06 | 1 | 42 | 2018-06-07 | 3 | 43 | 2018-06-09 | 3 | 44 | 2018-06-10 | 1 | 45 +---------------+----------+ 46 4 rows in set (0.00 sec) 47 48 #rollup:统计相同姓名的人年龄加起来,按组划分,并显示所有年龄的汇总 49 50 mysql> select name, sum(age)as age_sum from student group by name with rollup; 51 +--------------+---------+ 52 | name | age_sum | 53 +--------------+---------+ 54 | chenxiaohe | 26 | 55 | sungongming | 22 | 56 | visonwong | 106 | 57 | wangshuguang | 24 | 58 | yanglikang | 23 | 59 | NULL | 201 | 60 +--------------+---------+ 61 6 rows in set (0.04 sec) 62 63 #其中记录 NULL 表示所有人的年龄和 64 #我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法: 65 66 mysql> select coalesce(name,"Total"),sum(age) from student group by name with rollup; 67 +------------------------+----------+ 68 | coalesce(name,"Total") | sum(age) | 69 +------------------------+----------+ 70 | chenxiaohe | 26 | 71 | sungongming | 22 | 72 | visonwong | 106 | 73 | wangshuguang | 24 | 74 | yanglikang | 23 | 75 | Total | 201 | 76 +------------------------+----------+ 77 6 rows in set (0.04 sec)
5、修改数据表
1 #update 2 3 UPDATE table_name SET field1=new-value1, field2=new-value2 4 [WHERE Clause] 5 6 7 mysql> select * from student; 8 +--------+--------------+-----+---------------+ 9 | stu_id | name | age | register_date | 10 +--------+--------------+-----+---------------+ 11 | 1 | visonwong | 27 | 2018-06-06 | 12 | 2 | chenxiaohe | 26 | 2018-06-07 | 13 | 3 | yanglikang | 23 | 2018-06-09 | 14 | 4 | wangshuguang | 24 | 2018-06-09 | 15 | 5 | sungongming | 22 | 2018-06-10 | 16 | 6 | visonwong | 24 | 2018-06-09 | 17 | 7 | visonwong | 26 | 2018-06-07 | 18 | 8 | visonwong | 29 | 2018-06-07 | 19 +--------+--------------+-----+---------------+ 20 8 rows in set (0.00 sec) 21 22 mysql> update student set name = "visonwong1",age = 30 where stu_id =6; 23 Query OK, 1 row affected (0.09 sec) 24 Rows matched: 1 Changed: 1 Warnings: 0 25 26 mysql> select * from student; 27 +--------+--------------+-----+---------------+ 28 | stu_id | name | age | register_date | 29 +--------+--------------+-----+---------------+ 30 | 1 | visonwong | 27 | 2018-06-06 | 31 | 2 | chenxiaohe | 26 | 2018-06-07 | 32 | 3 | yanglikang | 23 | 2018-06-09 | 33 | 4 | wangshuguang | 24 | 2018-06-09 | 34 | 5 | sungongming | 22 | 2018-06-10 | 35 | 6 | visonwong1 | 30 | 2018-06-09 | 36 | 7 | visonwong | 26 | 2018-06-07 | 37 | 8 | visonwong | 29 | 2018-06-07 | 38 +--------+--------------+-----+---------------+ 39 8 rows in set (0.00 sec)
6、删除数据表
1 #删除数据表 2 3 4 mysql> delete from student where age = 30; 5 Query OK, 1 row affected (0.06 sec) 6 7 mysql> select * from student; 8 +--------+--------------+-----+---------------+ 9 | stu_id | name | age | register_date | 10 +--------+--------------+-----+---------------+ 11 | 1 | visonwong | 27 | 2018-06-06 | 12 | 2 | chenxiaohe | 26 | 2018-06-07 | 13 | 3 | yanglikang | 23 | 2018-06-09 | 14 | 4 | wangshuguang | 24 | 2018-06-09 | 15 | 5 | sungongming | 22 | 2018-06-10 | 16 | 7 | visonwong | 26 | 2018-06-07 | 17 | 8 | visonwong | 29 | 2018-06-07 | 18 +--------+--------------+-----+---------------+ 19 7 rows in set (0.00 sec)