初始Mysql
Posted J哥.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始Mysql相关的知识,希望对你有一定的参考价值。
mysql笔记:
-- create table if not exists 新建的表名(条件:id int unsigned primary key auto_increment,等);
-- if not exists 表示如果这个表存在那就不建 如果不存在就建立这个表
insert into classes values
(0,'程佳鹏'),
(0,'杨荣降'),
(0,'吴彦杰'),
(0,'刘铮'),
(0,'郭康乐'),
(0,'乔旭');
-- 分组:
-- 按照性别分组,查询所有的性别:
select gender from students group by gender;
--计算每种性别的人数:
select gender,count(*) from students group by gender;
-- 计算男生的人数:
select gender,count(*) from students where gender='男' group by gender;
-- Empty set, 19 warnings (0.00 sec)
-- 将男生姓名和年龄都表示出来:
select gender, group_concat(name,age) from students where gender='男' group by gender;
--group by 和 group_concat 的运用:查询平均年龄超过30岁的性别,以及姓名
select gender,group_concat(name) from students group by gender having avg(age)>30;
-- 分页:
-- limit start,count start=0 时 id=1
-- limit:限制查询的个数:(查询前两个人的数据)
select * from students where gender='男' limit 2;
-- 查询前5个人的信息:
select * from students limit 0,5;
-- 页数的公式: select * from students limit (第n页-1) * 每页的个数,每页的个数;
select * from students where gender="女" order by age asc limit 0,2;
select * from students where gender="女" order by age asc; --从小到大
select * from students where gender="女" order by age desc; --从大到小
-- 连接查询: --inner join ....on
-- 查询 有能够对应班级的学生 以及班级信息
-- 内连接:
select * from students inner join classes on students.cls_id=classes.id;
select students.*,classes.name from students inner join classes on students.cls_id=classes.id;
select * from students as s inner join classes as c on s.cls_id=c.id;
-- 按照要求显示姓名和班级:
select students.name , classes.name from students inner join classes on students.cls_id=classes.id;
-- 给数据表起名字:
select s.name , c.name from students as s inner join classes as c on s.cls_id=c.id; --as 给表起名字
-- 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称:
select s.* , c.name from students as s inner join classes as c on s.cls_id=c.id;
-- 以上的查询中 ,将班级姓名显示第一列:
select c.name ,s.* from students as s inner join classes as c on s.cls_id=c.id;
-- 查询 有能够对应班级的学生以及班级信息,按照班级进行排序:
select c.name ,s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name desc;
-- 当在同一班级的时候,按照学生的id进行从小到大的顺序排序:
select c.name ,s.* from students as s inner join classes as c on s.cls_id=c.id order by c.name, s.id;
-- 外连接:
右链接:right join 左连接:left join
select * from students as s right join classes as c on s.cls_id=c.id; --右连接
select * from students as s left join classes as c on s.cls_id=c.id; --左连接
--查询没有对应班级信息的学生
select * from students as s left join classes as c on s.cls_id=c.id having c.id=null;
select * from students as s left join classes as c on s.cls_id=c.id where c.id=null; --可行但是不推荐使用
-- 自关联: 运用在省市县 或者 公司的上下级
-- 1.设计省信息的表结构用 orovinces:
id
ptitle
-- 设计市信息的表结构用 citys:
id
ctitle
proid
citys表的proid表示城市所属的省,对应着provinces表的id值
-- 子查询: 查询年龄最大的男生信息:
select * from students;
select * from students where age =( select max(age) from students);
-- 拆表:
-- 例子:原有一个表 goods 里面有列名叫name, cate_name ,之后再创建一个新的表 goods_cates 然后将原表的部分数据赋值到新表:原列表数据不变
select cate_name from goods group by cate_name; --拿到goods里的数据 group by 分组
insert into goods_cates (name) select cate_name from goods group by cate_name; --将分组结果导入到 goods_cates 数据表中
-- 接着同步表的数据:
update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id; 关联数据
-- 设置一个外键 用新表限制原表 新增数据的筛选 有的数据就不合格:
alter table goods add foreign key (cate_name) references goods(id); -- foreign key 表示的是外键 references 表示引用
实际开发中,很少使用外键约束,会极大的降低表更新的效率 所以:
show create table goods; --通过查看表创建语句来获取名称 就是获取外键约束名称 : CONSTRAINT 后面的就是约束
alter table goods drop foreign key 外键名称; -- 通过获取的名称来删除外键的约束
-- 事务: 广泛应用于银行系统和订单系统等 表的引擎类型必须是 innodb类型才可以使用事务,这也是MySQL默认引擎
所谓事务,它是一个操作系统,要么都执行,要么都不执行,是不可分割的单位。
事务四大特征:(ACID)
1.原子性(A) :整个事务中的所有操作要么成功要么不成功
2.一致性(C) :最终执行的结果是一样的 中间出了问题也不会出现数据丢了的情况
3.隔离性(I) :当事务开启之后:一个事务所做的修改在最终提交前,对其它事务是不可见的(一个sql的执行不会影响到另外一个sql)
4.持久性(D) :一旦事务提交 commit,则其所做的修改会永久保存到数据库 (此时即使数据库系统崩溃,修改的数据也不会丢失)
-- 事务开启 :begin; / start transaction; 中间:sql语句 事务提交 ,结束: commit; 回滚事务:放弃缓存中变更的数据: rollback;
-- 索引:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.
-- 更通俗的说:数据库索引(index)好比是一本书前面的目录,能加快数据库的查询速度
-- 一般应用系统对比数据库的读写比例在10:1 左右(即 有10次查询操作时 有一次写的操作)。
开启时间检测功能: set profiling=1;
查询第一万条数据ha-9999: select * from test_index where title='ha-9999';
查看执行的时间: show profiles;
为表 test_index 的 title列表创建索引: create index titlt_index on test_index(title(10));
执行查询语句: select * from test_index where title='ha-9999';
再次查看执行的时间: show profiles; (时间变短了,当数据过多时 提高工作效率)
查看索引: show index from 表名; --->key_name 索引名称
-- create index titlt_index on test_index(title(10));
创建索引: create index 索引名称 on 表名(字段名称(长度)); 长度=varchar的值 如果是int就不用写长度了
删除索引: drop index 索引名称 on 表名
以上是关于初始Mysql的主要内容,如果未能解决你的问题,请参考以下文章