Mysql是最流行的RDBMS(Relational Database Management
System:关系数据库管理系统),特别是在WEB应用方面。 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1.数据以表格的形式出现 2.每行为各种记录名称 3.每列为记录名称所对应的数据域 4.许多的行和列组成一张表单 5.若干的表单组成database 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
1. 数据查询语言(DQL:Data Query Language):SELECT 2. 数据操作语言(DML:Data Manipulation Language):INSERT,UPDATE和DELETE 3. 事务处理语言(TPL):BEGIN TRANSACTION,COMMIT和ROLLBACK 4. 数据控制语言(DCL):GRANT(授权)或REVOKE(回收权限) 5. 数据定义语言(DDL):CREATE、ALTER和DROP 6. 指针控制语言(CCL):DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作SQL:
SQL: 结构化查询语言(Structured Query Language)简称SQL,是最重要的关系数据库操作语言.
有上百种数据库产品都支持SQL,如:MySQL、DB2、ORACLE、INGRES、SYBASE、SQLSERVER…
结构化查询语言包含6个部分:
1. 数据查询语言(DQL:Data Query Language):SELECT 2. 数据操作语言(DML:Data Manipulation Language):INSERT,UPDATE和DELETE 3. 事务处理语言(TPL):BEGIN TRANSACTION,COMMIT和ROLLBACK 4. 数据控制语言(DCL):GRANT(授权)或REVOKE(回收权限) 5. 数据定义语言(DDL):CREATE、ALTER和DROP 6. 指针控制语言(CCL):DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作
在本节中,会让大家快速掌握Mysql的基本知识,并轻松使用Mysql数据库。
mysql数据库的安装:
网址:https://www.mysql.com/downloads/ 下载,但是已经是商业版了 可下载 MariaDB 开源的 https://downloads.mariadb.org建议Window上可以安装一个集成环境如:XAMPP:
https://www.apachefriends.org/zh_cn/download.html
Ubuntu系统安装:sudo apt-get install mysql-server mysql-client
服务的启动和停止 配置文件:windows下是:my.ini Linux下:mysqld.conf
连接数据库:
mysql -h 主机名 -u 用户名 -p密码 库名 C:\>mysql --采用匿名账号和密码登陆本机服务 C:\>mysql -h localhost -u root -proot --采用root账号和root密码登陆本机服务 C:\>mysql -u root -p --推荐方式默认登陆本机 Enter password: **** C:\>mysql -u root -p mydb --直接进入mydb数据库的方式登陆 SQL语句中的快捷键 \G 格式化输出(文本式,竖立显示) \s 查看服务器端信息 \c 结束命令输入操作 \q 退出当前sql命令行模式 \h 查看帮助数据库操作:
mysql> show databases; --查看当前用户下的所有数据库 mysql> create database [if not exists] 数据库名; --创建数据库 mysql> use test; --选择进入test数据库 mysql> show create database 数据库名\G --查看建数据库语句 mysql> select database(); --查看当前所在的数据库位置 mysql> drop database [if exists] 数据库名; --删除一个数据库数据表操作:
mysql> show tables; --查看当前库下的所有表格 mysql> desc tb1; --查看tb1的表结构。 mysql> show create table 表名\G --查看表的建表语句。 mysql> create table demo( --创建demo表格 -> name varchar(16) not null, -> age int, -> sex enum('w','m') not null default 'm'); Query OK, 0 rows affected (0.05 sec) mysql> show columns from demo; --查看表结构 mysql> desc demo; --查看表结构 +-------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------+------+-----+---------+-------+ | name | varchar(16) | NO | | NULL | | | age | int(11) | YES | | NULL | | | sex | enum('w','m') | NO | | m | | +-------+---------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql>drop table if exists mytab; -- 尝试删除mytab表格数据操作:
--添加一条数据 mysql> insert into demo(name,age,sex) values('zhangsan',20,'w'); Query OK, 1 row affected (0.00 sec) --不指定字段名来添加数据 mysql> insert into demo values('lisi',22,'m'); Query OK, 1 row affected (0.00 sec) --指定部分字段名来添加数据 mysql> insert into demo(name,age) values('wangwu',23); Query OK, 1 row affected (0.00 sec) --批量添加数据 mysql> insert into demo(name,age,sex) values('aaa',21,'w'),("bbb",22,'m'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from demo; --查询数据 mysql> update demo set age=24 where name='aaa'; --修改 Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> delete from demo where name='bbb'; --删除 Query OK, 1 row affected (0.00 sec)MySQL的数据类型分为三个类: 数值类型、字串类型、日期类型 。 还有一个特殊的值:NULL。
1 数值类型: *tinyint(1字节) 0~255 -128~127 smallint(2字节) mediumint(3字节) *int(4字节) bigint(8字节) *float(4字节) float(6,2) *double(8字节) decimal(自定义)字串形数值 2 字串类型 普通字串 *char 定长字串 char(8) *varchar 可变字串 varchar(8) 二进制类型 tinyblob blob mediumblob longblob 文本类型 tinytext *text 常用于<textarea></textarea> mediumtext longtext *enum枚举 set集合 3 时间和日期类型: date 年月日 time 时分秒 *datetime 年月日时分秒 timestamp 时间戳 year 年 4 NULL值 NULL意味着“没有值”或“未知值” 可以测试某个值是否为NULL 不能对NULL值进行算术计算 对NULL值进行算术运算,其结果还是NULL 0或NULL都意味着假,其余值都意味着真MySQL的运算符
算术运算符:+ - * / % 比较运算符:= > < >= <= <> != 数据库特有的比较:in,not in, is null,is not null,like, between and 逻辑运算符:and or not表的字段约束:
unsigned 无符号(正数) zerofill 前导零填充 auto_increment 自增 default 默认值 not null 非空 PRIMARY KEY 主键 (非null并不重复) unique 唯一性 (可以为null但不重复) index 常规索引建表语句格式:
create table 表名( 字段名 类型 [字段约束], 字段名 类型 [字段约束], 字段名 类型 [字段约束], ... ); mysql> create table stu( -> id int unsigned not null auto_increment primary key, -> name varchar(8) not null unique, -> age tinyint unsigned, -> sex enum('m','w') not null default 'm', -> classid char(6) -> ); Query OK, 0 rows affected (0.05 sec) mysql> desc stu; +---------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(8) | NO | UNI | NULL | | | age | tinyint(3) unsigned | YES | | NULL | | | sex | enum('m','w') | NO | | m | | | classid | char(6) | YES | | NULL | | +---------+---------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) mysql> show create table stu\G --查看建表的语句 *************************** 1. row *************************** Table: stu Create Table: CREATE TABLE `stu` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(8) NOT NULL, `age` tinyint(3) unsigned default NULL, `sex` enum('m','w') NOT NULL default 'm', `classid` char(6) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec)修改表结构:
格式: alter table 表名 action(更改选项); 更改选项: 1. 添加字段:alter table 表名 add 字段名信息 例如: -- 在user表的最后追加一个num字段 设置为int not null mysql> alter table user add num int not null; -- 在user表的email字段后添加一个age字段,设置int not null default 20; mysql> alter table user add age int not null default 20 after email; -- 在user表的最前面添加一个aa字段设置为int类型 mysql> alter table user add aa int first; 2. 删除字段:alter table 表名 drop 被删除的字段名 例如:-- 删除user表的aa字段 mysql> alter table user drop aa; 3. 修改字段:alter table 表名 change[modify] 被修改后的字段信息 其中:change可以修改字段名, modify 不修改 例如: -- 修改user表中age字段信息(类型),(使用modify关键字的目的不修改字段名) mysql> alter table user modify age tinyint unsigned not null default 20; -- 修改user表的num字段改为mm字段并添加了默认值(使用change可以改字段名) mysql> alter table user change num mm int not null default 10; 4. 添加和删除索引 -- 为user表中的name字段添加唯一性索引,索引名为uni_name; mysql> alter table user add unique uni_name(name); -- 为user表中的email字段添加普通索引,索引名为index_eamil mysql> alter table user add index index_email(email); -- 将user表中index_email的索引删除 mysql> alter table user drop index index_email; 5. 更改表名称: ALTER TABLE 旧表名 RENAME AS 新表名 6. 更改AUTO_INCREMENT初始值: ALTER TABLE 表名称 AUTO_INCREMENT=1 7. 更改表类型: ALTER TABLE 表名称 ENGINE="InnoDB" MySQL数据库中的表类型一般常用两种:MyISAM和InnoDB 区别:MyISAM类型的数据文件有三个frm(结构)、MYD(数据)、MYI(索引) MyISAM类型中的表数据增 删 改速度快,不支持事务,没有InnoDB安全。 InnoDB类型的数据文件只有一个 .frm InnoDB类型的表数据增 删 改速度没有MyISAM的快,但支持事务,相对安全。添加数据:
格式: insert into 表名[(字段列表)] values(值列表...); --标准添加(指定所有字段,给定所有的值) mysql> insert into stu(id,name,age,sex,classid) values(1,'zhangsan',20,'m','lamp138'); Query OK, 1 row affected (0.13 sec) mysql> --指定部分字段添加值 mysql> insert into stu(name,classid) value('lisi','lamp138'); Query OK, 1 row affected (0.11 sec) -- 不指定字段添加值 mysql> insert into stu value(null,'wangwu',21,'w','lamp138'); Query OK, 1 row affected (0.22 sec) -- 批量添加值 mysql> insert into stu values -> (null,'zhaoliu',25,'w','lamp94'), -> (null,'uu01',26,'m','lamp94'), -> (null,'uu02',28,'w','lamp92'), -> (null,'qq02',24,'m','lamp92'), -> (null,'uu03',32,'m','lamp138'), -> (null,'qq03',23,'w','lamp94'), -> (null,'aa',19,'m','lamp138'); Query OK, 7 rows affected (0.27 sec) Records: 7 Duplicates: 0 Warnings: 0修改操作:
格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 条件 -- 将id为11的age改为35,sex改为m值 mysql> update stu set age=35,sex='m' where id=11; Query OK, 1 row affected (0.16 sec) Rows matched: 1 Changed: 1 Warnings: 0 -- 将id值为12和14的数据值sex改为m,classid改为lamp92 mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等价于下面 mysql> update stu set sex='m',classid='lamp92' where id in(12,14); Query OK, 2 rows affected (0.09 sec) Rows matched: 2 Changed: 2 Warnings: 0删除操作:
格式:delete from 表名 [where 条件] -- 删除stu表中id值为100的数据 mysql> delete from stu where id=100; Query OK, 0 rows affected (0.00 sec) -- 删除stu表中id值为20到30的数据 mysql> delete from stu where id>=20 and id<=30; Query OK, 0 rows affected (0.00 sec) -- 删除stu表中id值为20到30的数据(等级于上面写法) mysql> delete from stu where id between 20 and 30; Query OK, 0 rows affected (0.00 sec) -- 删除stu表中id值大于200的数据 mysql> delete from stu where id>200; Query OK, 0 rows affected (0.00 sec)格式:
select [字段列表]|* from 表名 [where 搜索条件] [group by 分组字段 [having 子条件]] [order by 排序 asc|desc] [limit 分页参数]各种查询:
mysql> select * from stu; +----+----------+-----+-----+---------+ | id | name | age | sex | classid | +----+----------+-----+-----+---------+ | 1 | zhangsan | 20 | m | lamp138 | | 2 | lisi | 20 | m | lamp138 | | 3 | wangwu | 21 | w | lamp138 | | 4 | zhaoliu | 25 | w | lamp94 | | 5 | uu01 | 26 | m | lamp94 | | 6 | uu02 | 28 | w | lamp92 | | 7 | qq02 | 24 | m | lamp92 | | 8 | uu03 | 32 | m | lamp138 | | 9 | qq03 | 23 | w | lamp94 | | 10 | aa | 19 | m | lamp138 | | 11 | sad | 35 | m | lamp94 | | 12 | tt | 25 | m | lamp92 | | 13 | wer | 25 | w | lamp94 | | 14 | xx | 25 | m | lamp92 | | 15 | kk | 0 | w | lamp94 | +----+----------+-----+-----+---------+ 15 rows in set (0.00 sec) 1. where条件查询 1. 查询班级为lamp138期的学生信息 mysql> select * from stu where classid='lamp138'; 2. 查询lamp138期的男生信息(sex为m) mysql> select * from stu where classid='lamp138' and sex='m'; 3. 查询id号值在10以上的学生信息 mysql> select * from stu where id>10; 4. 查询年龄在20至25岁的学生信息 mysql> select * from stu where age>=20 and age<=25; mysql> select * from stu where age between 20 and 25; 5. 查询年龄不在20至25岁的学生信息 mysql> select * from stu where age not between 20 and 25; mysql> select * from stu where age<20 or age>25; 6. 查询id值为1,8,4,10,14的学生信息 select * from stu where id in(1,8,4,10,14); mysql> select * from stu where id=1 or id=8 or id=4 or id=10 or id=14; 7. 查询lamp138和lamp94期的女生信息 mysql> select * from stu where classid in('lamp138','lamp94') and sex='w'; mysql> select * from stu where (classid='lamp138' or classid='lamp94') and sex='w授权:
格式:grant 允许操作 on 库名.表名 to 账号@来源 identified by '密码'; 实例:创建zhangsan账号,密码123,授权lamp61库下所有表的增/删/改/查数据,来源地不限 mysql> grant select,insert,update,delete on lamp61.* to zhangsan@'%' identified by '123'; mysql> grant all on *.* to zhangsan@'%' identified by '123'; Query OK, 0 rows affected (0.00 sec) 授权一个用户(zhangsan)密码123,可以对所有的库,所有的表做所有操作。 mysql> grant all on *.* to zhangsan@'%' identified by '123'; Query OK, 0 rows affected (0.17 sec) 刷新生效,否则就要重启MySQL服务才可以。 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 浏览当前MySQL用户信息 mysql> select user,host,password from mysql.user; +----------+-----------------+-------------------------------------------+ | user | host | password | +----------+-----------------+-------------------------------------------+ | root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | | root | 127.0.0.1 | | | | localhost | | | zhangsan | % | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | | admin | 192.168.112.132 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | +----------+-----------------+-------------------------------------------+ 5 rows in set (0.00 sec) 移除一些权限 revoke:只删除了用户权限,但没有删除这个用户 mysql> revoke insert,delete on *.* from admin@192.168.112.132 identified by'123'; 查看指定用户的权限信息 mysql> show grants for xbb@localhost; +------------------------------------------------------------------------------------------------------------+ | Grants for xbb@localhost | +------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'xbb'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' | +------------------------------------------------------------------------------------------------------------+ drop user:删除了整个用户及其权限(包括数据字典中的数据) mysql> drop user 'xbb'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> select user,host from mysql.user; +------------------+-----------+ | user | host | +------------------+-----------+ | root | 127.0.0.1 | | debian-sys-maint | localhost | | root | localhost | | root | wangxg | +------------------+-----------+ 4 rows in set (0.00 sec)备份与恢复(导入和导出)
将lamp138库导出 D:\>mysqldump -u root -p lamp138 >lamp138.sql Enter password: ---- 将lamp138库中的stu表导出 D:\>mysqldump -u root -p lamp138 stu >lamp138_stu.sql Enter password: -- 将lamp138库导入 D:\>mysql -u root -p lamp138<lamp138.sql Enter password: -- 将lamp138库中stu表导入 D:\>mysql -u root -p lamp138<lamp138_stu.sql Enter password:表之间的关系有: 1.对1 1对多 多对多
1.嵌套查询:一个查询的结果是另外sql查询的条件:
如:查询stu表中年龄最大的是谁? mysql> select * from stu where age=(select max(age) from stu); mysql> select * from stu where age in(select max(age) from stu); --(子查询结果是多条时使用in查询) +----+------+------+-----+----------+ | id | name | age | sex | classid | +----+------+------+-----+----------+ | 14 | abc | 33 | w | python01 | +----+------+------+-----+----------+ 1 row in set (0.01 sec)2.where关联查询
已知:员工personnel表和部门department表,其中员工表中的did字段为部门表id主键关联。 查询所有员工信息,并显示所属部门名称 要求:显示字段:员工id 部门 姓名 mysql> select p.id,d.name,p.name from personnel p,department d where p.did = d.id; +----+-----------+-----------+ | id | name | name | +----+-----------+-----------+ | 2 | 人事部 | 李玉刚 | | 10 | 人事部 | 阿杜 | | 4 | 市场部 | 刘欢 |连接join查询
左联:left join 右联:right join 内联:inner join 已知如下表所示,商品类别信息表(具有两层类别关系,通过pid表示,0表示一级类别) mysql> select * from type; +----+-----------+------+ | id | name | pid | +----+-----------+------+ | 1 | 服装 | 0 | | 2 | 数码 | 0 | | 3 | 男装 | 1 | | 4 | 手机 | 2 | | 5 | 相机 | 2 | | 6 | 电脑 | 2 | | 7 | 女装 | 1 | | 8 | 童装 | 1 | | 9 | 食品 | 0 | | 10 | 零食 | 9 | | 11 | 特产 | 9 | | 12 | 休闲装 | 1 | +----+-----------+------+ 12 rows in set (0.00 sec) mysql> desc type; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(16) | NO | | NULL | | | pid | int(10) unsigned | YES | | NULL | | +-------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)查询二级类别信息,并关联出他们的父类别名称
mysql> select t1.id,t1.name,t2.name from type t1,type t2 where t1.pid!=0 and t1.pid=t2.id; +----+-----------+--------+ | id | name | name | +----+-----------+--------+ | 3 | 男装 | 服装 | | 4 | 手机 | 数码 | | 5 | 相机 | 数码 | | 6 | 电脑 | 数码 | | 7 | 女装 | 服装 | | 8 | 童装 | 服装 | | 10 | 零食 | 食品 | | 11 | 特产 | 食品 | | 12 | 休闲装 | 服装 | +----+-----------+--------+ 9 rows in set (0.01 sec)统计每个一级类别下都有多少个子类别。
mysql> select t1.id,t1.name,count(t2.id) from type t1,type t2 where t1.pid=0 and t1.id=t2.pid group by t1.id; +----+--------+--------------+ | id | name | count(t2.id) | +----+--------+--------------+ | 1 | 服装 | 4 | | 2 | 数码 | 3 | | 9 | 食品 | 2 | +----+--------+--------------+ 3 rows in set (0.00 sec)MySQL的表复制
复制表结构 mysql> create table 目标表名 like 原表名; 复制表数据 mysql> insert into 目标表名 select * from 原表名;数据表的索引
创建索引 CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list) 删除索引 DROP INDEX index_name ON talbe_namemysql视图
创建视图: mysql> create view v_t1 as select * from t1 where id>4 and id<11; Query OK, 0 rows affected (0.00 sec) view视图的帮助信息: mysql> ? view ALTER VIEW CREATE VIEW DROP VIEW 查看视图: mysql> show tables; 删除视图v_t1: mysql> drop view v_t1;MySQL的内置函数 字符串处理函数
数值函数
日期和时间函数
其他常用函数
5.MySQL的事务处理
关闭自动提交功能(开启手动事务) mysql> set autocommit=0; 从表t1中删除了一条记录 mysql> delete from t1 where id=11; 此时做一个p1还原点: mysql> savepoint p1; 再次从表t1中删除一条记录: mysql> delete from t1 where id=10; 再次做一个p2还原点: mysql> savepoint p2; 此时恢复到p1还原点,当然后面的p2这些还原点自动会失效: mysql> rollback to p1; 退回到最原始的还原点: mysql> rollback; 回滚 开启自动事务提交(关闭手动事务) mysql> set autocommit=1;6.MySQL的触发器
格式: 触发器的定义: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 说明: trigger_name:触发器名称 trigger_time:触发时间,可取值:BEFORE或AFTER trigger_event:触发事件,可取值:INSERT、UPDATE或DELETE。 tb1_name:指定在哪个表上 trigger_stmt:触发处理SQL语句。 示例: mysql> delimiter $$ mysql> create trigger del_stu before delete on stu for each row -> begin -> insert into stu_bak values(old.id,old.name,old.sex,old.age,old.addtime); -> end; -> $$ Query OK, 0 rows affected (0.05 sec) mysql> delimiter ;7.mysql日志
开启日志: 在mysql配置文件中开启:log-bin=mysql-bin 查看bin-log日志: mysql>show binary logs; 查看最后一个bin-log日志: mysql>show master status; 此时就会多一个最新的bin-log日志 mysql>flush logs; 查看最后一个bin日志. mysql>show master status; mysql>reset master; 清空所有的bin-log日志 执行查看bin-log日志 备份数据: mysqldump -uroot -pwei test -l -F '/tmp/test.sql' 其中:-F即flush logs,可以重新生成新的日志文件,当然包括log-bin日志 Linux关闭MySQL的命令 $mysql_dir/bin/mysqladmin -uroot -p shutdown linux启动MySQL的命令 $mysql_dir/bin/mysqld_safe &8.有关慢查询操作:
开户和设置慢查询时间: vi /etc/my.cnf log_slow_queries=slow.log long_query_time=5 查看设置后是否生效 mysql> show variables like "%quer%"; 慢查询次数: mysql> show global status like "%quer%"; **数据库的恢复** 1. 首先恢复最后一次的备份完整数据 [root@localhost mnt]# mysql -u root -p mydemo<mydemo_2017-7-26.sql Enter password: 2. 查看bin-log日志 [root@localhost data]# mysqlbinlog --no-defaults mysql-bin.000009; 查找到恢复的节点 3. 执行bin-log日志文件,恢复最后一块的增量数据。 [root@localhost data]# mysqlbinlog --no-defaults --stop-position="802" mysql-bin.000009|mysql -