小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 后端编程 > 数据库 > mysql

mysql命令练习

分类: mysql46个赞

---数据库操作

create database if not exists 数据库名; //创建数据库1

create database if not exists 数据库名 //再次创建数据库

show databases //显示所有数据库

use 数据库名;   //进入数据库

drop database if exists 数据库名



---表操作

//创建表

//1.primary key 主键 unique 唯一键(不能出现重复值) unsigned 未签名 comment 评论解释 primary 主要的 increment增量 

//2.创建索引的3种方法:1.创建了主键就会自动的创建主键索引2.创建唯一键就会创建唯一索引3.普通索引

create table data(

id int unsigned not null   auto_increment  primary key comment '主键',

name varchar(20)  not null unique comment '姓名',

`add` varchar(50) not null default '地址不详' comment '地址',

score int comment '成绩,可以为空'

)engine=MyISAM


//组合主键和唯一键后定义

//唯一键不支持2个字段,需要一个一个写

create table data1(

id int unsigned,

name varchar(20),

`add` varchar(50),

score int,

test int,

primary key(id,name),

unique (test),

unique (score)

)engine=MyISAM


describe 表名


//创建表时候创建索引

create table data2(

name varchar(20),

score int unsigned unique ,

index ix_name(name),

index  ix_score(score)

)engine=MyISAM


describe 表名


//创建表后创建索引,不设置引擎

create table data3(

score int

)

create index 索引名 on 表名 (字段名 [desc])

alter table 表名 add 字段名 字段属性

alter table 表名 add index 索引名(字段名)


describe 表名

show index from 表名 --查询索引名

drop index 索引名 on 表名 --删除索引


---查询


show databases //显示所有数据库

show tables;  //显示表

show create table 表名  //显示表的所有创建命令和引擎源码

show table status like '表名';  // 查看表信息(引擎,编码,创建时间等) status-状态,地位,身份,这个like后必须加引号

describe 表名;  //查看表的所有列和列类型

desc 表名 'n%';  //查看表列名字以n开头的列

show status  // 查看MySQL服务器状态,当前连接数,运行时间,语句执行次数等 status-状态,地位

show full processlist  //查看MySQL当前用户连接进程状态 full-完整 process list-进程列表

show variables   --查看系统变量及其值


--复制表

insert into 目标表(字段1,字段2,....) select 字段1,字段2,... from 源表; //复制表的部分数据,注意,前面有括号,后面没有

create table 新表 select 字段 from 旧表 //复制新表方法1 可复制结构和数据,但不能复制主键,唯一键,引擎

create table 新表 like 旧表  //只能复制表结构(包含主键),不能复制表数据,和可视化手动复制一样

select * from 表名  //查看表里有没有数据

describe 表名; //查看表的所有列和列类型

show table status like '表名';  //查看表信息



---删除和清空表

drop table if exists 表名; //删除data3表

drop table if exists 表名1,表名2; //同时删除data3 data4表

show tables //查看数据库中所有表



---插入数据

insert into 表名 values(0,'rose','女',80);  // 插入数据到每个字段,字段名可省略

insert into 表名 values (0,'李白','男','四川'),(0,'杜甫','男','湖北'); //插入多个字段

insert into 表名 (name,`add`,score) values ('tom',default,50);  //插入指定字段,值要一一对应

insert into 表名 select * from 表名 where 条件;  //不用测试,插入某一个表的数据进来,如果有唯一值会报错

alter table 表名 auto_increment=10  //让自动增长列从100开始 increment-增量

//变量范围:offset和increment可以在全局以及session级别设置这2个变量

//数据库引擎上innodb的,它不支持设置和修改初始值,只有MyISAM

set  @@auto_increment_offset=20;   //让自动增长从100开始,全局,对整个数据库生效 offset-开端出发 

set  @@auto_increment_increment=5;   //让自动增长列每次id增加为10 全局,会对整个数据库生效

show variables   --查看系统变量及其值



---修改表(添加修改字段)

describe 表名;

alter table 表名 add 新字段 字段属性;   //给data表添加add1字段,默认在最后

alter table 表名 add 新字段 字段属性 after name;  -- 在name之后添加sex字段

alter table 表名 add 新字段 字段属性 first;  -- 添加age字段并放在最前面

alter table 表名  add unique(字段1名),add unique(字段名2);  //设置字段1字段2都为唯一键

alter table 表名 change 旧字段 新字段 字段属性 zerofill default '缺考'; //修改data表中的sex字段数据类型并设置默认值未知 zerofill 补充零

alter table 表名 modify 字段名 字段属性 default '性别不详'; //将字段的数据类型更改且默认值是‘地址不详’modify-修改

alter table 表名 drop `add1`;   -- 删除add1字段

alter table 表名 engine=innodb;  //修改表data引擎为innodb

show table status //查看引擎和行数,和创建时间等

alter table 表名 engine=myisam;  //再把引擎改回来myisam

alter table 旧表名 rename to 新表名;  //修改表明为datanew



---更新数据

update 表名 set 字段1=值,字段2=值 where id=1;

update 表名 set 字段1=值 where 字段 is null; //替换字段为null的值


---删除数据

create table 新表 select 字段 from 旧表 //先复制一个表,含数据

delete from 表名 where id in (1,2);  //删除id为1的表

truncate table  表名  //清空表数据,删除data2表所有数据并创建同结构的data2表,用truncate删除后,AUTO_INCREMENT自动增长列从1开始

insert into 表名 values(0,'rose','女',80); //插入数据测试是否从0开始


---枚举(单选)

alter table 表名 add 字段名 enum('男','女','保密') after name;  //enum枚举单选

insert into 表名 (字段名) values (3); //添加一个枚举数据,记得unique必填

describe 表名;  //查看表的所有列和列类型


---集合(多选)

alter table 表名 add hobby set('爬山','读书','游泳','烫头') first;  //添加集合多选到首 hobby爱好

insert into 表名 (字段名) values (15);  //添加一个集合数据全部 1+2+4+8  2的N次方

describe 表名; 


---sql的函数

select rand(); //随机数0-1,默认9位

select rand() + 2 //随机2-3

select rand()*3; //随机数0-3

select floor(rand()*3) //向下取整随机0,1,2

select ceil(rand()*3) //向上取整随机1,2,3

select truncate(3.14159,3) //结果3.141 

select round(3.1415926,3) //结果3.142 四舍五入

select round(rand()*3+5,0) //取5-8直接的整数 结果:随机5678

select * from 表名 order by rand(); //随机展现

select * from 表名 limit 2,10; //从第三条开始取10条(limit第一行从0开始) limit必须放在结尾


select ucase('i name is tom') '转成大写',lcase('My Name IS TOM') '转成小写';

select left('abcdef',3) '从左边截取',abc

select right('abcdef',3) '从右边截取',def

select substring('abcdef',3,2) '从中间截取',cd

select concat(字段1,'是',字段2,'岁') as '谁多大了' from 表名   //字符串相连

select length('锄禾日当午') as '字节',char_length('锄禾日当午') 字符; //查看字符长度

select 字段名 from 表名 where length(name)>=7  //查询字段字符长度大于7的行

select unix_timestamp();  //时间戳

select from_unixtime(unix_timestamp()),now();  //格式化时间

select year(now()) 年,month(now()) 月,day(now()) 日,hour(now()) 小时,minute(now()) 分钟,second(now())秒;

select dayname(now()) 星期,dayofyear(now()) 本年第几天,datediff(now(),'2010-08-08') 相距天数;

select md5('aa'),sha('aa');; //md5加密


---查询select 聚合函数

select sum(字段名) as 别名 from order where id>10;  //先查询出id大于10的数据,再执行聚合语句sum求和(空值不计算)

select avg(字段名) from 表名;   //求出avg平均值(不包含空值)

select max(字段名) '语文最大值' from 表名; //查出语文成绩最高的人,min是最低

select count(*) from 表名;  //返回所有行,包含null

select count(字段名) from 表名;  //返回sex字段行的数量,不包含null

select count(distinct 字段名) from 表名;  //返回字段行唯一不同的值个数, 不包含null distinct-不同的

select distinct 字段名 from 表名   //返回字段行唯一不同的值, 包含null


--查询select 模糊查询like _ % [] [^]

select * from 表名 where 字段名 like '%三%'  and 字段名 like '%猫%'  //查询有三且有猫的记录,% 表示任意0个或多个字符。可匹配任意类型和长度的字符

select * from 表名 where 字段名 like '_三_'  //查询三个字中间带三的名字  , 表示任意单个字符。匹配单个任意字符

select * from 表名 where 字段名 regexp '[张李王]三'  //找出“张三”、“李三”、“王三”(而不是“张李王三”);

select * from 表名 where 字段名 not regexp '[张李王]三'  //将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;不包含null

.


--查询select 联合语句 union去重和union all不去重

select 表1字段 from 表1名 union select 表2字段 from 表2名  //查询data表中的姓名和data1表中姓名 结果自动合并的重复的记录


--查询select多表查询    内连接、外连接、自然连接、交叉连接


select * from 表1 inner join 表2 on 表1.公共字段=表2.公共字段  //内连接 返回的两个表的公共记录

select * from 表1 inner join 表2 using(ID); //使用using用来指定连接字段 返回的两个表的公共记录

//自然连接无存在价值

select * from 表1 natural join 表2;  //自然内连接  显示2个表不重复的所有列 natural:自然天然

select * from 表1 natural left join 表2; //自然左外连接 已左边表为准,右边多出的显示null

select * from 表1 natural right join 表2; //自然右外连接 反之

select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段   //左外连接 以左边的表为准,右边如果没有对应的记录用null显示

select * from 表1 right join 表2 on 表1.公共字段=表2.公共字段 //右外连接 以右边的表为准,左边如果没有对应的记录用null显示

select * from 表1 full join 表2 on 表1.公共字段=表2.公共字段  //完全外连接  ,如右表没有匹配,则结果全部为NULL,如左表没有匹配,则全部为NULL。

select * from 表1 cross join 表2   //交叉连接 返回笛卡尔积

select * from 表1 cross join 表2 where 表1.ID=表2.ID //交叉连接如果有连接条件和内连接是一样的。


select 表名1,coalesce(writtenexam,'缺考'),coalesce(labexam,'缺考') from stuinfo natural left join stumarks; //返回函数第一个非空表达式


---order by 排序

select * from 表名 order by 字段 desc; //按字段降序 默认是升序asc

select * from 表名 order by 字段1 asc,字段2 desc; //多列排序

select * from 表名 order by rand(); //随机排序


---limit限制

//limit在update和delete中也可以用

select * from 表名 limit 2,3;  //从第2个位置开始取,取3条记录

select * from 表名 limit 3;  //起始位置可以省略,默认从0开始



---group by分组

select 分组字段,avg(字段2) as '平均分' from 表名 group by 分组字段;  //按性别展现平均分,前面放分组字段和聚合函数

select group_concat(字段),分组字段,avg(字段2) as '平均分' from 表名 group by 分组字段;  //通过group_concat把所有值连接起来

select 分组字段1,分组字段2,avg(字段2) from stu group by 分组字段1,分组字段2;


---having条件筛选  

//where一般是对原始数据进行筛选,having是对结果集进行筛选。,where不能使用聚合函数,但having能,

//因为优先级from>where>group(含聚合)>having>order>select。

select 分组字段,count(*) from 表名 group by 分组字段 having count(*) > 4;


--查询select子查询

1.标量子查询 返回值是1个 查找笔试成绩是80的学生

select * from 表1名 where stuno=(select stuno from 表2名 where 表二字段=80); 

2.列子查询,返回值是多个或1列, 如果子查询的结果返回多条记录,不能使用等于=,用in或not in-- 查找及格的同学

select * from stuinfo where stuno in (select stuno from stumarks where writtenexam>=60);

3.行子查询,子查询返回的结果是多个字段组成查找语文成绩最高的男生和女生

select * from stu where(stusex,ch) in (select stusex,max(ch) from stu group by stusex);

4.表子查询 将子查询的结果作为表   查找语文成绩最高的男生和女生

select * from (select * from stu order by ch desc) t group by stusex;

5.exists子查询  可提高查询效率

如果笔试成绩有人超过80人,就显示所有学生信息

select * from stuinfo where exists (select * from stumarks where writtenexam>=80);


--视图,可以使得降低SQL语句的复杂度

1.创建视图并指定算法为temptable

create or replace algorithm=temptable view view1 as select * from stu where ch>=60 and math>=60;

2.使用视图

select * from view1;

3.修改视图

alter view 视图名 as select 语句

4.删除视图

drop view [if exists] 视图1,视图,...

5.查看视图3种方法

show tables //显示所有的表和视图

show table status\G;       -- 查询所有表和视图的详细状态信息

show table status where comment='view'\G   -- 只查找视图信息

6.查看视图结构

desc view1;

7.查询创建视图的语法

show create view view1\G


--事务

1.开启事务

start transaction  或 begin [work]

2.提交事务

 update bank set money=money-100 where card='1001';

 commit

4.设置事务回滚点

update bank set money=money-100 where card='1001';

 savepoint a1

 3.回滚事务

rollback

rollback  to a1


---


--拓展:

1.显示地区及每个地区参加笔试的人数并将结果降序排列

select stuaddress,count(writtenexam) c from stuinfo left join stumarks using(stuno) group by stuaddress order by c desc;

2.显示男女的总人数

select stusex,count(*) from stuinfo group by stusex;


小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> mysql命令练习