清---cls DOS命令清屏
mysqld --install //安装mysql
mysqld --initialize-insercure --user=mysql //创建root 用户 密码为空 并且在创建data文件夹
--mysql 简单登入 --回车
mysql -uroot -proot
--mysql 带端口号登入 默认端口号3306可以省略
mysql -uroot -proot -P3306
--mysql 带端口号和主机号登入 本地主机可以省略,如果是远程服务器主机名不能省略
mysql -uroot -proot -P3306 -hlocalhost
--mysql 退出
\quit
\q
--命令窗口中文乱码
set names gbk;
---SQL语句:结构化查询语句
--(1)DDL 创建数据命令,创建数据库,创建表
-- 创建(CREATE || create) 修改(ALTER || alter) 删除(DROP || drop)
--(2)DML 操作数据命令,对表中数据的增删改
-- 增(INSERT || insert) 删(DELETE || delete) 改(UPDATE || update)
--(3)DQL 查询数据操作,对表中数据查找
-- 查(SELECT || select)
--(4)DCL 控制数据命令,给用户赋予权限(GRANT || grant) 及撤消权限(REVOKE || revoke)
-- delimiter 可以修改分隔符;(默认分隔符 ; )
-- 修改数据库编码
ALTER DATABASE php1702 [DEFAULT] CHARSET=gbk;
-- 打开数据库 USE
-- 查看当前打开的数据库 SELECT DATABASE();
-- mysql数据类型
-- 1.整型
-- (1)tinyint([M]) unsigned | zerofill
-- 大小 1字节 (2^8 8bit)
-- 范围 有符号位 -128~127 无符号位(unsigned正数):0~256
-- (2)smallint([M]) unsigned | zerofill
-- 大小 2字节 (2^16)
-- 范围 有符号位 -32768~32767 无符号位(unsigned正数):0~65535
-- (3)mediumint([M]) unsigned | zerofill
-- 大小 3字节 (2^24)
-- 范围 有符号位 -83886508~83886507 无符号位(unsigned正数):0~16777215
-- (4)int([M]) unsigned | zerofill
-- 大小 4字节 (2^32)
-- 范围 有符号位 -2147483648~2147483647 无符号位(unsigned正数):0~4294967295
-- (5)bigint([M]) unsigned | zerofill
-- 大小 8字节 (2^64)
-- 字段属性
-- a. unsigned :无符号位,正数
-- b. zerofill :填补0,当显示的长度小于指定长度那用0填补,如果是zerofill一定自动填加unsigned
-- 2.浮点型
-- (1)float([M,D]) unsigned | zerofill
--单精度浮点,大小4字节(2^32 1位符号位,8数,23指数) 范围:-3.40e38~3.40e38 精度 7位
-- (2)double([M,D]) unsigned | zerofill
--双精度浮点,大小8字节(2^64 1位符号位,11数,23指数) 范围:-1.79e38~1.79e38 精度 14位
-- (3)decimal([M,D]) unsigned | zerofill
--定长浮点,默认M 10 D 0 最大M 65 D 最大30
-- 区别:
-- a. M指浮点总位数,D小数位 如:float(7,2) unsigned 最大值99999.99 (浮点总位数7位)
-- b. float double 存近似值 四舍五入
-- c. decimal 精确值
-- 3.字符类型
-- (1)char
--定长字符
-- 0-255字节 字符不够用空格填补够255字节长度
-- (2)varchar
--变长字符 有多少字符存多少字符。
-- (3)tinytext 0-255字节
-- (4)text 0-65535字节
-- (5)mediumtext 16777125字节
-- (6)longtext 42亿左右
-- 区别
-- a. char 效率高 但占空间; varchar 效率低但省空间;如密码 用char(32); 密码加密码为固定长度
-- b. text 效率最低,一般用在新闻内容字段中
-- c. varchar,char的字段长度受下面影响
-- (a)最大65535字节,(b)字符集utf8 至多占3字节 gbk 至多占2字节
-- 4.布尔类型
-- (1) tinyint(1)
-- (2) boolean
-- 5.枚举类型
-- (1) enum 0-65535字节 如:sex enum('男','女','保密')
-- 5.约束条件
-- (1) NOT NULL || not null不为空,必填
-- (2) DEFAULT || default 默认值
-- (3) [PRIMARY] KEY || primary key 主键 一个表中必须有一个主键,是主键的字段一定是NOT NULL和UNIQUE唯一性
-- (4) UNIQUE [KEY] 唯一性(例如name,email,不重复的值)
-- (5) AUTO_INCREMENT ||auto_increment 自动增长,有自动增长的字段一定是主键
-- (6) 外键约束 ,foreign key (当前表的外键字段名) references 主表名(字段名;)
-- 修改表的编码
-- ALTER TABLE cms_user DEFAULT CHARSET=utf8;
ALTER TABLE cms_user DEFAULT CHARSET=utf8;
-- 修改表的引擎 InnDB MyISAM
-- ALTER TABLE cms_user ENGINE=InnoDB;
ALTER TABLE cms_user ENGINE=InnoDB;
-- 修改表名字
ALTER TABLE cms_amdin rename cms_admin;
-- 二.帮助
-- \h 关键字
-- help 关键字
-- ? 关键字
-- 三.对表中数据操作
-- 1.添加(Insert)
--(1)带字段的添加 insert 表名(字段名,字段名,..) value(值,值,..),(值,值,..)..
INSERT cms_user(name,pwd,age,sex,addr,email) value('adisen','125415',18,'0','beijin','adisen@gmail.com');
--(2)不带字段的添加(从第一个字段到最后一个字段都要赋值)
-- INSERT 表名 value(值,值,值,..)
INSERT cms_user value(15,'linmin','125415',18,'0','beijin','linmin@gmail.com');
--(3)只能填加一条记录
-- INSERT 表名 set 字段名=值,字段名=值,字段名=值,...;
INSERT cms_user set name='john',pwd='1525',email='jhon@sina.com';
-- 2.删除(Delete)
-- (1) delete form 表名 [where 条件]; //如果delete语句没有where条件,将表中数据清空
auto_increment自动增长不重置
-- (2) truncate 表名; //清空整个表中数据,auto-increment自动重置
delete from cms_user where id=5;
-- (1) delete 执行速度 慢 --会记录日志 数据可恢复 支持事务操作
-- (2) truncate 执行速度 快 --不会记录日志 不支持事务操作
-- 3.更新(Update)
-- update 表名 set 字段名=值,字段名=值,... [where 条件];
update cms_user set age=18, addr='sz' where id=5;
update cms_user set age=18, age=age+1;
-- 更新addr字段中编号是1 3 5值为shenzhen
update cms_user set addr='guangzhou' where id=4 or id=6 or id=9;
-- 四.对表中数据查询
-- 1. select * from 表名;
select * from cms_user;
-- 2. select 字段名|expr,字段名|expr... from 表名;
select name,age from cms_user;
-- expr
select 6+7,5*7,9-2; --可以跟表达式
select database();--查询当前打开的数据库
select now();--查询当前系统时间
select user();--查询当前用户
select version();--查询mysql版本
-- 3. 给字段起别名
--
select 字段名 as 别名,字段名... from 表名;
select name as n, age as a from cms_user;
-- 4. 给表起别名
--
select 字段名,字段名.. from 表名 as 别名;
select name, age from cms_user as c;
-- 5. 表名(别名).字段名:字段名来自哪个表
-- select 表名(别名).字段名,字段名... from 表名 as 别名
select c.name,c.age from as cms_user as c;
-- 6. 数据库名.表名:表名来自哪个数据库
-- select 字段名,字段名,... from 数据库名.表名;
select name,age from php1702.cms_user;
-- 7. 完整格式
-- select 字段名,字段名,... from 表名 [where 条件] [group by 字段] [having 条件] [order by 字段] [limit [$offset,]$length];
-- 分组查询 如:
$t=time();
$startime=$t-24*3600;
select count(*) as num,n.title,c.newsid from clicknum as c join news as n on c.newsid=n.id where clicktime>$startime group by newsid order by num desc;
select count(*) as num,n.title,c.newsid from clicknum as c join news as n on c.newsid=n.id where clicktime>$startime group by newsid order by num desc;
select distinct(userid) from review where newsid=$newsid;--把重复的去掉 --去重 distinct(userid)
select count(*) from (select distinct(userid) from review where newsid=$newsid) as n;--子查询
-- 8. [where 条件]:
-- 条件过滤
-- a. 条件比较运算符 > >= < >= = !=
-- b. [not] between...and...(范围)
-- c. [not] in(值,值...)(某几个值)
-- d. 逻辑运算符 and或&& or或|| !非
-- e. [not] like '字符串';模糊查询 关键符号_ %
-- _: 代理任意一个字符
-- % 代表任意字符 或任意多个字符
-- sphinx 分词 索引 查询
select * from cms_user where id<3;
-- b. [not] between...and...(范围)
--查询cms_usr中编号在2-5的记录
select * from cms_user where id between 2 and 5;
select * from cms_user where id>=2 and id<=5;
--查询cms_usr中编号不在2-5的记录
select * from cms_user where id not between 2 and 5;
select * from cms_user where id<2 or id>5;
--查询cms_usr中编号 2 4 5的记录
select * from cms_user where id in(2,3,5);
select * from cms_user where id=2 or id=3 or id=5;
--查询cms_usr中编号不是 2 4 5的记录
select * from cms_user where id not in(2,3,5);
select * from cms_user where id!=2 and id!=3 and id!=5;
--查询cms_user 中name字段是anna 和pwd字段是add4记录
select * from cms_user where name='anna' and pwd='add4';
--查找cms_user中name字段包含字母o的记录
select * from cms_user where name like '%o%';
--查找cms_user中name是5个字符的字段
select * from cms_user where name like '_____';
--9 [group by 字段]:分组
--聚合函数实现
-- count : 每组的个数
-- avg : 每组的平均值
-- max : 每组的最大值
-- min : 每组的最小值
-- sum : 实现每组的和
-- select 字段,字段 from 表名 group by age;
select addr, count(*), avg(age) from cms_user group by addr;
--10 [having 条件]:二次过滤
--[where 条件]对字段的过滤
--[having 条件]对结果的过滤,配合group by使用
select addr,count(*) as c,avg(age) from cms_user group by addr having c>2;
--11 [order by 字段]:对字段排序
-- order by 字段 asc 升序||desc 降序
select * from cms_user order by id desc;
--12 [limit [$offset,]$length]:获得前n条记录
-- $offset:起始编号,编号从0开始
-- $length:记录长度 web页面的分页原理
-- 计算 起始页编号 =(当前页-1)*显示记录长度
$offset=($curpage-1)*$length;
--查询cms_user页中前3条记录
select * from cms_user limit 0,3;
-- 五.多表查询
--修改addr字段内容为1
update cms_user set addr='1';
--修改addr字段类型为整型
alter table cms_user modify addr int not null default 1;
--修改addtime字段默认时间为当前时间
alter table news modify addtime timestamp not null default current_timestamp;
--将cms_user中addr字段编号是2,4,5值改为2;
update cms_user set addr=2 where id in(2,4,5)
--创建城市表
create table cms_city(
id int unsigned primary key auto_increment,
cname varchar(30) not null unique
)engine=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
--对城市表填加数据
insert cms_city(cname) value('北京'),('天津'),('上海'),('深圳');
--1.格式
-- select 字段,字段...from 表1 类型 表2 on 两表的逻辑联系类型 表3 on 两表的逻辑联系
-- 内连接例如:
select u.id,u.name,c.cname from cms_user as u inner join cms_city as c on u.addr=c.id;
-- 外连接例如
select u.id,u.name,c.cname from cms_city as c left join cms_user as u on u.addr=c.id order by id asc;
--2.类型
--(1)内连接:inner join 查询两表中都复合的信息
--(2)外连接: 左外连接 left join 右外连接 right join 没有用null填补
-- 查看创建数据库的命令代码
SHOW CREATE DATABASE php1702;
-- 修改数据库编码
-- ALTER DATABASE php1702 [DEFAULT] CHARSET=gbk;
ALTER DATABASE php1702 CHARSET=gbk;
---创建数据库
--CREATE DATABASE [IF NOT EXISTS] php1702 CHARSET=UTF8;
CREATE DATABASE php1702 CHARSET=utf8;
--查看现在数据库
SHOW DATABASES;
-- 查看创建数据库的命令的
-- SHOW CREATE TABLE [数据库名];
SHOW CREATE DATABASE php1702;
-- 查看创建数据库的命令的
-- SHOW CREATE TABLE [表名];
SHOW CREATE TABLE users;
-- 打开数据库
USE php1702;
-- 查看当前打开的数据库
SELECT DATABASE();
-- 创建表(Table)结构
-- CREATE TABLE [IF NOT EXISTS] 表名(字段名(Field) 数据类型[字段属性|约束条件],...,...)
CREATE TABLE IF NOT EXISTS users(
name varchar(30),
age int
);
-- 查看表
SHOW TABLES;
-- 查看表结构(字段)
-- DESC 表名; DESCRIBE 表名;
DESC users;
DESCRIBE user;
-- 对表中数据的添加和查询
-- insert 表(字段名,字段名,...) value(值,值,...),(值,值,...),......;
INSERT users(name,age) VALUE('tom',18),('alice',20),('jerry',20);
-- 修改表结构
-- 1.添加字段
-- ALTER TABLE 表名 ADD 字段名 数据类型[字段属性|约束条件] [FIRST|AFTER 字段名],[FIRST|AFTER 字段名]...
ALTER TABLE php1702 ADD addr varchar(50) NOT NULL DEFAULT '北京' AFTER name;
-- 2.删除字段
-- ALTER TABLE 表名 DROP 字段名,字段名,...
ALTER TABLE php1702 DROP name;
-- 3.修改字段
-- ALTER TABLE 表名 MODIFY 字段名 数据类型[字段属性|约束条件],...,..
ALTER TABLE php1702 MODIFY addr varchar(50) NOT NULL default '天津' AFTER sex;
-- 3.修改字段名
-- ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[字段属性|约束条件],...,..
ALTER TABLE php1702 CHANGE addr newaddr varchar(50) NOT NULL default '天津' AFTER sex;
ALTER TABLE cms_amdin rename cms_admin;
--创建索引
--网站慢的时候运行 慢查询 查看进程
show processList;
--修改mysql配置 也可以进行慢查询
--创建索引分类
--主键索引 创建 key 或 primary key
--唯一索引
create unique index 索引名 on 表名(字段列表,......)
alter table 表名 add unique 索引名(字段列表)
--普通索引
create index 索引名称 on 表名(字段列表,....)
alter table 表名 add index 索引名称(字段列表)
--全文索引 mysql 全文索引对中文不起作用
-- 例子:查询card为'903237939533756' // 703706806573126
select * from student where card=903237939533756
--为card创建索引
create unique index i_card on student(card);
--例子:查询38班,年龄最大的10人
select * from student where classid=38 order by age desc limit 10;
--创建联合索引
create index i_classid_age on student(classid,age);
--评价一个查询语句的性能好坏使用 explain:
explain select * from student where classid=38 order by age desc limit 10;
--出现 Extra---->Using filesort 必须优化
--例子:查询38班,男女生各有多少人?
select count(sex) from student where classid=38 group by sex;
--explain 出现 Using temporary //临时表; Using filesort//表外排序 必须优化
create index i_classid_sex on student(classid,sex);
--查询语句中如何指定索引的名字 强制索引
select * from table1 force index (field1)
--如:
select count(*) from student force index(i_classid_age) where classid=38 group by sex;
--存储过程
--1、创建
create procedure 名称(in|out|inout 参数 类型,...)
begin
变量
流程控制语句
聚合函数
sal语句
end
in 传入
out 传出
inout 传入传出
--例子:写一个存储过程,来实现统计某个班有多少人。
--代入
create procedure getClassNum(in cid int); --cid 不能叫classid 跟下面冲突
begin
select count(*) as num from student where classid=cid;
end//
-- 取出用
call getclassnum(38)
--代出
create procedure getClassNum1(in cid int, out num int)
begin
select count(*) into num from student where classid=cid;
end//
-- 取出用
call getclassnum1(38,@re)
--代入出
create procedure getClassNum2(inout cidNum int)
begin
select count(*) into cidNum from student where classid=cidNum;
end//
-- 取出用
set @re=38//
call getclassnum2(@re)//
select @re//
--删除存储过程 销毁存储过程
drop procedure getClassNum2//
--查看存储过程
show procedure status;
--高版本用下面命令
select name from MySQL.proc where db='projecttwo' and type='PROCEDURE'// --查看所有存储方法
--查看某个存储过程
show create procedure 过程名称
--在CMD窗口中,改变sql语句的结束符合: 分号换成//
delimiter// --cmd窗口要以管理员身分打开
--变量
declare 变量名称 类型(长度) default 默认值;
--2、调用
call --过程名称(参数,....)
--php中如何运行存储过程 如下:
mysqli_query("call getClassNum(38)");
mysqli_fetch_assoc(); --拿结果
--字符串的拼接
concat(字段,变量,'字符串',...)
replace(字段|字符串|变量,search,replace) --替换
--例如:把产品表中字段content中包含suom替换成datiegeda
update product set content=replace(content,'suom','datiegeda');
--把产品表content字段的值末尾都拼一个字符串PSD1702
update product set content=concat(content,'psd1702')
--流程控制器语句
while 条件 do
循环体;
变换步长;
end while;
if 条件 then
else
end if;
if 条件 then
elseif 条件 then
else
end if;
--例子:把0到两个数相加中的偶数输出.5+9
create procedure testn(in num1 int,in num2 int);
begin
declare num int default 0; #--存放num1+num2的结果
declare i int default 0; #--循环变量
set num=num1+num2; #--加运算
while i<=num do
if i%2=0 then
select i;
end if;
set i=i+1;#--变换步长
`
end while;
end//
--触发器
--有一个站内搜索功能,要求同时搜索两个product news.表
select * from (select id,title,addtime from news1 where title like '%a%'
union
select id, title,addtime from product1 where title like '%a%')
as t order by addtime desc limit 5;
select * from (select id,title,addtime,'news' as ft from news1 where title like '%a%'
union
select id, title,addtime ,'product1' as ft from product1 where title like '%a%')
as t order by addtime desc limit 5;
--分析表性能 extra 列下出现 Using filesort 因为order 排序出现的. 需要优化掉
explain select * from (select id,title,addtime,'news' as ft from news1 where title like '%a%'
union
select id, title,addtime ,'product1' as ft from product1 where title like '%a%')
as t order by addtime desc limit 5;
--性能超差,优化方案
--1、不产生临时表新建一个总表
create table zong(
id int,
title varchar(100),
addtime int,
ft varchar(20)
)//
--2.news1,product1 同步到总表,使用触发器
create table product1(
id int key auto_increment,
title varchar(100),
addtime int
)//
create table news1(
id int key auto_increment,
title varchar(100),
addtime int
)//
--修改 auto_increment 的值 news的auto_increment从1000000000开始
alter table news1 auto_increment=1000000000//
insert into product1(title,addtime) values('abc1',1),('abc2',1),('abc8',1),('abc4',1)//
insert into news1(title,addtime) values('ta5',1),('ta6',1),('ta9',1),('ta10',1)//
--创建触发器
create trigger 时机 insert|update|delete 名称 on 表名 for each row
begin
代码集;
说明:不能使用select输出
end//
--案例: 当news1中insert一条记录,同时往zong表中写一条记录。
create trigger news1_insert after insert on news1 for each row
begin
insert into zong(id,title,addtime,ft) value(new.id,new.title,new.addtime,'news1'); #--表news1新写入记录的id值 new.id
end//
--案例: 当news1中修改一条记录update,同时往zong表中写一条记录。
create trigger news1_update after update on news1 for each row
begin
update zong set title=new.title where id=old.id; #--表news1新写入记录的id值 new.id
end//
update news1 set title='nihao' where id=100000008//
--案例: 当news1中删除一条记录,同时往zong表中写一条记录。
create trigger news1_delete after delete on news1 for each row
begin
delete from zong where id=old.id; #--表news1新写入记录的id值 new.id
end//
delete from news1 where id=100000009//
--用户管理
--创建用户
create user 用户名@localhost [identified by '密码'];
--修改密码
--set password for 用户名@localhost=password('新密码');
set password for fanny@localhost=password('123456');
--删除用户
drop user 用户名@localhost
--权限管理
--分配权限
--grant 权值 on 数据库及表 to 用户@localhost;
--权值: all create grant revoke insert update delete alter drop
--数据库及表:*.* 库
名.* 库名.表名
grant select on projecttwo.* to fanny@localhost
--回收权限
revoke 权值 on 数据库及表 from 用户@localhost;
--数据库的恢复与备份
--备份:把mysql中的表结构及数据生成一个文件
mysqldump -u用户名 -p密码 数据库的名称>D:/projecttwo.sql
--恢复:先把文件传到服务器上 用ftp上传 linx服务器用 winscp
use 数据库名称;
source sql文件的路径
--视图
create view 视图名称 as select 语名
--例子:从class student 创建一个视图,视图中包含班极名称及学生的所有信息。
create view student_view as select c.name as cname,s.* from student as s join class as c on s.classid=c.id
--例子:查询学生ID为5的班极名称。
--没创建视图前用多表连查
select c.name as cname,s.* from student s join class c on s.classid=c.id where s.id=5;
--视图查询
select * from student_view where id=5