mysql sql 语句学习笔记

1、 sql语句中,数据字典的使用,获取数据库表中的字段结构相关信息

Db.find("select  TABLE_NAME(表名),

COLUMN_NAME(列名),ORDINAL_POSITION(在表中列的排序),IS_NULLABLE(是否可以为空),

DATA_TYPE(字段存放的数据类型),CHARACTER_MAXIMUM_LENGTH(字符类型时,最大长度),

NUMERIC_PRECISION(数字类型时,精确度),NUMERIC_SCALE,COLUMN_TYPE(列类型),

COLUMN_KEY,

COLUMN_COMMENT(字段备注comment)

 from information_schema.columns a" +
        " where a.TABLE_SCHEMA='数据库名' " +
        " and a.TABLE_NAME=? order by a.ordinal_position ",数据库中要了解的表名);


2、使用UUID 作用为表的主键时,动态添加数据,其中,uid是通过Java中UUID方法获取到的全球(目前认为是)唯一的不会出现相同的值

insert into 表名(UID,uName,uPwd)
values(replace(UUID(),'-',''),"欢笑","321");


3、mysql中去重 distinct 用法

在看到如下代码时,想要深入学习一下,

select count(distinct to_id) sl from b_l_chat a\n" +
        "where a.FROM_TYPE='W'\n" +
        "and a.FROM_ID = ?",did);
以上语句就是做了两个表的连接查询,同时,去除表中to_id重复的值,distinct的用法就出来了

在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user:

用distinct来返回不重复的用户名:select distinct name from user;,结果为:

这样只把不重复的用户名查询出来了,但是用户的id,并没有被查询出来:select distinct name,id from user;,这样的结果为:

distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。

所以一般distinct用来查询不重复记录的条数。

如果要查询不重复的记录,有时候可以用group by :

select id,name from user group by name;

4、为了防止查询的数据库中字段为空,可以使用ifnull(名称,默认值)的形式进行处理

select ifnull(pt,0) pt from b_medical_worker a where a.UID = ?",did);

5、下面一句是为了查询一某医生值班时其所在医院中当天,当天患者的总数

具体为b_shedual表中有患者id  医院id  排班时段id

b_medical_worker中为医生作为医护人员的表,有医生id和其所在的医院id

Record d = Db.findFirst("select count(*) sl from b_schedual a\n" +
        "where a.HOS_ID = (select hos_id from b_medical_worker where UID = ?)",uid
nid);

6、mysql中按照日期分组查询单表所有数据,并统计每天的数据量,欲达到如下效果

mysql sql 语句学习笔记_第1张图片

开始时,没有使用时间格式化函数,查出来的数据一直显示是一条排列,后在查询资料的途中,突然意识到所有的都是一个,是因为数据库中我查找的时间字段精确到了秒,而秒是不一样的


SELECT t.* ,DATE_FORMAT(t.S_DATE,'%Y-%m-%d' ),
COUNT(*)
FROM b_schedual t 
WHERE 1=1  
GROUP BY DATE_FORMAT(t.S_DATE ,'%Y-%m-%d');

(注:t.* 表示我要查询所有列,date_format() 为格式化时间的函数,  t.S_DATE 是我要操作的表“b_shedual”中表示时间的字段,%Y-%m-%d  表示将日期格式化到日,%Y-%m-%d-%H  表示将时间格式化到小时,以此类推  

最终结果为

mysql sql 语句学习笔记_第2张图片

7、mysql,怎么根据一个时间段,然后查询出这个时间段的全部时间??
drop procedure if exists test;
create procedure test(in start datetime)
begin
drop table if exists tmp;
create TEMPORARY table tmp (date datetime);
set @stop=date_add(start,INTERVAL -7 day);
while start >= @stop DO
insert into tmp values(start);
set start=date_add(start,interval -1 day);
end while;
select * from tmp;
end;

这个是需要循环的,以上帮你写了一个存储过程,创建后,执行call test('2016-01-08'),可以帮你列出你所需的答案。
追问
参数 2个 ,一个stat 一个end ,也就是 这两个时间 是输入的不是固定的
追答
不是固定的,通过你执行call的时候会根据你输入的值来进行计算,如果你想查询显示30天的,可以将‘INTERVAL -7’修改为‘INTERVAL -30’
8、

mysql中如何先查询出某个字段的条数,然后再根据这个条数大小进行排序,查询显示出该表中所有字段

mysql中如何先查询出某个字段的条数,然后再根据这个条数大小进行排序,查询显示出该表中所有字段
比如
id name age
1 zhang 20
2 li 10
3 wang 20
4 chen 20
5 zhao 18

如上表 将年龄分组 某个年龄段最多的排在前面,依次排列下去?
1
2
3
4
5
6
7
8
9
10
11
SELECT
     COUNT ( DISTINCT  user_id) user_count,
     CASE
     WHEN  age <= 10  THEN  '0-10'
     WHEN  age > 10  AND  age <= 20  THEN  '10-20'
     WHEN  age > 20  AND  age < 30  THEN  '10-30'
     END  AS  `age
FROM
     tableName
GROUP  BY  age
ORDER  BY  age  desc

9、在下面的计算某天在一周 一个月 一年的第几天时,特别注意一个问题:

weekday(date)  中的date  格式好像有一定的要求,据其他资料说是必须是datetime 格式和某格式才行,

开始时我因为之前的语句需要用到date_format(表名.createDate,'%Y-%M-%d'),

复制粘贴过来的,所以刚开始时我写的是weekday(date_format(表名.createDate,'%Y-%M-%d'))weekDay,

结果在搜索结果中字段 weekDay 总是为空,当我将语句改为weekday(表名.createDate)时结果出来了!!!!


   3. MySQL dayof... 函数:dayofweek(), dayofmonth(), dayofyear()
分别返回日期参数,在一周、一月、一年中的位置。
set @dt = '2008-08-08';

select dayofweek(@dt); -- 6
select dayofmonth(@dt); -- 8
select dayofyear(@dt); -- 221

日期 '2008-08-08' 是一周中的第 6 天(1 = Sunday, 2 = Monday, ..., 7 = Saturday);一月中的第 8 天;一年中的第 221 天。
4. MySQL week... 函数:week(), weekofyear(), da
select 
(@i:=@i+1) i,
D.*
FROM
(
	select
a.patient_id,a.dt,
	/*周数*/ 
	weekofyear(a.dt) weeks, 
	/*周开始日期*/ 
	adddate(CONCAT(DATE_FORMAT(a.dt,'%Y'),'0101'),(weekofyear(a.dt)-1)*7) week_st, 
	/*周结束日期*/ 
	adddate(CONCAT(DATE_FORMAT(a.dt,'%Y'),'0101'),weekofyear(a.dt)*7-1) week_ed, 
	/*是否有预警*/ 
	count(b.UID) sl 
	FROM
 (SELECT @i:=0) as i,
( 
	select a.PATIENT_ID,DATE_FORMAT(a.rec_time,'%Y-%m-%d') dt from b_peritoneal_dialysis_diary a 
	left join b_peritoneal_dialysis_record_main b 
	on (a.PATIENT_ID = b.PATIENT_ID 
	and DATE_FORMAT(a.rec_time,'%Y-%m-%d') = DATE_FORMAT(b.rec_time,'%Y-%m-%d')) 
	union  
	select a.PATIENT_ID,DATE_FORMAT(a.rec_time,'%Y-%m-%d') dt from b_peritoneal_dialysis_diary a 
	right join b_peritoneal_dialysis_record_main b 
	on (a.PATIENT_ID = b.PATIENT_ID 
	and DATE_FORMAT(a.rec_time,'%Y-%m-%d') = DATE_FORMAT(b.rec_time,'%Y-%m-%d')) 
	) a left join b_alert b 
	on(a.PATIENT_ID = B.P_UID AND A.DT = DATE_FORMAT(b.ALERT_TIME,'%Y-%m-%d')) 
	where a.PATIENT_ID='drug1'

	group by a.patient_id,weeks
)D
order by i DESC;

yofweek(), weekday(), yearweek()
set @dt = '2008-08-08';

select week(@dt); -- 31
select week(@dt,3); -- 32
select weekofyear(@dt); -- 32

select dayofweek(@dt); -- 6
select weekday(@dt); -- 4

select yearweek(@dt); -- 200831

MySQL week() 函数,可以有两个参数,具体可看手册。 weekofyear() 和 week() 一样,都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。
MySQL weekday() 函数和 dayofweek() 类似,都是返回“某天”在一周中的位置。不同点在于参考的标准, weekday:(0 = Monday, 1 = Tuesday, ..., 6 = Sunday); dayofweek:(1 = Sunday, 2 = Monday, ..., 7 = Saturday)
MySQL yearweek() 函数,返回 year(2008) + week 位置(31)。
 
    
10、 工作中为了实现如下效果,需要用到为MySQL数据查询结果添加自增字段,且需要获取查询表所在结果的一个日期所在周的一周的开始日期和结束日期,因为需要为查询结果定位,所以还需要对周数进行打标记符 

mysql sql 语句学习笔记_第3张图片

select 
(@i:=@i+1) i,
D.*
FROM
(
	select
a.patient_id,a.dt,
	/*周数*/ 
	weekofyear(a.dt) weeks, 
	/*周开始日期*/ 
	adddate(CONCAT(DATE_FORMAT(a.dt,'%Y'),'0101'),(weekofyear(a.dt)-1)*7) week_st, 
	/*周结束日期*/ 
	adddate(CONCAT(DATE_FORMAT(a.dt,'%Y'),'0101'),weekofyear(a.dt)*7-1) week_ed, 
	/*是否有预警*/ 
	count(b.UID) sl 
	FROM
 (SELECT @i:=0) as i,
( 
	select a.PATIENT_ID,DATE_FORMAT(a.rec_time,'%Y-%m-%d') dt from b_peritoneal_dialysis_diary a 
	left join b_peritoneal_dialysis_record_main b 
	on (a.PATIENT_ID = b.PATIENT_ID 
	and DATE_FORMAT(a.rec_time,'%Y-%m-%d') = DATE_FORMAT(b.rec_time,'%Y-%m-%d')) 
	union  
	select a.PATIENT_ID,DATE_FORMAT(a.rec_time,'%Y-%m-%d') dt from b_peritoneal_dialysis_diary a 
	right join b_peritoneal_dialysis_record_main b 
	on (a.PATIENT_ID = b.PATIENT_ID 
	and DATE_FORMAT(a.rec_time,'%Y-%m-%d') = DATE_FORMAT(b.rec_time,'%Y-%m-%d')) 
	) a left join b_alert b 
	on(a.PATIENT_ID = B.P_UID AND A.DT = DATE_FORMAT(b.ALERT_TIME,'%Y-%m-%d')) 
	where a.PATIENT_ID='drug1'

	group by a.patient_id,weeks
)D
order by i DESC;
11 今天想要在MySQL中查询某一天所在的一周的数据。原来想着直接用一个MySQL函数搞定,结果发现,有好多问题存在。
先解释一下,我是要随意根据某个日期,去查询它所在周的一周的数据,刚开始从网上查到的资料中,大部分显示如下,却不合我意
方法一:
7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名),

方法三

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 1 week ) <= date(时间字段名),

方法二:

查询一周内数据

 select * from Tabel名 where 时间字段名 between current_date()-7  and  sysdate()

因为通过实际操作,发现这个方法,结果是,在你查询到的所有记录中,将模拟输入的某个日期,开始加七天的所有数据,比如,我的操作是
SELECT * FROM 表名 where DATE_SUB('2017-12-01', INTERVAL 7 DAY) <= date(时间字段名),
结果,查询到的数据是所有的数据,数据跨越好几周!!!!!

mysql sql 语句学习笔记_第4张图片

经过多方查找,加上思考,本来想着只是通过提供一周的开始日期或者该周的周末日期,查询出该周当周七天的数据,而不是,随意的将查询到的全部数据(跨越好几周甚至一个月)的数据查出来,查询七天的数据量

改变思路,决定通过两个日期来控制,就是通过某一周的周一  和 周日两个日期,去查询这两个日期之间的所有数据
最后是这个样子
select * from  表名  where   
DATE_FORMAT( 时间字段名 ,'%Y-%m-%d')>=2017-11-28   and  DATE_FORMAT( 时间字段名 ,'%Y-%m-%d') <'2017-12-03'

注:2017-11-28是本周开始日期   2017-12-03 是本周的周末日期
mysql sql 语句学习笔记_第5张图片

由此终于解决问题



你可能感兴趣的:(sql)