Mysql数据库系列(二)
MySQL基础巩固
-
创建库 :country(指定字符编码为utf8)
-
创建表 :sanguo 字段:id 、name、attack、defense、gender、country
要求 :id设置为主键,并设置自增长属性 id int primary key auto_increment,
-
插入5条表记录(id 1-5,name-诸葛亮、司马懿、貂蝉、张飞、赵云),攻击>100,防御<100)
-
查找所有蜀国人的信息
select * from sanguo where country="蜀国";`
-
将赵云的攻击力设置为360,防御力设置为68
update sanguo set attack=360,defense=68 where name="赵云";
-
将吴国英雄中攻击值为110的英雄的攻击值改为100,防御力改为60
update sanguo set attack=100,defense=60 where country="吴国";
-
找出攻击值高于200的蜀国英雄的名字、攻击力
select name,attack from sanguo where attack>200;
-
将蜀国英雄按攻击值从高到低排序
select name, country from sanguo where country="蜀国" order by attack DESC;
-
魏蜀两国英雄中名字为三个字的按防御值升序排列
select * from sanguo where country in("魏国","蜀国") and name like"___" order by attack;
-
在蜀国英雄中,查找攻击值前3名且名字不为 NULL 的英雄的姓名、攻击值和国家
select name,attack,country from sanguo where country="蜀国" and name is not NULL order by attack DESC limit 3;
MySQL普通查询顺序
3、select ...聚合函数 from 表名 1、where ... 2、group by ... 4、having ... 5、order by ... 6、limit ...;
- 聚合函数
方法 | 功能 |
---|---|
avg(字段名) | 该字段的平均值 |
max(字段名) | 该字段的最大值 |
min(字段名) | 该字段的最小值 |
sum(字段名) | 该字段所有记录的和 |
count(字段名) | 统计该字段记录的个数 |
eg1 : 找出表中的最大攻击力的值?
select max(attack) from sanguo
eg2 : 表中共有多少个英雄?
select count(name) from sanguo
eg3 : 蜀国英雄中攻击值大于200的英雄的数量
select count(id) from sanguo where country="蜀国" and attack >200;
- group by
- 分组后select后面接的非聚合字段只能是被分组的那个字段
给查询的结果进行分组
eg1 : 计算每个国家的平均攻击力
select country,avg(attack) from sanguo group by country;
eg2 : 所有国家的男英雄中 英雄数量最多的前2名的 国家名称及英雄数量
select country,count(id) as number from sanguo where gender="M" group by country order by number DESC limit 2;
group by后字段名必须要为select后的字段
查询字段和group by后字段不一致,则必须对该字段进行聚合处理(聚合函数)
- having语句
对分组聚合后的结果进行进一步筛选
eg1 : 找出平均攻击力大于105的国家的前2名,显示国家名称和平均攻击力 select country,avg(attack) from sanguo group by country having avg(attack)>105 order by avg(attack) DESC limit 2;
注意
having语句通常与group by联合使用 having语句存在弥补了where关键字不能与聚合函数联合使用的不足,where只能操作表中实际存在的字段,having操作的是聚合函数生成的显示列
- distinct语句
不显示字段重复值
eg1 : 表中都有哪些国家 select distinct country,name from sanguo; eg2 : 计算一共有多少个国家 select count(distinct country) from sanguo;
注意
distinct和from之间所有字段都相同才会去重 distinct不能对任何字段做聚合处理
- 查询表记录时做数学运算
运算符 : + - * / % **
eg1: 查询时显示攻击力翻倍 select name,attack*2 from sanguo; eg2: 更新蜀国所有英雄攻击力 * 2 update sanguo set attack=attack*2 where country="蜀国"; 点赞 update topic set topic_like=topic_like+1 where id=1;
索引概述
- 定义
对数据库表的一列或多列的值进行排序的一种结构(Btree方式)
传统B树的特点:
1.每个节点能存储多个索引[包含数据],由于该特性,促使树的高度比二叉树矮,从而降低了磁盘IO查找.
2.但是由于每个节点存储了数据…
B+树的特点:
1.节点内只存储索引,不存储数据,从而单个节点能存储的索引数量远远大于B树.
2.数据存储在叶子节点中,并且有序的相连[范围查询效果好]
B+的每个节点不存储数据,降低了树的高度
B+每个叶子节点的都是从低到高.并且收文相连
数据库索引中为什么使用B树(B+树)?
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,这样,索引查找过程中就要产生磁盘IO消耗。因此,选择数据结构时,索引的结构组织要尽量减少查找过程中磁盘IO的存取次数。
磁盘预读可以通过IO效率(局部性原理),预读的长度一般为页的整数倍。数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为一个页,这样每个节点只需要一次IO就可以完全载入。每次新建节点时,直接申请一个页的空间,这样就保证了一个节点物理上也存储在一个页,加之计算机存储分配都是按页对齐的,就实现了一个节点只需要一次IO。
B树中一次检索最多需要h-1次IO(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般应用中,出度d是非常大的数字,因此h非常小(通常不超过3)。红黑树这种结构,h明显要深的多,由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。红黑树的IO渐进复杂度也为O(h),效率明显比B树差很多。
B+树更适合外索引,原因和内节点出度d有关,d越大索引性能越好,而出度的上线取决于节点内key和data的大小,由于B+树内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能。
``
- 优点
加快数据检索速度
- 缺点
占用物理存储空间(/var/lib/mysql) 当对表中数据更新时,索引需要动态维护,降低数据维护速度
- 索引示例
# cursor.executemany(SQL,[data1,data2,data3]) # 以此IO执行多条表记录操作,效率高,节省资源 1、开启运行时间检测 mysql>show variables like '%pro%'; mysql>set profiling=1; 2、执行查询语句(无索引) select name from students where name='Tom99999'; 3、查看执行时间 show profiles; 4、在name字段创建索引 create index name on students(name); 5、再执行查询语句 select name from students where name='Tom88888'; 6、查看执行时间 show profiles;
索引分类
普通(MUL) and 唯一(UNI)
- 使用规则
1、可设置多个字段 2、普通索引 :字段值无约束,KEY标志为 MUL 3、唯一索引(unique) :字段值不允许重复,但可为 NULL KEY标志为 UNI 4、哪些字段创建索引:经常用来查询的字段、where条件判断字段、order by排序字段
- 创建普通索引and唯一索引
创建表时
create table 表名( 字段名 数据类型, 字段名 数据类型, index(字段名), index(字段名), unique(字段名) );
已有表中创建
create [unique] index 索引名 on 表名(字段名);
- 查看索引
1、desc 表名; --> KEY标志为:MUL 、UNI 2、show index from 表名\G;
- 删除索引
drop index 索引名 on 表名; eg:create unique names index on day02(name);
主键(PRI)and自增长(auto_increment)
- 使用规则
1、只能有一个主键字段 2、所带约束 :不允许重复,且不能为NULL 3、KEY标志(primary) :PRI 4、通常设置记录编号字段id,能唯一锁定一条记录
- 创建
创建表添加主键
create table student( id int auto_increment, name varchar(20), primary key(id) )charset=utf8,auto_increment=10000;##设置自增长起始值
已有表添加主键
alter table 表名 add primary key(id);
已有表操作自增长属性
1、已有表添加自增长属性 alter table 表名 modify id int auto_increment; 2、已有表重新指定起始值: alter table 表名 auto_increment=20000;
- 删除
1、删除自增长属性(modify) alter table 表名 modify id int; 2、删除主键索引 alter table 表名 drop primary key;
- 2、面试题
有一张文章评论表comment如下
comment_id | article_id | user_id | date |
---|---|---|---|
1 | 10000 | 10000 | 2018-01-30 09:00:00 |
2 | 10001 | 10001 | … … |
3 | 10002 | 10000 | … … |
4 | 10003 | 10015 | … … |
5 | 10004 | 10006 | … … |
6 | 10025 | 10006 | … … |
7 | 10009 | 10000 | … … |
以上是一个应用的comment表格的一部分,请使用SQL语句找出在本站发表的所有评论数量最多的10位用户及评论数,并按评论数从高到低排序
备注:comment_id为评论id
article_id为被评论文章的id
user_id 指用户id
select user_id,count(user_id) from comment group by uesr_id order by count(user_id) DESC limit 10;
- 3、操作题
综述:两张表,一张顾客信息表customers,一张订单表orders
表1:顾客信息表,完成后插入3条表记录
c_id 类型为整型,设置为主键,并设置为自增长属性 c_name 字符类型,变长,宽度为20 c_age 微小整型,取值范围为0~255(无符号) c_sex 枚举类型,要求只能在('M','F')中选择一个值 c_city 字符类型,变长,宽度为20 c_salary 浮点类型,要求整数部分最大为10位,小数部分为2位
表2:顾客订单表(在表中插入5条记录)
o_id 整型 o_name 字符类型,变长,宽度为30 o_price 浮点类型,整数最大为10位,小数部分为2位 设置此表中的o_id字段为customers表中c_id字段的外键,更新删除同步 insert into orders values(1,"iphone",5288),(1,"ipad",3299),(3,"mate9",3688),(2,"iwatch",2222),(2,"r11",4400);
增删改查题
1、返回customers表中,工资大于4000元,或者年龄小于29岁,满足这样条件的前2条记录 2、把customers表中,年龄大于等于25岁,并且地址是北京或者上海,这样的人的工资上调15% 3、把customers表中,城市为北京的顾客,按照工资降序排列,并且只返回结果中的第一条记录 4、选择工资c_salary最少的顾客的信息 5、找到工资大于5000的顾客都买过哪些产品的记录明细 6、删除外键限制 7、删除customers主键限制 8、增加customers主键限制c_id
- 点赞
- 收藏
- 分享
- 文章举报
- 【实战演练】数据库基本知识与原理系列04-Mysql数据库主从复制
- [CentOS Python系列] 四.阿里云服务器CentOS连接远程MySQL数据库及pymsql
- python操作mysql数据库系列-安装MySQLdb
- saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
- JavaEE系列之(三)JDBC操作MySQL数据库
- 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库
- MySQL数据库系列之Centos6.5系统下RPM包安装MySQL5.6
- MySQL 数据库性能优化之表结构优化(这是 MySQL数据库性能优化专题 系列的第二篇文章)
- MySQL数据库系列培训教程
- python操作mysql数据库系列-安装MySql
- MySQL数据库系列之建立高性能的索引
- Mysql数据库优化系列(四)------表的优化与列类型选择
- 【linux系列】Centos下安装mysql数据库
- Centos下mysql数据库安装、创建数据库、utf8编码设置、外部访问授权、导入sql执行、开机启动(系列3)
- MYSQL数据库学习系列四
- MySQL数据库管理系统系列之安装配置
- mysql 优化系列(一) Mysql数据库引擎性能测试
- MySQL 数据库性能优化之缓存参数优化(这是 MySQL数据库性能优化专题 系列的第一篇文章)
- 攻克CakePHP系列一 连接MySQL数据库
- Mysql数据库优化系列(五)------索引优化策略之面试题