MySQL入门
1:数据库原理
1.1:数据与数据管理
现在关于数据方面的技术可以说是非常火,从以前的数据分析,数据挖掘,到现在的大数据,数据科学,甚至于本人自己的的博客名字都包含有数据这两个字,这一方面是真爱。 说到数据,可能就要说到数据的管理相关的技术,现在一般数据的管理技术集中于数据库技术上,简单理解就是通常用的数据库,譬如Oracle。不扯太多,扯多了我也不明白。
我们所说的数据,是对事实或是概念的描述,它可以是不同的符号,如可以使用‘1’来表示一个苹果,‘2’表示两个苹果,这里的数字只是对于现实的一种描述,它承载了你有两个苹果的事实,而两个苹果是你想表达出来的信息,一般理解上而言,数据时信息的载体,信息是数据的内涵。这里我们使用一行记录来做介绍:
(张三, 男,南区#6, 2008年12月, 研发部)
这里使用的员工记录就是一个(组)数据,‘张三’这名‘男’员工住在‘南区#6’,他是在‘2008年12月’加入‘研发部’的。通过上面的一行记录得到关于‘张三’的信息,这边是对于上述数据的理解与提炼,最后的得到的便是信息,所以说,数据与信息是相互关联的,难怪现在数据愈发重要。
1.2:数据库系统的基本概念
前面说到的是数据与信息,我希望得到的是有用的信息,那么我的数据怎么办?它又不能吃?其实数据可以存储在数据库中。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库;也可以理解为按一定规则组织起来,可被多种用户或应用 共享的数据集合。数据库具有逻辑关系和确定含义的数据集合,它针对明确的应用目标而设计,建立,加载,并为用户提供服务,它是对现实世界的映像,现实世界的改变会反映到数据库上面。
数据库管理系统(Database Managemant System, DBMS),位于os与user之间的数据管理软件,DBMS的目标是为用户提供快速,方便的数据操作与管理,它可通过SQL(结构化查询语言)来定义和操作数据,维护数据的完整性和完全性,进行各种数据库的管理操作。
数据库系统(Database System, DBS),意义上而言指计算机系统加入数据库之后的系统,包括数据库,DBMS,应用系统,数据库用户,管理员以及硬件构成。
DB, DBMS, DBS不要弄混了,DB就是一般意义上的数据库,DBMS是一个数据库管理系统,DBS是数据库系统,一般说的MySQL属于DBMS,它属于数据库管理系统,尽管它提供DB的服务,而DBMS包括的则更多,见↑。
1.3:数据库的发展
说数据库的发展之前先说下数据管理的发展,从之前50年代的人工管理,50年代中期的文件系统阶段,后来60年代的数据库管理阶段。然后在1970年, Codd的论文《用于大型共享数据库的关系数据模型》标志了关系型数据库的崛起。
数据库的发展共经历了:
• 层次数据库: 1968年IBM为阿波罗11 号飞船顺利登月提供保证。
• 网状数据库: IDS,1961 年美国通用电气使用数据库
• 关系数据库: oracle、 DB2、 SQLServer、 MySQL等。
• 后关系数据库:
• 面向对象数据库技术: ORDBMS,尚未完全成熟,但能很好地支持数据和对象的管理,很好的与面向对象结合。
• 结构化数据库技术: NOSQL,打破了关系数据库和ACID理论统一的局面,不需要固定的表结构,所以在大型数据存储上有关系数据库无法比拟的性能优势。
2:数据库操作与数据类型
2.1:MySQL的相关介绍
MySQL是一个免费开源的跨平台的小型关系型数据库管理系统,相比于其他数据库而言,尽管功能不是最全面的,但性能相当不错。
我的环境:Win 7 x64, MySQL 5.6.21, Navicat for MySQL 11.
2.2:数据库的操作
2.2.1: 数据库的创建,使用,删除:
mysql> #创建数据库 test_mysql mysql> create database test_mysql; Query OK, 1 row affected (0.10 sec) mysql> #使用数据库 test_mysql mysql> use test_mysql Database changed mysql> #删除数据库 test_mysql mysql> drop database test_mysql -> ; Query OK, 0 rows affected (0.35 sec)
2.2.2:MySQL数据类型
数值类型 | 时间类型 | 字符类型 | ENUM类型 | Set类型 |
数值类型可以分为整数类型(tinyint, int, mediumint, bigint),浮点类型(float, double),定点类型(decimal);
时间类型可以分为date, time, datetime, timestamp, year;
字符类型可以分为char, varchar, text, blob;
下列表格来自:W3Cschool
3:MySQL基础
3.1:数据库的表
表的基本概念:是包含数据库中所有数据的数据库对象。数据在表中的组织方式和电子表格相似,都是按行和列格式组织的。一行代表以为的一条记录,一列代表一个字段。
创建表:
create table table_name(
属性名 数据类型,
属性名 数据类型,
.
属性名 数据类型
);
mysql> create table t_user( -> id int, -> name varchar(20) -> ); Query OK, 0 rows affected (1.18 sec)
查看表的结构:desc table_name;
mysql> desc t_user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.06 sec)
查看表的创建:show create table table_name;
mysql> show create table t_user; +--------+-----------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +--------+-----------------------------------------------------------------------------------------------------------------------------+ | t_user | CREATE TABLE `t_user` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------+-----------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
增删字段:
添加age字段在name字段值后:
mysql> alter table t_user add age tinyint unsigned after name; Query OK, 0 rows affected (1.73 sec) Records: 0 Duplicates: 0 Warnings: 0
修改id为主键:
mysql> alter table t_user add primary key(id); Query OK, 0 rows affected (1.47 sec) Records: 0 Duplicates: 0 Warnings: 0
修改id的默认值,自增长:
mysql> alter table t_user change id id int(11) not null auto_increment; Query OK, 0 rows affected (1.32 sec) Records: 0 Duplicates: 0 Warnings: 0
去除id的自增长,删除主键:
mysql> desc t_user; +-------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +-------+---------------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> insert into t_user values(1, "david", 23); Query OK, 1 row affected (0.20 sec) mysql> alter table t_user change id id int(11) not null; Query OK, 1 row affected (1.75 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> alter table t_user drop primary key; Query OK, 1 row affected (1.27 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> desc t_user; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(20) | YES | | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | +-------+---------------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
3.2:完整性约束
主键约束:提供唯一标识, 不许为空; 自增长约束:附加在主键上,每次递增; 非空约束:字段名的内容不能为空或null,可以为’’; 默认值约束:提供一个默认值; 无符号约束:存储非负数; 唯一性约束:是唯一的但可以为空。 |
3.3:范式
规范的格式(normal format):在数据库的设计过程中,假如遵循相关规范,那么设计的数据库将会简洁,结构清晰。
1NF,确保数据库中的每一列具有原子性,如果设计有‘地址’这一列的话,那么只拥有‘地址’这一个是不够的,它还可以细分:‘省份’,‘城市’,‘详细地址’;
2NF,消除部分依赖,对于具有联合主键的数据表而言,假如有属性对于主键只是部分依赖,那么就可以继续分成几个表,像这里的‘商品名称’对于主键而言就只有部分依赖,而第二范式要求完全依赖,那么就应该细分成几个表;
3NF,消除传递依赖,保证每一列对于数据而言都是直接相关的,不是间接的,对于‘所属单位’与‘订单编号’就是间接的,应该继续划分。
订单编号 | 客户 | 所属单位 | 联系方式 |
001 | 张三 | 武汉公司 | 027-1109998 |
(参考:数据库设计三大范式)
4:数据表的操作
4.1:插入数据
#添加到t_user(1, '杨颖') insert into t_user values(1, '杨颖'); insert into t_user values(2, '黄晓明');
4.2:查看数据
#查询id = 1的数据 select * from t_user where id = 1;
4.3:修改数据
#修改id = 2, name = '郑恺' update t_user set name = '郑恺' where id = 2; select * from t_user;
4.4:删除数据
#删除id = 2的数据 delete from t_user where id = 2; select * from t_user;
4.5:MySQL的复杂逻辑查询
select 字段 | * from table_name [where ...] [group by ...] [having ...] [order by...] [limit ...]
where子句设置条件,group by以…分组,having在前面的基础上在进行挑选,order by以…排序,后面可以加desc(降序显示),asc(默认升序),limit限制结果的条数。
mysql> select * from employee; +----+-----------+------+------+---------+------+-------+-------+ | id | username | age | addr | salary | sex | depId | addr1 | +----+-----------+------+------+---------+------+-------+-------+ | 1 | 张三 | 12 | 2 | 6234.56 | 男 | 1 | 1 | | 2 | 张三丰 | 34 | 3 | 1234.56 | 男 | 2 | 2 | | 3 | 章子怡 | 42 | 2 | 5678.12 | 女 | 3 | 4 | | 4 | 汪峰 | 44 | 4 | 6666.56 | 男 | 4 | 2 | | 5 | 许绍峰 | 34 | 1 | 8888.22 | 男 | 2 | 4 | | 6 | 王宝强 | 39 | 6 | 2345.56 | 男 | 3 | 2 | | 7 | 斯嘉丽 | 36 | 5 | 2345.56 | 女 | 3 | 3 | | 8 | 孙希 | 36 | 5 | 3333.66 | 女 | 8 | 4 | +----+-----------+------+------+---------+------+-------+-------+ 8 rows in set (0.25 sec) mysql> select group_concat(username) as name, salary as money from employee where id < 8 group by sex order by salary asc; +---------------------------------------------+---------+ | name | money | +---------------------------------------------+---------+ | 章子怡,斯嘉丽 | 5678.12 | | 张三,张三丰,汪峰,许绍峰,王宝强 | 6234.56 | +---------------------------------------------+---------+ 2 rows in set (0.02 sec)
这里还需要补:一点:where子句里面可以是关系运算也可以是逻辑运算,还有类似于in [], like, not like, between … and … 。
5:常用函数与MySQL存储过程
5.1:常用函数
算术运算符:+-, */, %(加减乘除取余); 比较运算符:>, >=, <, !=; 逻辑运算符:与或非; 位运算符:按位与,按位或,按位取反。 数学函数:ceil(), floor(), mod().. 时间日期函数:now(), year(), hour(), current_date()… 系统函数:version(), connection_id(),user(), charset() 加密函数:md5(), password(); 流程函数:if(?,a,b), ifnull(null?, a) |
简单的用法:
mysql> select 3/2; +--------+ | 3/2 | +--------+ | 1.5000 | +--------+ 1 row in set (0.00 sec) mysql> select 1 && 1+1; +----------+ | 1 && 1+1 | +----------+ | 1 | +----------+ 1 row in set (0.00 sec) mysql> select ceil(1.2); +-----------+ | ceil(1.2) | +-----------+ | 2 | +-----------+ 1 row in set (0.08 sec) mysql> select username, max(salary) from employee; +----------+-------------+ | username | max(salary) | +----------+-------------+ | 张三 | 8888.22 | +----------+-------------+ 1 row in set (0.01 sec)
5.2:存储过程与函数
存储过程是一组完成特定功能的sql语句集,经过编译后存储在数据库服务器中,用户可以使用特定的的存储过程名加上指定的参数调用存储过程完成特定任务。
创建存储过程 delimiter // create procedure pro_name() begin sql语句 end // delimiter ; 调用存储过程: Call pro_name;
mysql> select * from provinces; +----+--------+ | id | pname | +----+--------+ | 1 | 北京 | | 2 | 上海 | | 3 | 广州 | | 4 | 香港 | +----+--------+ 4 rows in set (0.18 sec) mysql> delimiter // mysql> create procedure pname_p(in p_id int, out p_name varchar(20)) -> begin -> select pname into p_name from provinces where id = p_id; -> end -> // Query OK, 0 rows affected (0.19 sec) mysql> delimiter ; mysql> call pname_p(1, @result); Query OK, 1 row affected (0.04 sec) mysql> select @result; +---------+ | @result | +---------+ | 北京 | +---------+ 1 row in set (0.00 sec)
查看存储过程:show create procedure like ‘pro_name’\G,同时也可以在information_schema.routines
mysql> show procedure status like 'pname_p'\G *************************** 1. row *************************** Db: week5 Name: pname_p Type: PROCEDURE Definer: root@localhost Modified: 2015-01-13 22:17:30 Created: 2015-01-13 22:17:30 Security_type: DEFINER Comment: character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci 1 row in set (0.03 sec) mysql> drop procedure if exists pname_p; Query OK, 0 rows affected (0.12 sec) select * from information_schema.routines\G
mysql> delimiter //
mysql> create function pname_f_provinces(pro_id int)
-> returns varchar(50)
-> begin
-> return (select pname from provinces where id = pro_id);
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
6:视图与图形化工具
6.1:视图
视图是从一个或多个表中的数据,或其他的视图创建的可视化的虚拟表;
创建视图:create view view_name(字段) as select 字段 from table_name where …; 查看已经创建好的视图可以从infofmation_schema数据库中的views表中查看 Select * from information_schema.views\G,或者在数据库下show table status where comment=’view’;
对provinces表创建视图,记录其中的pname:
mysql> select * from provinces; +----+--------+ | id | pname | +----+--------+ | 1 | 北京 | | 2 | 上海 | | 3 | 广州 | | 4 | 香港 | +----+--------+ 4 rows in set (0.00 sec) mysql> create view p_view(name) as select pname from provinces; Query OK, 0 rows affected (0.11 sec) mysql> select * from p_view; +--------+ | name | +--------+ | 北京 | | 上海 | | 广州 | | 香港 | +--------+ 4 rows in set (0.00 sec)
mysql> drop view p_view;
Query OK, 0 rows affected (0.00 sec)
6.2:图形化工具的使用
在mysql下常用的客户端工具有phpmyadmin, navicat for mysql,workbench等,都差不多,选择的是navicat for mysql
新建user表:primary key(id), username varchar(30), age tinyint, addr varchar(50);
7:MySQL触发器
7.1:临时表
在数据的增删改过程中,除了要操作的数据表之外,还有两个表New, Old,例如,在更改数据的过程中,将更改数据存入New表中,被更改的数据短暂地保存在Old表中。
7.2:触发器
触发器的实质还是存储过程,只不过将它定义好后也确定了它需要执行的时刻,在什么条件下执行,多用于维持多个表之间相互关联的操作,避免人为失误。
mysql> select * from user; +-------+------------+-------+-------+ | u_id | u_username | u_sex | u_age | +-------+------------+-------+-------+ | 12301 | jack | 男 | 23 | | 12303 | mary | 女 | 23 | | 12306 | john | 男 | 23 | +-------+------------+-------+-------+ 3 rows in set (0.00 sec) mysql> #创建客户订货次数记录表,表中包含两个字段,分别是用户编号和订货次数 mysql> create table user_order( -> uo_uid int unsigned not null primary key, -> uo_time int unsigned not null -> ); Query OK, 0 rows affected (0.81 sec) mysql> select * from user_order; Empty set (0.00 sec) mysql> #创建触发器,要求每次录入一个客户的信息,就向订货次数表中插入一条数据,并设置其订货次数为0 mysql> create trigger userorder_trigger after insert on user -> for each row -> insert into user_order(uo_uid, uo_time) values(new.u_id, 0); Query OK, 0 rows affected (0.14 sec) mysql> #插入新用户 mysql> select * from user_order; Empty set (0.00 sec) mysql> insert into user values(12305, 'stefan', '男', 30); Query OK, 1 row affected (0.10 sec) mysql> select * from user_order; +--------+---------+ | uo_uid | uo_time | +--------+---------+ | 12305 | 0 | +--------+---------+ 1 row in set (0.00 sec)
查看trigger可以是直接show triggers\G,或者是select * from information_schema.triggers\G,删除触发器drop trigger tr_name。
8:MySQL用户管理
8.1:权限表及其作用
权限表位于mysql数据库中,有user, db, tables_priv, columns_priv, procs_priv等权限表(mysql 5.6.21中未发现host表);
User表存储用户信息,用户权限信息;
Db表示对于指定的数据库存储的用户以及权限相关信息;
Tables_priv设定用户对表拥有的权限;
Columns_priv保存用户对某列所具有的权限;
Procs_priv保存用户对于存储过程,存储函数的权限。
8.2:用户管理
mysql> #创建一个名为user1的新用户 mysql> create user 'user1'; Query OK, 0 rows affected (0.00 sec) mysql> mysql> #创建一个名为user2的新用户,并指定其登录主机为localhost mysql> create user 'user2'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> mysql> #创建一个名为user3的新用户,指定其登录主机为localhost,并指定其密码为pwd mysql> create user 'user3'@'localhost' identified by 'pwd'; Query OK, 0 rows affected (0.00 sec)
#给user3赋予select的权限 grant select on *.* to 'user3'@'localhost'; #将week8.user的更新u_id, username的权限赋给user3 grant update(u_id, u_username) on week8.user to 'user3'@'localhost'; #将赋予user3的更新权限收回 revoke update(u_id, u_username) on week8.user from 'user3'@'localhost';
9:MySQL数据的备份与还原
为什么要进行备份:对于现在大数据时代来说,数据就是价值,因此对于数据的保护相当重要,丢失数据对于企业来说是致命的,而保护数据的方式之一便是备份数据。
备份与还原数据库:mysqldump,navicat:
Mysqldump –u user –h host –p password databasename [tablename] (--all-databases)
Mysqldump, 直接复制数据库, navicat 备份数据库;
Mysql还原:
Mysql –u root –p test1 < C:\Users\ggg\Desktop\kaikeba\testbackup.sql
备份与还原数据:mysqlimport,load data:
导出文件:
Select * from table into outfile ‘d:/data.txt’;
Lines
Terminated by \r\n;
Mysqldump –T D:/ test1 test1 –u root –p(将test1数据库下的test1表导出到D盘下)
还原数据:
Load data infile ‘d:/user.txt’ into table user;
Mysqlimport –u root –p week8 d:/course.txt
10:后语
MySQL的内容说不多那是骗人的,就一篇弄到现在,还有好多没写,后续还会补充。
(完: 2015/1/13)