收藏 分销(赏)

与MySQL的零距离接触.docx

上传人:仙人****88 文档编号:12024017 上传时间:2025-08-29 格式:DOCX 页数:26 大小:2.48MB 下载积分:10 金币
下载 相关 举报
与MySQL的零距离接触.docx_第1页
第1页 / 共26页
与MySQL的零距离接触.docx_第2页
第2页 / 共26页


点击查看更多>>
资源描述
《与MySQL的零距离接触》笔记 目录:(按住Ctrl并单击可访问链接) 第一部份::MySQL基础 MySQL概述 MySQL的安装与配置 MySQL目录结构 修改编码方式 启动/停止MySQL服务 登陆/退出MySQL 修改MySQL提示符 MySQL常用命令 语法规范 操作数据库 第二部份::数据类型 整型 浮点型 日期时间型 字符型 第三部份::数据表操作 打开数据库 创建数据表 查看数据表 记录的插入与查找 空值与非空 自动编号及主键约束 唯一约束 默认约束 第四部份::外键约束 外键约束的要求解析 编程数据表的默认存储引擎 实例 外键约束的参照操作 第五部份::修改数据表 删除约束 添加约束 删除单/多列 添加单/多列 修改列定义和更名数据表 第六部份::数据表的记录操作 插入记录 单表记录更新UPDATE 单表删除DELETE 第七部份::查询表达式 select直接调用函数 查询表达式select_expr 条件查询WHERE 查询结果分组GROUP BY 分组条件HAVING order by对结果排序 限制查询结果返回的数量LIMIT 第八部份::子查询 导入数据 子查询基本概念 由比较运算符引发的子查询 由[NOT] IN/EXISTS引发的子查询 使用INSERT...SELECT插入记录时使用子查询 多表更新一步到位 第九部份::连接JOIN 连接的语法结构 三种连接的演示 关于连接的几点说明 自身连接 单表删除多张表的操作 第十部份::内置函数库 字符函数 数值运算符和函数 比较运算符和函数 日期时间函数 信息函数 聚合函数 加密函数 第十一部份::自定义函数 自定义函数简介 创建不带参数的自定义函数 创建带有参数 创建具有复合结构函数体的 第十二部份::MySQL存储过程 存储过程的简介 创建不带参数的存储过程 创建带有IN类型参数的存储过程 创建带有IN和OUT类型参数的存储过程 创建带有多个OUT类型参数的存储过程 存储过程与自定义函数的区别 第十三部份::MySQL存储引擎 存储引擎的简介及相关知识点 各种存储引擎的特点 设置存储引擎 第十四部份::MySQL图形化管理工具 phpMyAdmin MySQL Workbench Navicat for MySQL -----课程来自《幕课网》@开然 2014.12.28 Ø MySQL基础 l MySQL概述: MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司。 MySQL是一个开源的关系型数据库管理系统(是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据)。 MySQL分为社区版和企业版。 MySQL默认的端口号:3306 MySQL中的超级用户名:root l MySQL的安装与配置: 安装方式:MIS安装(windows Installer)、ZIP安装两种方式。 配置MySQL: 1、 运行MySQL配置向导文件:MIS方式安装的需配置。 2、 启动MySQL服务:开始à管理工具à服务(本地)à找到MySQL设置为自动,然后在计算机属性à高级系统设置à高级à环境变量à在系统变量找到pathà编辑,确定变量值后面已经启动了MySQL服务。 l MySQL目录结构: /bin:存储可执行文件 /data:存储数据文件 /docs:文档 /include:存储包含的头文件 /lib:存储库文件 /share:错误消息和字符集文件 l 修改编码方式: 打开my.ini在[mysql]下添加或修改default-character-set=utf8,在[mysqld]下添加或修改character-set-server=utf8。 l 启动/停止MySQL服务: 方式一:服务(本地)里设置MySQL为启动/停止状态; 方式二:命令行输入:启动:net start mysql 停止:net stop mysql l 登陆/退出MySQL: cdm运行后输入mysql -uroot -p 回车,提示输入密码,输入密码回车就可以了,如果刚装好的mysql,超级用户root使没有密码的,所以直接回车就可以进入mysql中了。出现提示符:mysql> 则表示已经进入 MySQL。 在登陆MySQL后,输入以下三个命令均可以退出MySQL(含分号):exit; quit; \q; 。 l 修改MySQL提示符: 方式一:通过参数指定:cdm运行登陆后输入命令:mysql –uroot –proot - -prompt \h 回车,提示符改为localhost,\h参数是服务器名称,指向localhost。 方式二: 通过prompt命令修改:同上,输入命令:prompt mysql> 回车,即可修改提示符为mysql。 对于提示符的参数,如右侧所示: 输入如下命令:prompt \u@\h \d> 回车后提示符变为:root@localhost (none)> l MySQL常用命令: 1、 打印当前服务器版本:select version(); 2、 打印当前日期时间:select now(); 3、 打印当前用户:select user(); l 语法规范: 1、 关键字与函数名称全部大写; 2、 数据库名称、表名称、字段名称全部小写; 3、 SQL语句必须以分号结尾。 l 操作数据库 1、 列出服务器的数据库:mysql>SHOW DATABASES; 2、 创建一个数据库名为abccs:mysql> CREATE DATABASE abccs; 列出创建的数据库,查看其字符集:(如下图字符集为latin1) 修改数据库,并设置字符集为utf8: 3、 选择所创建的数据库:mysql> USE abccs 回车出现Database changed,表示已经进入。 4、 删除一个数据库:mysql> DROP DATABASE abccs。 Ø 数据类型: 指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。数据类型有整型、浮点型、日期时间型、字符串。 l 整型: 计算机以二进制形式存储,符号位以0和1开头,1为有符号位。 l 浮点型: float单精度,double双精度 l 日期时间型: l 字符型: Ø 数据表操作: 是数据库最重要的组成部份之一,是其它对象的基础。 l 打开数据库:如下左图 mysql> USE abc; SELECT DATABASE(); à显示当前打开的数据库 l 创建数据表:如上右图 mysql> CREATE TABLE tb2( -> username VARCHAR(20), -> age TINYINT UNSIGNED, à unsigned:无符号 -> salary FLOAT(8,2) UNSIGNED -> ); l 查看数据表: mysql> SHOW TABLES; à查看数据表 mysql> SHOW COLUMNS FROM tb1; à查看数据表结构,如右图 l 记录的插入与查找: 向数据表中写入记录(全部/部份): mysql>INSERT tb1 VALUES('Tom',25,6456.55); mysql> INSERT tb1(username,salary) VALUES('John',8000.00); 查找全部的字符记录: mysql> SELECT *FROM tb1; l 空值与非空: NULL,字段可以为空;NOT NULL,字段值禁止为空,如下例,在username输入时Null时会提示出错: mysql> CREATE TABLE tb3( -> username VARCHAR(20) NOT NULL, -> age TINYINT UNSIGNED NULL -> ); mysql> INSERT tb3 VALUES('Tony',null); mysql> INSERT tb3 VALUES(NULL,'26'); ERROR 1048 (23000): Column 'username' cannot be null l 自动编号及主键约束: AURO_INCREMENT自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次增量为1。 PRIMARY KEY主键约束,每张数据表只能存在一个主键,主键保户记录的唯一性,自动为NOT NULL,但主键不一定须与AURO_INCREMENT组合使用。 mysql> CREATE TABLE tb4( -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, à将id定义为主键,并自动编号 -> username VARCHAR(30) NOT NULL -> ); mysql> INSERT tb4(username) VALUES('Tom'); mysql> INSERT tb4(username) VALUES('John'); mysql> INSERT tb4(username) VALUES('Rose'); 右图所示,实现自动编号。下面例子没有使用AURO_INCREMENT,当两个id号相同时,会报错: mysql> CREATE TABLE tb5( -> id SMALLINT KEY, à PRIMARY可以省略 -> username VARCHAR(30) NOT NULL -> ); mysql> INSERT tb5(username) VALUES('Tom'); mysql> INSERT tb5 VALUES(4,'John'); mysql> INSERT tb5 VALUES(22,'Rose'); mysql> INSERT tb5 VALUES(22,'Hany'); ERROR 1062 (23000): Duplicate entry '22' for key 'PRIMARY' àid号重叠,报错 l 唯一约束: UNIQUE KEY唯一约束,可以保证记录的唯一性,其字符段可以为空值NULL,每张数据表可以存在多个唯一约束。对比PRIMARY KEY只有一个约束,UNIQUE KEY可以有多个。 mysql> CREATE TABLE tb6( -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -> username VARCHAR(20) NOT NULL UNIQUE KEY, -> age TINYINT UNSIGNED); mysql> INSERT tb6(username,age) VALUES('Tom',22); Query OK, 1 row affected (0.09 sec) mysql> INSERT tb6(username,age) VALUES('Tom',22); ERROR 1062 (23000): Duplicate entry 'Tom' for key 'username' à提示错误 mysql> insert tb6(username,age) values('Hany',22); Query OK, 1 row affected (0.09 sec) mysql> insert tb6(username,age) values('baby',12); Query OK, 1 row affected (0.17 sec) l 默认约束: DEFAULT当插入记录时没有明确为字段赋值,则自动赋予默认值。 mysql> create table tb7( -> id smallint unsigned auto_increment primary key, -> user varchar(20) not null unique key, -> sex enum('1','2','3') default '3'); mysql> insert tb7(user) values('Tom'); 由上图可见,只输入一个user值为Tom时,系统默认其set为3。 Ø 外键约束: 约束保证数据的完整性和一致性,针对字段的数量把约束分为表级约束(针对一个字段时)和列级约束(两个或两个以上的字段)。约束类型包含以下5种:NOT NULL非空约束、PRIMARY KRY主键约束,UNIQUE KEY唯一约束、DEFAULT默认约束、FOREIGN KEY外键约束。 对一个数据列建立的约束,称为列级约束;对多个数据列建立的约束,称为表级约束。列级约束既可以在列定义时声明,也可以在列定义后声明。表级约束只能在列定义后声明。实际项目列级约束使用较多。 l 外键约束的要求解析 外键约束,保持数据一致性、完整性,实现一对一或一对多关系。外键约束的要求: 1、 父表(子表所参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,而且禁止使用临时表; 2、 数据表的存储引擎只能为InnoDB; 3、 外键列(曾经加入FOREIGN关键词的那一表)和参照列(外键列所参照的那一列)必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度则可以不同; 4、 外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引。 l 编程数据表的默认存储引擎: 对于MySQL数据库,如果你要使用事务以及行级锁就必须使用INNODB引擎。如果你要使用全文索引,那必须使用MYISAM。 INNODB的实用性,安全性,稳定性更高但是效率比MYISAM稍差,但是有的功能是MYISAM没有的。修改MySQL的引擎为INNODB,可以使用外键,事务等功能,性能高。 修改my.ini,在[mysqld]下加上:default-storage-engine=INNODB 代码 mysql>CREATE TABLE provinces ( ->id smallint unsigned PRIMARY KEY AUTO_INCREMENT, -> pname varchar(20) NOT NULL) 如右图所示,修改后引擎变为INNODB。 2014.12.29 l 实例: 创建一个user子表,其pid外键列参照刚才的provinces表(此称为父表)中的id列: mysql> create table user( -> id smallint unsigned primary key auto_increment, -> username varchar(10) not null, -> pid bigint, à数据类型不同,不能创建:ERROR 1215 (HY000): Cannot add foreign key constraint -> pid smallint, à没有符号位,不能创建:ERROR 1215 (HY000): Cannot add foreign key constraint -> pid smallint unsigned, à与参与列中数据类型相同、一样有符号位才能创建 -> foreign key(pid) references provinces(id) -> ); 由于已经修改过引擎,并且参考列在创建主键时自动生成索引,外键列的pid没有创建过索引,也会自动生成索引,如下图,出现两个索引,分别是id和pid。 查找索引命令:mysql> show indexes from user\G; à参数\G以树状形式显示(大写) 2015.1.1 l 外键约束的参照操作 1、 CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行。 创建一个user1表其pid外键列参照刚才的provinces(此处更该为pro)表的id列,并且使用cascade命令操作: mysql> create table user1( -> id smallint unsigned auto_increment primary key, -> username varchar(20) not null, -> pid smallint unsigned, -> foreign key(pid) references pro(id) on delete cascade); 其次,先往pro表添加记录,再往user1表中添加记录: mysql> insert pro(pname) values('A'); mysql> insert pro(pname) values('B'); mysql> insert pro(pname) values('C'); mysql> insert user1(username,pid) values('Tom',3); mysql> insert user1(username,pid) values('John',7); à输入pid为7时,父表不存在,报错,但id号还是自增,如右图id为2的记录为空: mysql> insert user1(username,pid) values('John',1); mysql> insert user1(username,pid) values('Rose',3); 然后对表进行删除操作,须添加条件,删除命令执行后,子表和父表的记录均同时被删除,其最后结果如下图所示: mysql> delete from pro where id=3; 2、 SET NULL:从父表删除或更新行,并设置子表中的外键列为null。如果使用该选项,必须保证子表列没有指定not null。 3、 RESTRICT:拒绝对父表的删除或更新作。 4、 NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同。 Ø 修改数据表: l 添加单/多列: 如上面user1表,单列添加age和 password,多列添加truename和emaill。其命令如下: mysql> alter table user1 add age tinyint unsigned not null default 10; à添加默认约束default mysql>alter table user1 add password varchar(32) not null after username; à after在**后面插入数据 mysql> alter table user1 add (truename varchar(12) not null,emaill varchar(64) default null); à多列添加只能从数据表的后面堆,不能使用after、first命令。 l 删除单/多列: 将上表的进行单列删除truename,和多列删除password,emaill,命令如下: mysql> alter table user1 drop truename; mysql> alter table user1 drop password, drop emaill; à执行多条命令可以使用逗号隔开 mysql> alter table user1 drop age,add sex enum('boy','gril'); à删除的同时也可以添加,执行不同命令 l 添加约束: 先添加一个简单的新表,如右图: mysql> create table user2( -> username varchar(10) not null, -> pid smallint unsigned); -> alter table user2 add id smallint unsigned not null; 1、添加主键约束: mysql> alter table user2 add constraint PK_user2_id primary key(id); à constraint指定一个名字(接后面)。 2、添加唯一约束: mysql> alter table user2 add unique(username); 3、添加外键约束: mysql> alter table user2 add foreign key(pid) references pro(id); 4、添加默认约束: mysql> alter table user2 add age tinyint unsigned not null; mysql> alter table user2 alter age set default 15; mysql> alter table user2 add emill varchar(64) default 'abc@'; l 删除约束: 1、删除主键约束: mysql> alter table user2 drop primary key; à主键只的一个,无须添加名字 2、删除唯一约束: mysql> show indexes from user2\G; à先查看表中唯一约束,有两个:1.row,2.row mysql> alter table user2 drop index username; à唯一约束有多个,须添加名字。删除后2.row没有了。 3、删除外键约束: mysql> show create table user2; à查看系统默认给外键起的别名CONSTRAINT `user2_ibfk_1` mysql> alter table user2 drop foreign key user2_ibfk_1; 4、删除默认约束: mysql> alter table user2 alter emill drop default; 最后结果如下: l 修改列定义和更名数据表: 1、修改列定义: mysql> alter table user2 modify id samllint unsigned not null first; à将id的位置更换到顶端 mysql> alter table user2 modify id tinyint unsigned not null; à将id的数据类型更换为tinyint 2、修改列名称: mysql> alter table user2 change pid p_id tinyint unsigned not null; à将pid名称该为p_id并将其数据类型更为tinyint。 3、数据表更名:建议不随意使用,特别是引用了表名的情况下。 方法一:mysql> alter table user2 rename user3; 方法二:mysql> rename table user3 to user2; 最后结果: Ø 数据表的记录操作 l 插入记录: 新建一个新表: mysql> create table user3( -> id smallint unsigned primary key auto_increment, -> username varchar(20) not null, -> password varchar(60) not null, -> age tinyint unsigned not null default 0, -> sex boolean); 1、插入数据INSERT values: mysql> insert user3 values(null,'Tom','123',25,1); à使用null,可以让id实现自增 mysql> insert user3 values(null,'John','345',24,0); mysql> insert user3 values(default,'Hany','466',26,0); à使用default,也可以让id实现自增 mysql> insert user3 values(default,'Jack','466',3*7+3,1); à可以使用表达式3*7+3 mysql> insert user3 values(default,'Shen','768',default,1); à可以对age使用默认值 mysql> insert user3 values(default,'Wang','566',20,0),(default,'Baly','458',12*2,1); à一次输入多行 mysql> insert user3 values(null,'Biao',md5('123'),default,1); àmd5即密码123以哈希值的形式出现 2、插入记录INSERT SET: 与第一种方法的区别在于,此方法可以使用子查询,但只能一次性插入一条记录。 如上例继续添加一条记录: mysql> insert user3 set username='Ben',password='879'; à默认值可以不写,如下面的id为9的记录 最后结果: 3、插入记录SELECT: 此方法可以将查询结果插入到指定数据表。 先建立一个空表: mysql> create table user4( -> id tinyint unsigned primary key auto_increment, -> username varchar(20)); 将上面的user3表中的部分数据插入到user4表中: mysql> insert user4(username) select username from user3 where age>22; à将user4表中年龄大于22岁的username添加到user3表中的username,如上图所示: l 单表记录更新UPDATE: mysql> update user3 set age=age+2; à将age都加2 mysql> update user3 set age=age+id,sex=0; à将age的值加上id的值,并且sex全部更为0 mysql> update user3 set age=age+2 where id%2=0; à将id号为偶数的age都加上2 结果如下: l 单表删除DELETE: mysql> delete from user3 where id=6; à删除id号为6的记录 mysql> insert user3 values(null,'Test','123',33,1); à重新插入的记录,不会顶替id为6的记录。 Ø 查询表达式: l select直接调用函数: 如右所示: mysql> select version(); mysql> select now(); l 查询表达式select_expr: 每一个表达式表示想要的一列,必须有至少一个。多个列之间以英文逗号分隔。星号 * 表示所有列。tb1_name.*可以表示命名表的所有列。查询表达式可以使用[AS]alias_name为其赋予别名。别名可用于GROUP BY,ORDRE BY或HAVING子句。 mysql> select id,username,age from user3; à只查询user3表中id,username,age三个记录 mysql> select username,id from user3; à将查询表的顺序可以任意调换 mysql> select user3.id,user3.username from user3; à tb1_name.*可以表示命名表的列 mysql> select id as userId,username as Uname from user3; à使用别名的形式查询,建议加上as mysql> select id username from user3; à不加as,此处会将id的别名该为username,而不是查询出两列记录 l 条件查询WHERE: 对记录进行过滤,如果没有指定WHERE语句,则显示所有记录。在WHERE表达式中,可以使用MySQL支持的函数或运算符。(后面详解) l 查询结果分组GROUP BY: mysql> select age from user3 group by age; à指定表名称age里面的值分组,有相同的则被合并 mysql> select password from user3 group by 1;à指定表位置password以1开头的(不建议使用) l 分组条件HAVING: mysql> select username,password from user3 group by password having password>400; à查找username,password两条记录中,以password的值分组,并只列出 password大于400的值。其结果如右所示: mysql> select sex from user3 group by 1 having count(id) >=3; à可以使用count函数或表达式使用 l order by对结果排序: mysql> select * from user3 order by id desc; àdesc以id号倒序形式排列 mysql> select * from user3 order by age,id desc; à先以age排序,遇到age相同时再以id倒序 l 限制查询结果返回的数量LIMIT: mysql> select * from user3 limit 5; à对查询的结果只取前5个 mysql> select * from user3 limit 1,4; à对查询的结果从第2开始取4条记录。(默认从0开始) mysql> select * from user3 order by id desc limit 3,3; à以id进行倒序,再将结果从第4列开始取3条记录 Ø 子查询 l 导入数据 mysql> show variables like "%char%"; à查看当前编码 mysql>SET NAMES latin1 à统一指定编码,设置为 latin1 如下图所示: 然后导入数据,建立一个tdb_goods表。【数据链接点此】 2015.1.2 l 子查询基本概念: 子查询SubQuery是指出现在其它SQL语句内的SELECT子句。 例如:SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2) à其中SELECT * FROM t1称为外层查询/声明,col2 FROM t2则为子查询。 子查询指嵌套在查询内部,且必须始终出现在圆括号内。而事实上它有可能在子查询内部再嵌套子查询。 子查询可以包含多个关键字或条件,如DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等。 子查询的外层查询可以是SELECT、INSERT、UPDATE、SET或DO。 l 由比较运算符引发的子查询 使用比较运算符的子查询:=、>、<、>=、<=、<>、!=、<=> 语法结构:operand comparison_operator subquery 例子:不使用子查询方式: mysql> select round(avg(goods_price),2) as avg_price from tdb_goods; à求所有电脑产品的平均价格四舍五入,并且保留两位小数:AVG,MAX,MIN、COUNT、SUM为聚合函数 mysql> select goods_id,goods_name,goods_price from tdb_goods where goods_price>5397.77 order by goods_price desc; à查询所有价格大于平均价格的商品,并且按价格降序排序 对上面例子使用子查询来实现以上功能: mysql> select goods_id,goods_name,goods_price from tdb_goods where goods_price>( select round(avg(goods_price),2) from tdb_goods) order by goods_price desc; 对于返回结果有多个时,须使用关键字:ANY,SOME和ALL。ANY 和SOME符合返回结果集其中的一个即可,等价于 IN,而ALL是要符合全部。 例子:查询价格大于或等于"超级本"价格的商品,并且按价格降序排列: mysql> SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本'; à“超记本”的商品价格 mysql> SELECT goods_id,goods_name,goods_price FROM tdb_goods -> WHERE goods_price >= (SELECT goods_price FROM tdb_goods WHERE goods_ cate = '超级本') à 此处直接写 >= 时报错: Subquery returns more than 1 row,由于超级本的价格返回多个结果,取大于等于超级本的价格系统不知道是4999、4299还是7999,所以报错 ->WHERE goods_price = ANY(SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本') à = ANY 或 = SOME 等价于 IN,此得=ANY即返回
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服