mysql查询

mysql学习(下面所有都是针对mysql而言) #

sql排序语句 #

  • 升序
  • (select f.* from fruits f WHERE s_id IN (101,102) order by f_name)==(select f.* from fruits f WHERE s_id IN (101,102) order by f_name asc)
  • 对于sql的升序而言,当使用了order by之后如果不添加desc那么默认是升序 order by f_name 和 order by f_name ASC 效果一致
  • 降序
  • (select f.* from fruits f WHERE s_id not IN (101,102) order by f_name DESC )
  • order by之后加上DESC结果集就是降序

上面结合了 关键字in可以看到 in (101,102)和not in (101,102)

带between and 的范围查询 #

  • (select f.* from fruits f WHERE f.f_price between 2.00 and 14.00)查询价格在2.00元到14.00元之间的数据,这样也可以(select f.* from fruits f WHERE f.f_price>2.00 and f.f_price<12.67)

带like的字符串匹配查询 #

  • (select f.* from fruits f WHERE f.f_name like ‘%g%')查询f_name包含g的记录
  • (select f.* from fruits f WHERE f.f_name like ‘b%')查询以b开头的记录,同理结尾的字符也是一样原理

查询null值 #

  • (select c.* from customers c WHERE c.c_email is null)查询email为null的数据

带and 的多条件查询 #

  • (select f.* from fruits f WHERE f.s_id=‘101’ and f.f_price>=5)

带or 的多条件查询 #

  • (select f.* from fruits f WHERE f.s_id=‘101’ or f.s_id=‘102’)

查询结果不重复 #

  • (select distinct f.* from fruits f)添加了过滤字段distinct

分组查询 #

  • (select f.s_id,count(*) as total from fruits f group by f.s_id)
  • (select f.s_id,count(*) as total,group_concat(f.f_name) as g_name from fruits f group by f.s_id) 这里使用了一个函数group_concat
  • (select f.s_id,count(*) as total,group_concat(f.f_name) as g_name,sum(f.f_price) as price from fruits f group by f.s_id)

HAVING #

  • [在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用]
  • (select f.s_id,count(*) as total,group_concat(f.f_name) as g_name,sum(f.f_price) as price from fruits f group by f.s_id having sum(f.f_price)>20)

合并使用 #

SELECT
	count( project_work_stage_id ) project_work_stage_id,
	count( project_phase_id ) project_phase_id_count,
	sum( actual_hours ) actual_hours_sum,
	AVG( actual_hours ) actual_hours_avg,
	GROUP_CONCAT( id ) ids,
	project_id 
FROM
	tb_project_plan_details 
WHERE
	1 = 1 
GROUP BY
	project_id # 以项目编号分组
HAVING # having的好处是可以把列中查询用作比较
	project_phase_id_count >= 3 # 工作事项数量必须大于等于3
ORDER BY
	project_phase_id_count DESC  #确定最大数
	LIMIT 1;  #确定最大数

分页查询 #

  • (select f.* from fruits f LIMIT 10,5) ||(3-1)*5,5

连接查询(多表) #

  • (select c.,o. from customers c,orders o where c.c_id=o.c_id)普通查询
  • (select c.,o. from customers c inner join orders o on o.c_id=c.c_id)内连接查询,这里需要注意的是内连接查询的是公共部分,必须是两者都有相同的记录
  • 外连接包括左外连接和右外连接
  • (select c.,o. from customers c right join orders o on o.c_id=c.c_id)右连接是orders table和customers table的公共部分+orders表记录
  • (select c.,o. from customers c left join orders o on o.c_id=c.c_id)左连接是orders table和customers table的公共部分+customers表记录
  • (由于mysql不支持全连接full join,所以必须采用其它方法)//select * from orders full join customers on orders.c_id=customers.c_id

索引 #

create table myUser(
  id VARCHAR(255) NOT NULL PRIMARY KEY ,
  name VARCHAR(255),
  createTime TIMESTAMP,
  INDEX indexName (name(244))
)ENGINE=InnoDB DEFAULT CHARSET=utf8
  • (show INDEX from myUser)查看所在表的索引
DROP TABLE IF EXISTS user_test;
CREATE TABLE user_test(
 id int AUTO_INCREMENT PRIMARY KEY,
 user_name varchar(30) NOT NULL,
 sex bit(1) NOT NULL DEFAULT b'1',
 city varchar(50) NOT NULL,
 age int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 创建一个组合索引: ALTER TABLE user_test ADD INDEX idx_user(user_name , city , age) 匹配最左前缀是指优先匹配最左索引列,如:上面创建的索引可用于查询条件为:(user_name )、(user_name, city)、(user_name , city , age)

注:满足最左前缀查询条件的顺序与索引列的顺序无关,如:(city, user_name)、(age, city, user_name)