DQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DQL相关的知识,希望对你有一定的参考价值。

DQL (Date Query Language)查询

语法

SELECT   [ALL | DISTINCT]

{*|table.*|[table.field1 [as alias1][table.field2[as alias2]][, …]]}
FROM  table_name [as table_ alias  ]
[left|out|inner join table_name2]#联合查询
[where.....]    #指定结果需要满足的条件
[group by...]    #指定分组按照哪几个字段来分组
[having....]    #过滤分组的记录必须满足的次要条件
[order by...]    #指定查询记录按一个或多个条件排序
[limit{[offset]row_count | row_count }]; #指定查询的记录从哪条至哪条
[]  代表可选
{}    代表必须选



create table Student(
StudentId int primary key not null auto_increment,
StudentName varchar(12) not null,
Phone int (11) not null,
Address varchar(12);
)
基本查询
*查询所有
select * from student;
*查询某列
select StudentName,Phone,Address from student
*查询别名
select studentname sname from student;
select student.gradeid from subject as sub,phone ph
                
DISTINCT关键字
作用:
    去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
语法:
    select distinct 字段名1,字段名2.... from 表名    
注意:
    all 关键字是默认的,返回所有的记录,与之相反
#查询成绩表中的所包含的课程ID
    SELECT DISTINCT SubjectNo FROM result;

#查询过滤重复    

#若查询列中均存在重复则过滤
select distinct phone,address from student;

#查询表达式
select version(),100*3 as sum;
select now() ‘当前时间‘;                
insert into t_tabl(create_time) values(now());
select studentno+studentname as ‘no&name‘ from student;
#concat 拼接字符串
select concat(email+‘@163.com‘) as email from student;

where条件语句
用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成
*逻辑操作符
*比较操作符
select * from subject where classhour between 100 and 120;
select * from subject where classhour >=100  and classhour <= 120;

#查询密码为null的人
select studentname from student where loginwd is not null;(<> null or != null is fual)

关键字                                                       |
AND或&&    aANDb或a&&b    逻辑与,同时为真结果才为真               |
OR或||    aORb或a||b    逻辑或,只要一个为真,则结果为真         |
XOR或^    aXORb    逻辑异或,不同为真,相同为假                  |
NOT或!    NOTa或!a    逻辑非,若操作数为假,结果则为真          |
-------------------------------------------------------------|
ISNULL    aISNULL    若操作符为NULL,则结果为真                     |    
ISNOTNULL    aISNOTNULL    若操作符不为NULL,则结果为真             |
BETWEEN    aBETWEENbANDc    若a范围在b与c之间则结果为真             |
LIKE    aLIKEb    SQL模式匹配,若a匹配b,则结果为真             |
IN    aIN(a1,a2,a3,?.)若a等于a1,a2?中的某一个,则结果为真     |

1、数值数据类型的记录之间才能进行算术运算;
2、相同数据类型的数据之间才能进行比较

in 查询
select 字段1,字段2........ from TableName where 字段x In(值1,值2,值3....)
*查询的字段x的值,至少与括号的的一个值相同  *多个值要用括号隔开

SELECT * FROM subject where ClassHour = 100 OR ClassHour = 110 OR ClassHour=120;     #普通组处理方式

SELECT * FROM subject where ClassHour IN (100,110,120);    #使用IN进行查询方式,更为简洁,效率更高
like 模糊查询(与= 势不两立)
*与“%”一起使用,表示匹配0或任意多个字符(通配符,所有符合的条件)
*与“_”一起使用,表示匹配单个字符(可以添加多个‘_‘)

SELECT * FROM subject WHERE SubjectName LIKE "%数学%"; #查询包含“数学”的所有课程

SELECT  StudentNo,StudentName FROM student  WHERE StudentName LIKE "李__"; #查询所有姓名为“李**”三个字的学生信息

范围内查找
select * from student where gradeid in (1,9);
select * from student where address in(‘sdf‘,‘sdfa‘);


table subject(subjectno,subjectname,classhour,gradeid,subjectno,gradename);
table grade()
 
select * from subject s,grade g where s.gradeid = g.gradeid;
select * from subject sub join grade gra on sub.gradeid = gra.gradeid
inner|left|right| join tablename  on xxxx=yyyyyy #这句可以重复写,连接多个表的
;#跟上句等同

左外连接
以左表为主的表(无论左表有无数据吗,所有数据都会显示出来)


等值和非等值的连接查询
    与单表查询类似,都是SELECT语句
    把多个表放到FROM后,并用逗号隔开
    可使用AS关键字取别名,便于引用
    如无重名查询字段则可省略数据表的指定
示例
    #要求:从subject和grade数据表查询课程名称和所属年级名称


order by 查询
对SELECT语句查询得到的结果,按某些字段进行排序,与DESC或ASC搭配使用,默认为ASC

    #排序
select * from subject order by classhour asc;   <--subject为表名,classhour为字段,asc为升序-->
select * from subject order by classhour,subjectid desc;<--多字段排序,先按第一个字段属性排名,再按第二字段属性排名,比如第一字段有两个90,顺序按第而属性40,50的降序排-->

limit [m,]n  or limit n offset m   
限制SELECT返回结果的行数
m  制定第一个返回记录行的偏移量
n  制定返回记录行的最大数目
注意:
m不指定则偏移量为0,从第一条开始返回前n条记录
limit 常用于分页显示
 
select * from student limit 10;#前10条数据
select * from student order by StudentNo desc limit 10;
select * from student limit 5,9;#从第五条数据开始往后查询9个数据


子查询                              
                                     
select SubjectName,gradeid from Subject where gradeid in (select gradeid from grade)  #多条结果不能用 ‘=‘       
                                         
                                          


聚合函数
COUNT()    |返回满足SELECT条件的记录总和数,如SELECTCOUNT(*)..
SUM()    |返回数字字段或表达式列作统计,返回一列的总和
AVG()    |通常为数值字段或表达列作统计,返回一列的平均值
MAX()    |可以为数值字段、字符字段或表达式列作统计,返回最大的值
MIN()    |可以为数值字段、字符字段或表达式列作统计,返回最小的值

select count(StudentNo) ‘总数据‘ from student;
select sum(字段) ‘总和‘ from subject ;  #某列累加的值
select avg/min/max(字段) ‘平均课时‘/‘最小值‘/‘最大值‘ from tablename;

分组

对student 按照性别分组 group by....
select sex,count(sex) from student group by sex;
自动添加一列计算总格
select sex,count(sex) from student group by sex with rollup;

select group_concat(studentname),count(sex) from student group by sex with rollup;
对student 按照性别分组,其中一组人数大于10的那组having

having 分组后进行筛选

select sex,count(sex) from student group by sex having count(sex) >10 ;


合并
* union 合并相同数据
select * from subject union select * from grade;
* union all 合并所有数据
select * from subject union all select * from grade;  #
    
exit #若科目是4,则可以找出当4科目的其他牵引条件
              
select subjectname,gradeid from subject where not exits/exits(select * from subject where id = 4 )            
            
            
    
    
    
   

以上是关于DQL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的DQL语言(查)

DQL - 获取相关实体

SQL基础笔记

第6讲:SQL语句之DQL类型的数据查询语言

DQL

如何在 Doctrine 2 DQL 中使用 now()?