linux mysql数据库安装 看看linux是如何来安装mysql的 1. 进入命令行模式: yum list | grep mysql 可以找到mysql的一些安装包, 通过使用 yum install -y mysql-server mysql mysql-devel 服务器 客户端 扩展 回车,系统自动安装 service mysqld start 如果系统是第一次安装,那么会初始化一些数据 第二次启动的话,就不会初始化这此数据了. service mysqld restart 初始化数据库的密码: mysqladmin -u root password 'song' 初始用户名:root 密码:song mysql -u root -p 请输入密码:song 回车 当出现 mysql> 这样的字符的时候,证明已经登录成功了 像这样的服务,我们应该让开机的时候自动开启 chkconfig mysqld on (设置开机自动启动) 数据库的配置文件保存在 /etc/my.cnf 这个文件 cat /etc/mycnf 可以打开配置文件,使用vim 命令编辑 那么我们的数据库文件时保存在什么位置: /var/lib/mysql/ show databases 显示所有数据库 默认日志:/var/log/mysqld.log netstat -tulp 监听端口 好了,我们安装好mysql以后,可以使用 mysql -u root -p song 来登录mysql服务器 mysql -h 指定远程服务器IP地址 select version(); 显示版本号 sql语句以;结尾 current_date 显示当前时间 use databaseName 切换数据库 没有直接修改数据库名称的命令。 【sql结构化查询语言】 create database data_test 创建数据库 drop database data_test 删除数据库 create table ic_count( id int, uname varchar(50), age int(3), address varchar(150) ); 创建表 describe ic_count 显示表的数据结构 也可以使用 desc ic_count 显示结果一样. drop table ic_count ALTER 可以使用这个命令修改表的结构 ALTER TABLE ic_count RENAME count 将 ic_count 表更名为 count #向表中添加一列 ALTER TABLE ic_count ADD tlink varchar(200) //添加列 tlink #删除一列 DROP COLUMN ALTER TABLE ic_count DROP COLUMN tlink #修改列的数据类型 MODIFY ALTER TABLE ic_count MODIFY uname varchar(150) #重命名列名(把uname 重命名为 username) ALTER TABLE ic_count CHANGE COLUMN uname username varchar(100) insert into ic_count(column1,column2)VALUES("james","111"); 插入数据 select update table set column1="" where id=111 delete from table where id=112 distinct 去掉结果中的重复项。 order by column desc 倒序 或 asc 正序 【用户添加删除】 默认只有一个root用户, 这张表保存在 mysql 数据库 user表中. 创建一个新用户 IDENTIFIED BY CREATE USER 'xiaosong' INDENTIFIED BY 'song123456' 新创建的用户无法登录,没有权限。 DROP USER xiaosong 删除用户 RENAME USER xiaosong TO xiaosong123 把xiaosong 这个用户更名为 xiaosong123 修改密码: SET PASSWORD =PASSWORD("newpass"); 修改当前登录的用户名。 那么如何修改其他用户的密码? SET PASSWORD FOR root =PASSWORD("newpass"); 修改root用户的密码为newpass 【mysql权限系统】 mysql权限控制包含两个阶段:》 1.检查用户是否能够链接 mysql链接认证 GRANT ALL PRIVILEGES ON *.* to 'xiaosong@%' IDENTIFIED BY 'xiaosong123' 'xiaosong@%' 1.所有主机'%' 2.精确的主机名或IP地址:192.168.1.1 2.检查用户是否具有所执行动作的权限。 mysql授予权限可分为: 1.全局 2.数据库 3.表层 4.列层 GRANT 授予权限 REVOKE撤销权限 GRANT ALL PRIVILEGES ON 层级 to 用户@主机 IDENTIFIED BY 密码 GRANT ALL PRIVILEGES ON *.* to 'xiaosong'@'%' IDENTIFIED BY 'xiaosong123' GRANT ALL PRIVILEGES ON mytyrenet.* to 'xiaosong'@'%' IDENTIFIED BY 'xiaosong123' REVOKE ALL PRIVILEGES FROM user="xiaosong" 删除用户权限。 privileges grant all privileges on *.* to 'tt'@'%' identified by '111'; 【mysql简单的备份】 mysqldump -uroot -p 数据库名称 > 备份文件.sql mysql -uroot -p 数据库名称 < 备份文件.sql 【数据库编码】 1.影响数据库占用空间的大小。 2.数据库与客户端的通信。 show character set; 显示所有编码格式 创建数据库的时候,可以指定编码 create database lcdb default character_set utf-8 default collate utf8_general_ci; show variables like 'character_set' 查看数据库编码 mysql学习 学习目标 1.掌握mysql基本知识 2.学习数据为管理和操作 3.掌握数据库设计方法 4.熟练运用sql编程语言 一、基本概念 MYSQL 数据库是关系型数据库库 关系型:使用一个有关系,把实体信息和实体之间的联系。 关系:就是一张二维表,有行有列的表格。 关系型数据库:就是由二维表及其之间的联系组成的数据组织。 【mysql结构化查询语言】 专门用于修理工关系型数据库编程语言。 php编程语言(变量、流程控制、函数) 当然mysql也是有这些东西的。 数据库服务器的结构 DBS=DBMS+DB 命令行客户端 cmd mysql .frm 表结构 .myd 数据 .myi 索引 同一个表中的数据结构完全一致。 【操作服务器】 netstat -an 监听哪些端口 3306 是mysql默认端口号 mysql -uroot -psong 连接到数据库 【重头戏,sql语言】 存储数据: 首先建立数据库、之后建立表。 操作数据 数据有哪些操作? CURD CREATE UPDATE READ DELETE(DROP) 库操作 : database show databases 显示数据库 show databases like '%t%' 模糊查询 show databases like 't%' 模糊查询 show databases like '%t' 模糊查询 通配符:% _ % 可以匹配所有字符,也可以匹配空字符串。 _可以匹配任意一个字符,但不包括空字符串。 数据库命名规则:字母、数字、下划线。 不使用系统保留字做数据库、表、或字段 如果数据库名称较长,使用下划线链接,不使用驼峰法。 查看创建数据库的资料 show create database myluntai; zsservice | CREATE DATABASE `zsservice` /*!40100 DEFAULT CHARACTER SET utf8 */ if not exists 创建数据库 创建了newdata数据库 create database newdata; 如果不指定数据库字符集,那么就使用安装时,默认的数据库字符集。 有四个级别的字符集: 服务器集 数据库集 数据表集 字段集 所有的配置文件保存在my.ini 这个文件中。 create database if not exists newdata; 容错方式,当newdata数据库不存在的时候,创建。 create database newdata default charset=gbk; 指定字符集创建数据库 修改数据库: alert database 数据库名 选项 找到数据库的 db.opt 保存着编码格式。 alter database newdata charset=utf8 把newdata这个数据库编码修改为utf8 删除数据库: drop database 库名 drop database if exists newdata 【创建表】 show create table student\G 显示出如何创建的此表的sql语句。 desc student 显示表的数据结构 show columns from student 也是显示表结构 修改表 alter table 表名 modify #复制表结构,表中没有任何数据 create table student_copy like student #复制表,并把数据也复制过去。 create table student_copy select * from student 重命名表,使用rename 命令 rename table student_info to student2 mysql学习第二天 数字可以不加引号,但加也没有问题 create table student( student_id int, student_name varchar(20), class_name varchar(20), area varchar(10) ); insert into student( student_id,student_name,class_name,area )values( 1,"james","101班","北京" ); insert into student( student_id, student_name, class_name, area )values( 1, "james", "101班", "北京" ); 使用select从其他表调整数据: 如果表的结构或表对应的字段类型完全一致,这时候就可以写 insert into 表名 select * from 其他表 where ...order by .. limit.. 如果不一样的时候,可以使用下面方式来做:类型必须对应起来。 insert into student2(student_id,studnet_name) select id,name from student_2; 替换数据 replace into 和 insert into 方法一样,只是把insert改成了replace 和 insert into 的区别: insert into 是直接插入,而replace into 是先判断表中的主键或唯一键字段是否和插入的数据相对应的字段一样的数据, 那么就变成修改(先删除一行再插入一行) 如果不一样,则直接插入。 如果插入的数据表,没有任何主键和唯一键,那么 replace into 则不判断,直接插入。 只要是主键或唯一键有重复的就删除,然后重新把这条新数据插入进去。 replace into 有时候会影响多条数据,如果有重复的数据是先删除再插入。 replace into 并不等同于 update。 【select 查询数据】 select * from student; delete from student where id>5 order by id desc limit 1; 快速删除所有数据:truncate 格式:truncate 表名 <==> delete from 表名 truncate student; 有什么区别: 1. truncate 先把表删除,然后再重建,优点速度快。 2. 不会返回受影响的行数。 3. Auto_increment 自动增量会恢复初值。 【乱码问题】 我们查看一下关于编码的变量: show variables like 'character_set%'; character_set_client 客户端使用的编码 character_set_connection 数据库使用的编码 character_set_results 返回结果使用的编码 这三个变量的设置影响到数据是否是乱码 set character_set_results=gbk; 设置客户端编码为gbk 设置character_set_results为客户端一致的编码。 我们插入数据会不会有问题呢? 会有问题 原因是什么? 就是客户端编码问题, 明明是gbk的编码,确告诉数据库是utf8,转码出现问题 set character_set_client=gbk mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 使用 set names utf8; 重置编码 mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) 关于乱码总结: 1.首先我们要确认我们的客户端是什么编码,命令行客户端看属性,php文件看编码 2.根据客户端编码,使用set names gbk 或 utf8 设置编码。 【mysql学习第三天】 default value 默认值 auto_increment 自动增量 primary key 主键 Primary key = not null + unique 主键 Auto_increment:自动增量 只能用于任何一种整数型作为主键时的属性 unsigned auto_increment primary key unsigned 代表正小数。 浮点数:float 小数后不精确。 定点:严格浮点数 decimal(M,D) decimal(15,6); 前边有效位数,后边小数位数. 小数点后面保存6位小数,如果不足,就以0补齐,保证6位小数 float 会出现近似值。 decimal 定点,不管数是多少,是多少存多小不会进位,不会出现近似值。 字符串类型 char(L) 定长字符 L 代表字符长度,小于等于255 create table cc( c1 char(1) ); insert into cc values('a'); insert into cc values('ab'); 如果超出长度,则系统会报错(即便没有报错,也是有一个警告,超长的部分系统会自动截取)。不能插入超出长度的字符串。 insert into cc values('陈'); 也可以插入。 select * from cc; mysql 定义的长度是字符数,不是字节数。1个中文=1个字母的长度. varchar(L) L<65535 具体大小和编码有关。 L是几,就能存几个汉字或字母。 建议:长度大于255时,就用text类型。 1个utf8编码汉字占3个字节,因此长度大约为65535的3分之1. 1个gkb编码汉字占2个字节,因此长度约为65535的2分之1。 同样可知: char utf8编码长度必须是小于255/3-1 GBK编码长度必须是小于255/2-1 Text 大文本类型 tinytext <255 字节 text <65535 字节 mediumtext 最多可存储2^24-1字节 Longtext 最多可存储2^32-1字节 Blob 二进制大对象类型 和text类型类似。 区别就是,它是用于保存二进制内容的。 保存图片、文件、二进制内容 Enum 枚举类型 特殊的字符串类型,用于保存单选类型。 create table enum_attr( gender enum("boy","girl") ); insert into enum_attr(gender) values("boy"); insert into enum_attr(gender) values("boy222"); 插入枚举之外的数据会报错。 枚举类型字段有 null not null 这两个字段。 枚举可以使用索引来代替枚举, 例如:1 ->boy 2 ->girl 不建议:不要用数值,比如: gender enum('0','1','2'); select * from enum_attr where gender=1; 查出结果 是枚举的值。 set 集合 set最多成员是64个。 find_in_set(字段类型,要查询的值); create table set_attr( xiai set("boy","girl") ); \ Date 类型: YYYY-MM-DD 取值范围:1000-01-01 到 9999-12-31 如果想设置为空,可以使用 0000-00-00 比较好 Time 时间类型 HH:MM:SS Year 年类型 取值范围: 1901-2155 Timestamp 时间戳类型 和php的时间戳不一样,php是一个整数类型的,而mysql是一个时间类型的字符串。 【mysql学习第四天 设计范式 NF NormalFormat】 如果满足了设计范式的要求,数据库就会简洁,结构清晰,反之,会出现数据冗余、还会有插入、删除、更新数据有异常。 设计范式我们通常使用三种: 1NF 2NF 3NF 也叫第一范式,第二范式,第三范式 1NF 是最宽松的。 第三范式是最严格的。如果设计数据库已经满足了第三范式,那么肯定已经满足了前两个范式。 .第一范式 1NF ,字段的原子性 保证每一列的数据不可再分。保证字段的原子性。 .第二范式 2NF 消除部分依赖 .第三范式 3NF 消除传递依赖 外键 关联到 其他表的主键 实体间的联系: mysql 复习 查 select where 表达式 (哪一行符合要求,就显示出来) =,!=, <>,>,<, in,not in ,between and, or,and,not group by 聚合函数 max,min,avg,sum,count having 对查询出来的结果,再次过滤。使用方法和where一致。 查询出来的结果,我们可以看成一张临时表,他是存在于缓冲区。 order by 对升序和降序有作用 , asc desc 使用案例:order by field1 asc,field2 desc limit 限制条目 limit offset ,N offset是偏移量。 子查询 where 型子查询 select * from goods where goods_id=(select max(goods_id) from goods); from 型子查询 把内层的查询结果 供外层再次查询 exists 型子查询 select * from category where exists(select * from goods where cat_id =category.cat_id); union 合并查询结果 select * from 连接查询 左连接 右连接 内连接 select A.* A left join B on 条件 where 1; create table boy( name char(3), flower char(5) ) charset utf8; create table girl( name char(3), flower char(5) ) charset utf8; 创建表,并指定字符集。 insert into boy(name,flower)values('小','玫瑰'),('',''); 这样的语句可以插入多条内容。 select boy.*,girl.* from boy left girl on boy.flower=girl.flower; 左连接 以左边为准,去右表匹配数据,如果右边找不到,则以null补齐。 但不知道具体多少行,但至少大于左边的总数。 右连接 不管以左连接,还是以右连接,都是以左表为准。 如何记忆: 1.左右连接可以相互转换 2.推荐使用左连接使用。 什么是内连接:查询左右表都有的数据。 select boy.*,girl.* from boy as b,girl as g where b.flower =g.flower; select boy.*,girl.* from boy inner join girl on boy.flower=girl.flower; 在ecshop这个数据库中,查找到goodid 左连接和右连接都是可以连接多个表的。 例如 select boy.*,girl.* from boy left join girl on boy.flower=girl.flower #在这里可以直接把上面的做为一张表,直接来使用。 left join classname #左连接到classname这张表 on classname.name=; charset utf8 variables like 'character_set%'; #显示此数据库的一些编码信息。 使用别名的时候,不要用 having 否则会报错 使用左右查询的时候,记得用起别名的方式来做,以免和其他的表起冲突。 mysql视图 view 查询goodid 最贵 查询结果可以当成一张表来看,如果某个查询结果出现的非常频繁。 create table t2 like goods create table t2 select ...... 这样就是建立了一张表。 把查询结果存起来,但是你建立了一张表,则不是实时更新啊。所以建立视图,实时更新。 视图是由查询结果形成的一张虚拟表。 视图的创建语法 : create view viewt as select 语句 select 查询结果,把这个结果保存到视图中去。 创建完毕后,可以使用 show tables ; 来查看表,看看是否有视图 select * from viewt; 即可显示出视图的内容。 视图删除: drop view viewt; 删除 viewt 这个视图。 为什么会用视图? 可以简化查询 可以进行权限控制,开发相应的视图权限。 大数据分表时,可以用到。 可以把一张表的数据拆分成4张表来存放。 分散的方法有很多种:那我们来看一种方式 : ID取模来计算。 $tablenum=ID%4+1=[1,2,3,4] 查询的时候, $sql="select * from news".$tablenum." where id=ID"; 凡是有返回结果的sql语句,均可以建立视图,在大数据量的时候,可以发挥一定的作用。 视图修改: alter view as select ..... 相当于删除了旧的视图然后重建立了一个视图。 视图与表的关系是什么呢? 归根到底,视图的数据来源于表,那么表的数据修改后,视图的数据肯定也会发生变化。 那么我在表中新增一个呢?视图会变吗? 视图改变了,表的数据会变吗? 1.视图并不是总能增删改的 2.视图的修改也能影响表。 什么时间的视图可以修改呢? 当视图中的数据与表中的数据一一对应的时候,可以修改。 group by 是放在 order by 语句的前面。 create view algorithm=temptable viewName as select 创建视图默认是merg的,当我们在这个种模式下的视图下查询结果的时候,会把两个where语句叠加起来, 而如果我们指定了algorithm 这个属性为 temptable 的时候,会临时创建一张表,供我们使用。 触发器 trigger 什么是触发器? 监视某种情况并触发某种操作。 触发器可以监视哪三种操作呢? 增、删、改 触发器操作:增、删、改 监视哪张表,操作哪张表? 监视order表的insert ,来操作goods的update方法 table 触发地点 after/before 触发时间 如何创建触发器? create table g( id int, name varchar(30), num int )charset utf8; create table o( oid int, gid int, much int )charset utf8; insert into g values( 1,'猪',22),(2,'猫',33),(3,'兔',16),(4,'羊',13); create trigger triggerName after/before insert/update/delete on 表名 for each row #固定写死的 begin sql语句 end 重新命名以 $ 为结束符 delimiter $ create trigger tg1 after insert on on for each row #固定写死的 begin update g set num=num-3 where id=2; end$ 等这个窗口命令结束后,再执行一下 delimiter ; 修改delimiter $ #如何修改购买二头猪,羊 在触发器中引用行的值 对于insert而言,新插入的行叫new 那么它的字段叫什么呢? new.field 这样就可以了。 new.字段名 可以访问到值 delimiter $ #增加 new create trigger tg1 #添加订单、库存减少 after insert on for each row #固定写死的 begin update g set num=num-new.much where id=new.gid; end$ #删除 old create trigger tg2 after delete on o for each row begin update g set num=num+old.much where id=old.gid; end$ #更新 update 对于update来说,没有修改之前我们可以用old来表示,修改之后,可以用new来表示 create trigger tg3 after update on o for each row begin update g set num=num+old.much where id =old.gid; update g set num=num-new.much where id=new.gid; end$ 触发器中的after 和before 的区别 after是先完成增删改,然后再触发 before 是先完成触发,再增删改 如果是恶意触发,我们有机会可以修改。 带有判断的触发器 create trigger tg5 before insert on o for each row begin if new.much>5 then set new.much=5; end if update g set num=num-new.much where id=new.gid; end$ 如何查看触发器 show trigger; mysql事务 什么是事务? 一组操作,要么都执行,要么都失败 事务的特性:必须是全部都要成功,只有一个执行失败,事务回滚 事务发生前和发生后,数据的总额是匹配的。 事务产生的结果是不能撤销的-- 事务的四大特性 隔离性 持久性 一致性 原子性 如何开启事务? 要开启事务,表的引擎必须是innodb start transaction #开启了事务 update account set money=money+500 where id =2; update account set money=money-500 where id =1; commit / rollback; 如果两条语句都执行成功了,commit 提交这两个操作 rollback 取消上面的两个操作。 create table account( id int(4), name char(20), money float(7,2) ) engine=InnoDB charset=utf8; 如果创建的过程中出现: ERROR 1289 (HY000): The 'InnoDB' feature is disabled; you need MySQL built with 'InnoDB' to have it working 解决方法: 找到mysql的安装目录,打开 my.ini 找到 skip-innodb 在前面加上 # 注释掉。重新启动mysql数据库,即可创建成功 net stop MySQL 关闭mysql数据库 net start MySQL 重新启动mysql数据库 存储引擎 数据库以哪种方式来存储?engine myisam 创建表的时候,指定表的引擎? innodb 安全高、支持事务、行锁、全文索引 myisam 安全低速度快、不支持事务、表锁、全文索引 存储过程 概念类似于函数,就是把一段代码封装起来 if/else case,while 可以进行sql编程 show procedure status \G delimiter $ create procedure p1() begin select * from g; end$ 调用方法: call p1(); create procedure p2(n int) begin select * from g where num<n; end$ create procedure p3(n int ,t char) begin if t='h' then select * from g where num>n; else select * from g where num<n; end if; end$ 和自定义函数差不多 create function f1() begin declare i int; set i=0; return i; end$ 声明i 为int变量 declare i int; 备份与恢复 mysqldump 备份工具 mysqldump -uroot -psong mydatabase tablename d:\\tablename.sql mysqldump -uroot -psong mydatabase D:\\mydatabase.sql 以库为单位 mysqldump -uroot -psong -B mydatabase1 mydatabase2 D:\\mydatabase.sql 导出所有的库 mysqldump -uroot -psong -A D:\\all.sql 使用 source 读取备份的文件。还原数据库 索引的使用:加快查询速度 坏处:降低了增删除改的速度。 不要过度索引 索引分类: 普通索引 :index 加快查询速度 唯一索引 :unique 行上的值不能重复 主键索引 :primary key 不能重复 一张表只能有一个主键索引,可以有一个或多个唯一索引 全文索引 : fulltext 查看某张表的索引: show index from 表名 show index from 表名 \G 建立索引: alter table 表名 add [index|unique|primary key|fulltext] 索引名 (列名); alter table 表名 drop index 索引名 删除一个索引 alter table goods add index username (username) # 在username这个字段上,添加username索引,以加快查询速度。 alter table goods drop index username 删除username这个索引。 alter table goods add primary key (id) alter table goods drop primary key 全文索引: 不支持中文 例如 500W数据,如何快速导入 1.先把索引全部删除 2.集中再建立索引。 php程序员如何来完成商城预定商品生成订单的操作呢? 什么是事务?