表相关语句:
创表相关
CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) );
mysql常用数据类型
int #整型,4个字节 一般不需要指定宽度,(8):只是显示为8位,默认有负号设置无负号: unsigned double #浮点型,例如double(5,2),标识最多5位,其中2位为小数,即最大为999.99 varchar #可变长度字符串类型。例如:varchar(10) 'aaa' 占3位 char #固定长度字符串类型。例如:char(10) 'aaa' 占10位 text #大文本字符串类型。 blob #字节类型。例如: datetime #日期时间类型。例如:datetime(yyyy-MM-dd hh:mm:ss) date #日期类型。例如:date(yyyy:MM:dd) time #时间类型。例如:time(hh:mm:ss) timestamp #时间戳类型。例如:timestamp(yyyy-MM-dd hh:mm:ss) 会自动赋值 enum #枚举 多选一 enum('male','female'),default为默认值 例如:sex enum('male','female') not null default 'male' set #集合 多选多,可以选一个 set('read','DJ','DBJ','run') 注:字符串类型和时间类型都要用单引号括起来,空值为null
mysql字段约束
#主键约束:PRIMARY KEY 要求被装饰的字段:唯一和非空 #唯一约束:UNIQUE 要求被装饰的字段:唯一, # .联合唯一:在结尾:unique(字段1,字段2) #非空约束:NOT NULL 要求被装饰的字段:非空 #外键约束:FOREIGN KEY 某主表的外键 #自动增加:AUTO_INCREMENT 自动增加(需要和主键 PRIMARY KEY 同时用) #设置默认值:DEFAULT 为该属性设置默认值 # 在int、char中:zerofill 不足位数默认填充0
删除表相关
删除表
#drop table 数据库表名 drop table Python
修改表相关
修改表字段
alter table 表名 add 字段名 类型(长度) [约束]; -- 添加列 alter table 表名 modify 字段名 类型(长度) [约束]; -- 修改列的类型长度及约束 alter table 表名 change 旧字段名 新字段名 类型(长度) [约束]; -- 修改列表名 alter table 表名 drop 字段名; -- 删除列 alter table 表名 character set 字符集; -- 修改表的字符集 rename table 表名 to 新表名; -- 修改表名
查看表相关
查看表结构
show create table 表名; -- 查看表的创建细节 desc 表名; -- 查看表结构 语句的结尾处(分号前面)添加g
或者G
参数可以改变展示形式。
mysql引擎设置
# 查看所有的存储引擎 show engines; # 查看不同存储引擎存储表结构文件特点 create table t1(id int)engine=innodb; -- MySQL默认的存储引擎,支持事务,支持行锁,支持外键。有且只有一个主键,用来组织数据的依据 create table t2(id int)engine=myisam; -- 不支持事务,不支持外键,支持全文索引,处理速度快。 create table t3(id int)engine=blackhole; -- 黑洞,写入它的任何内容都会消失 create table t4(id int)engine=memory;-- 将表中的数据存储在内存中。表结构以文件存储于磁盘。 insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1);
mysql开启远程连接
新建用户远程连接mysql数据库
-
- grant all on *.* to admin@'%' identified by '123456' with grant option;
- flush privileges;
允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。注意admin账户不一定要存在。
mysql字段操作相关
mysql添加字段
insert into 表(字段名1,字段名2..) values(值1,值2..);-- 向表中插入某些列 insert into 表 values(值1,值2,值3..); -- 向表中插入所有列
mysql删除字段
delete from 表名 -- 删除表中所有记录 delete from 表名 where 条件 -- 删除符合 where条件的数据 truncate table 表名; -- 把表直接drop掉,重新建表,auto_increment将置为零。删除的数据不能找回。执行速度比delete快
mysql修改数据
update 表名 set 字段名=值,字段名=值...; -- 这个会修改所有的数据,把一列的值都变了 update 表名 set 字段名=值,字段名=值... where 条件; -- 只改符合where条件的行
mysql查询
单表查询
#----综合使用 书写顺序 select distinct * from '表名' where '限制条件' group by '分组依据' having '过滤条件' order by limit '展示条数' 执行顺序 from -- 查询 where -- 限制条件 group by -- 分组 having -- 过滤条件 order by -- 排序 limit -- 展示条数 distinct -- 去重 select -- 查询的结果 正则:select * from emp where name regexp '^j.*(n|y)$'; 集合查询:max 、min 、avg 、sum 、count 、group_concat 。 拼接:concat、concat_ws、group_concat 内连接:inner join 左连接:left join 右连接:right join 全连接: 左连接 union 右连接
where查询
# between 在...之间 select id,name from emp where id >= 3 and id <= 6; 相当于: select * from emp where id between 3 and 6; # or 或者 select * from emp where id >= 3 or id <= 6; # in,后面可以跟多个值 select * from 表名 where 字段名 in (条件1,条件2,条件三); # like (见上18) # char——length() 取字符长度 select * from 表名 where char_length(需要获取长度的字段名) = 4; not 配合使用 注意:判断空不能用 = ,只能用 is
group by 分组
select 查询字段1,查询字段2,... from 表名 where 过滤条件 group by分组依据 # 分组后取出的是每个组的第一条数据
聚合查询 :以组为单位统计组内数据>>>聚合查询(聚集到一起合成为一个结果)
# max 最大值 # 每个部门的最高工资 select post,max(salary) from emp group by post; # min 最小值 # 每个部门的最低工资 select post,min(salary) from emp group by post; # avg 平均值 # 每个部门的平均工资 select post,avg(salary) from emp group by post; # 每个部门的工资总和 # sum 求和 select post,sum(salary) from emp group by post; # count(需要计数字段) 计数 # 每个部门的人数 select post,count(id) from emp group by post; # group_concat(需要分组后的字段) # 不仅可以用来显示除分组外字段还有拼接字符串的作用 select post,group_concat(name) from emp group by post; -- post:分组字段,name 需要分组后显示的字段 拼接: concat(不分组时用)拼接字符串达到更好的显示效果 as语法使用 举例: select concat("NAME: ",name) as 姓名 from emp; concat_ws: 如果拼接的符号是统一的可以用 举例: select concat_ws(':',name,age,sex) as info from emp; group_concat: 举例: select post,group_concat(name,'DSB') from emp group by post; 补充:as语法 起别名 select name as 姓名,salary as 薪资 from emp;
having 过滤查询
# having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以! # 用法 select 查询字段1,查询字段2,... from 表名 where 过滤条件1 group by分组依据 having avg(过滤条件2) > 10000;
distinct 去重
# 对有重复的展示数据进行去重操作 select distinct 需取重字段 from 表名;
order by 排序
select * from emp order by salary asc; #默认升序排 select * from emp order by salary desc; #降序排 # 多条件排序 #先按照age降序排,在年轻相同的情况下再按照薪资升序排 select * from emp order by age desc,salary asc;
limit 限制展示条数
# 限制展示条数 select * from emp limit 3; # 查询工资最高的人的详细信息 select * from emp order by salary desc limit 1; # 分页显示 select * from emp limit 0,5; # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置 select * from emp limit 5,5;
正则
select * from emp where name regexp '^j.*(n|y)$';
replace替换
replace(str1,old,new) -- str1:需要替换的字段名 update gd_km set mc=replace(mc,'土地','房子') 说明:new替换str1中出现的所有old,返回新的字符串,如果有某个参数为NULL,此函数返回NULL 该函数可以多次替换,只要str1中还有old存在,最后都被替换成new 若new为空,则删除old
多表查询
内连接、左连接、右连接、全连接
1、内连接:只取两张表有对应关系的记录(只拼两个表共有的) 左表 inner join 右表 on 条件 select * from emp inner join dep on emp.dep_id = dep.id where dep.name = "技术"; 2、左连接:在内连接的基础上,保留左边的数据,右边没有就为空 左表 inner left 右表 on 条件 3、右连接:在内连接的基础上,保留右边的数据,左边没有就为空 左表 inner right 右表 on 条件 4、全连接:左右连接都有,用union连接 左表 inner left 右表 on 条件 union 左表 inner right 右表 on 条件 select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;
子查询
# 就是将一个查询语句的结果用括号括起来当作另外一个查询语句的条件去用 select name from where id in(select dep_id from emp where age>25);
mysql练习50题:https://blog.csdn.net/fashion2014/article/details/78826299