查看mysql数据库 *** 作如下:
1、同时按下键盘上的win加r按键,调出运行框,并在d出的运行框中输入cmd后按下回车按键。
2、在d出的页面中输入mysqlurootp命令,并点击键盘上的回车按键。
3、在d出的页面中输入需要查询的账号的密码并按下键盘上的回车按键。
4、这样就可以查看到所有的数据库。
一、mysql查询的五种子句where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果数)
1、where常用运算符:
比较运算符
>, <,= , != (<>),>= , <=
in(v1,v2..vn)
between v1 and v2在v1至v2之间(包含v1,v2)
逻辑运算符
not ( ! ) 逻辑非
or ( || )逻辑或
and ( &&) 逻辑与
where price>=3000 and price <= 5000 or price >=500 and price <=1000
取500-1000或者3000-5000的值
where price not between 3000 and 5000
不在3000与5000之间的值
模糊查询
like 像
通配符:
% 任意字符
_ 单个字符
where goods_name like '诺基亚%'
where goods_name like '诺基亚N__'
2、group by 分组
一般情况下group需与统计函数(聚合函数)一起使用才有意义
如:select goods_id,goods_name,cat_id,max(shop_price) from goods group by cat_id
这里取出来的结果中的good_name是错误的!因为shop_price使用了max函数,那么它是取最大的,而语句中使用了group by 分组,那么goods_name并没有使用聚合函数,它只是cat_id下的第一个商品,并不会因为shop_price改变而改变
mysql中的五种统计函数:
(1)max:求最大值
select max(goods_price) from goods
这里会取出最大的价格的值,只有值
#查询每个栏目下价格最高的
select cat_id,max(goods_price) from goos group by cat_id
#查出价格最高的商品编号
select goods_id,max(goods_price) from goods group by goods_id
(2)min:求最小值
(3)sum:求总数和
#求商品库存总和
select sum(goods_number) from goods
(4)avg:求平均值
#求每个栏目的商品平均价格
select cat_id,avg(goods_price) from goods group by cat_id
(5)count:求总行数
#求每个栏目下商品种类
select cat_id,count(*) from goods group by cat_id
###要把每个字段名当成变量来理解,它可以进行运算###
例:查询本店每个商品价格比市场价低多少;
select goods_id,goods_name,goods_price-market_price from goods
查询每个栏目下面积压的货款
select cat_id,sum(goods_price*goods_number) from goods group by cat_id
###可以用as来给计算结果取个别名###
select cat_id,sum(goods_price * goods_number) as hk from goods group by cat_id
不仅列名可以取别名,表单也可以取别名
3、having 与where 的异同点
having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写
where针对表中的列发挥作用,查询数据
having对查询结果中的列发挥作用,筛选数据
#查询本店商品价格比市场价低多少钱,输出低200元以上的商品
select goods_id,good_name,market_price - shop_price as s from goods having s>200
//这里不能用where因为s是查询结果,而where只能对表中的字段名筛选
如果用where的话则是:
select goods_id,goods_name from goods where market_price - shop_price >200
#同时使用where与having
select cat_id,goods_name,market_price - shop_price as s from goods where cat_id = 3 having s >200
#查询积压货款超过2万元的栏目,以及该栏目积压的货款
select cat_id,sum(shop_price * goods_number) as t from goods group by cat_id having s >20000
#查询两门及两门以上科目不及格的学生的平均分
思路:
#先计算所有学生的平均分
select name,avg(score) as pj from stu group by name
#查出所有学生的挂科情况
select name,score<60 from stu
#这里score<60是判断语句,所以结果为真或假,mysql中真为1假为0
#查出两门及两门以上不及格的学生
select name,sum(score<60) as gk from stu group by name having gk >1
#综合结果
select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk >1
4、order by
(1) order by price //默认升序排列
(2)order by price desc //降序排列
(3)order by price asc //升序排列,与默认一样
(4)order by rand() //随机排列,效率不高
#按栏目号升序排列,每个栏目下的商品价格降序排列
select * from goods where cat_id !=2 order by cat_id,price desc
5、limit
limit [offset,] N
offset 偏移量,可选,不写则相当于limit 0,N
N 取出条目
#取价格第4-6高的商品
select good_id,goods_name,goods_price from goods order by good_price desc limit 3,3
###查询每个栏目下最贵的商品
思路:
#先对每个栏目下的商品价格排序
select cat_id,goods_id,goods_name,shop_price from goods order by cat_id,shop_price desc
#上面的查询结果中每个栏目的第一行的商品就是最贵的商品
#把上面的查询结果理解为一个临时表[存在于内存中]【子查询】
#再从临时表中选出每个栏目最贵的商品
select * from (select goods_id,goods_name,cat_id,shop_price from goods order by cat_id,shop_price desc) as t group by cat_id
#这里使用group by cat_id是因为临时表中每个栏目的第一个商品就是最贵的商品,而group by前面没有使用聚合函数,所以默认就取每个分组的第一行数据,这里以cat_id分组
良好的理解模型:
1、where后面的表达式,把表达式放在每一行中,看是否成立
2、字段(列),理解为变量,可以进行运算(算术运算和逻辑运算)
3、 取出结果可以理解成一张临时表
二、mysql子查询
1、where型子查询
(把内层查询结果当作外层查询的比较条件)
#不用order by 来查询最新的商品
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods)
#取出每个栏目下最新的产品(goods_id唯一)
select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id)
2、from型子查询
(把内层的查询结果供外层再次查询)
#用子查询查出挂科两门及以上的同学的平均成绩
思路:
#先查出哪些同学挂科两门以上
select name,count(*) as gk from stu where score <60 having gk >=2
#以上查询结果,我们只要名字就可以了,所以再取一次名字
select name from (select name,count(*) as gk from stu having gk >=2) as t
#找出这些同学了,那么再计算他们的平均分
select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name
3、exists型子查询
(把外层查询结果拿到内层,看内层的查询是否成立)
#查询哪些栏目下有商品,栏目表category,商品表goods
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id)
三、union的用法
(把两次或多次的查询结果合并起来,要求查询的列数一致,推荐查询的对应的列类型一致,可以查询多张表,多次查询语句时如果列名不一样,则取第一次的列名!如果不同的语句中取出的行的每个列的值都一样,那么结果将自动会去重复,如果不想去重复则要加all来声明,即union all)
## 现有表a如下
id num
a5
b10
c15
d10
表b如下
id num
b5
c10
d20
e99
求两个表中id相同的和
select id,sum(num) from (select * from ta union select * from tb) as tmp group by id
//以上查询结果在本例中的确能正确输出结果,但是,如果把tb中的b的值改为10以查询结果的b的值就是10了,因为ta中的b也是10,所以union后会被过滤掉一个重复的结果,这时就要用union all
select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id
#取第4、5栏目的商品,按栏目升序排列,每个栏目的商品价格降序排列,用union完成
select goods_id,goods_name,cat_id,shop_price from goods where cat_id=4 union select goods_id,goods_name,cat_id,shop_price from goods where cat_id=5 order by cat_id,shop_price desc
【如果子句中有order by 需要用( ) 包起来,但是推荐在最后使用order by,即对最终合并后的结果来排序】
#取第3、4个栏目,每个栏目价格最高的前3个商品,结果按价格降序排列
(select goods_id,goods_name,cat_id,shop_price from goods where cat_id=3 order by shop_price desc limit 3) union (select goods_id,goods_name,cat_id,shop_price from goods where cat_id=4 order by shop_price desc limit 3) order by shop_price desc
四、左连接,右连接,内连接
现有表a有10条数据,表b有8条数据,那么表a与表b的笛尔卡积是多少?
select * from ta,tb //输出结果为8*10=80条
1、左连接
以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
语法:select n1,n2,n3 from ta left join tb on ta.n1= ta.n2 [这里on后面的表达式,不一定为=,也可以>,<等算术、逻辑运算符]【连接完成后,可以当成一张新表来看待,运用where等查询】
#取出价格最高的五个商品,并显示商品的分类名称
select goods_id,goods_name,goods.cat_id,cat_name,shop_price from goods left join category on goods.cat_id = category.cat_id order by shop_price desc limit 5
2、右连接
a left join b 等价于 b right join a
推荐使用左连接代替右连接
语法:select n1,n2,n3 from ta right join tb on ta.n1= ta.n2
3、内连接
查询结果是左右连接的交集,【即左右连接的结果去除null项后的并集(去除了重复项)】
mysql目前还不支持 外连接(即左右连接结果的并集,不去除null项)
语法:select n1,n2,n3 from ta inner join tb on ta.n1= ta.n2
总结:可以对同一张表连接多次,以分别取多次数据
单独的索引和复合索引的索引。单一索引,只包含单个列,一个表可以有多个单独的索引,而不是索引的组合的索引。综合指数,即包含多个列的电缆。MySQL索引的类型包括:
(1)一般指数
这是最基本的索引,它没有任何限制。它创造了几种方法:
◆创建一个索引
CREATE INDEX INDEXNAME ON mytable的(用户名(长度))
如果CHAR,VARCHAR类型,长度可以小于的实际长度场,如果是BLOB和TEXT类型,必须指定长度,下同。
◆表结构
ALTER mytable的ADD INDEX [INDEXNAME]开(用户名(长度))
◆当您创建一个表直接指定
CREATE TABLE mytable的(ID INT NOT NULL ,用户名VARCHAR(16)NOT NULL,索引[INDEXNAME](用户名(长度)))
删除索引的语法:
DROP INDEX [INDEXNAME] ON mytable的
(2)唯一索引
它类似于以前的一般指标,不同的是:索引列的值必须是唯一的,但是允许空值。如果它是一个综合指数相结合,列值??必须是唯一的。它创造了几种方法:
◆创建一个索引
CREATE UNIQUE INDEX INDEXNAME ON mytable的(用户名(长度))
◆表结构
ALTER mytable的ADD UNIQUE [INDEXNAME]开启(用户名(长度))
◆当您创建一个表直接指定
CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL,UNIQUE [INDEXNAME](用户名(长度)))
(3)主键索引
这是一个特殊的唯一索引不允许空值。一般的时候同时创建主键索引的表的结构:
CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL,PRIMARY KEY(ID))
>当然,你可以使用ALTER命令。请记住:一个表只能有一个主键。
(4)综合指数
对于图像的对比度和组合索引单列索引,添加更多的字段的表:
CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL ,城市VARCHAR(50)NOT NULL,年龄INT NOT NULL)
为了进一步榨取MySQL的效率,就要考虑建立组合索引。是的名称,城市,年龄建成一个索引,其中:
ALTER TABLE mytable的ADD INDEX name_city_age(名(10),城市,年龄)
建立表时,16 usernname长度,其中10。这是因为在正常情况下不超过10名,这将加快查询速度索引的长度,该指数将减少文件大小,提高INSERT的更新速度。
如果您创建的每个usernname一个单独的索引,城市,年龄,所以该表有三个单独的索引,上面的查询和索引的组合效率会有很大的不同,远远超过我们的组合索引少。虽然此时有了三个索引,但MySQL只可以使用它们认为这似乎是最有效的单一指标。
建立这样的组合索引,其实是三组相当于建立了以下综合指数:
usernname,城市,年龄usernname,城市usernname
为什么没有城市,年龄该做组合索引?它是一个综合指数,因为MySQL的结果“最左前缀”一个。这只是意味着,左侧只有从一开始的组合。不仅包含了这三个疑问将在综合指数中使用,下面的几个SQL就会使用这个组合索引:
SELECT * FROM mytable的WHREE用户名=“管理员”和城市=“郑州”SELECT * FROM mytable的WHREE用户名= “管理员”
接下来的几个未使用:
SELECT * FROM mytable的WHREE年龄为20及城市=“郑州”SELECT * FROM mytable的WHREE城市=“郑州”
(5)索引时间
在这里,我们已经学会了建立索引,那么我们需要在什么情况下创建索引?通常,当连接列和出现在需要建立索引,但也不完全如此,因为MySQL只<,,>=,BETWEEN,IN,LIKE,有的时候会使用索引。例如:
选择t.Name FROM mytable的吨LEFT JOIN mytable的M于t.Name = m.username WHERE m.age = 20和m.city ='郑州'
这时候就需要城市与年龄索引,由于userame mytable的表也出现在JOIN子句中,也有必要建立索引。
只是它需要像索引的时候一定提及。因为在一开始通配符%和_的查询,MySQL不会使用索引。例如,下面的语句将使用索引:
SELECT * FROM mytable的其中username like'admin%'
下一句不会使用:
SELECT * FROM mytable的WHEREt名称LIKE'% admin的
因此,更应注意使用LIKE差异。
(6)指数
的不足之处上面是说使用索引的好处,但过量使用索引将会造成滥用。因此,该指数也有其缺点:
◆虽然索引大大提高了查询速度,但会降低更新表,如表的INSERT,UPDATE的速度和DELETE。因为当你更新表,MySQL只保存数据,而且还节省大约索引文件。
◆建立索引会占用磁盘空间的索引文件。通常这个问题不是太严重,但如果你是在一个大表创建各种复合索引,索引文件将很快扩大。
指数只是其中的一个因素,以提高效率,如果你有大量的数据的MySQL表,你需要花时间去研究建立最佳的索引,或优化查询。
(7)使用索引
注意事项使用索引时,下面的一些技巧和注意事项:??
◆索引不会包含NULL值的列只要列中包含 BR />有NULL值?将不会被包含在索引中,复合索引,只要有包含NULL值的列,那么这个列是此复合索引无效。所以,我们不要让默认字段为NULL的数据库设计。
就用短串联指数指标,如果可能的话,你应该指定一个前缀长度。例如,如果一个CHAR(255)列,如果在前10或20个字符之内,多个值?是独一无二的,那就不要索引整个列。短索引不仅可以提高查询速度而且可以节省磁盘空间和I / O *** 作。
◆索引列排序
MySQL查询只使用一个索引,因此如果where子句已在索引中使用,然后按列的顺序将不会使用索引。因此,不要使用默认的数据库排序时排序 *** 作即可满足要求尽量不要包含多个排序列,如果需要的话最好创建这些列的一个综合指数。
◆like语句
在正常情况下运行不鼓励使用类似的 *** 作,如果非使用不可,如何使用也是一个问题。如“%AAA%”不会使用索引而不是像“AAA%”可以使用索引。
◆不要在列选择*从用户那里YEAR(录入)<2007年
*** 作将在每个行上进行的,这将导致失败而进行全表索引扫描,所以我们可以改变
选择*从用户那里录入时间<'2007-01-01'
◆不使用NOT IN和>
更多 *** 作上的MySQL索引类型进行了介绍。
转移: http://www.zbitedu.com/action-viewthread - TID-33491
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)