精华内容
下载资源
问答
  • 文章目录select语句的语法1、select语法简介2、select语法结构3、select执行过程4、select书写格式数据库的简单查询1、查询表中的数据列2、查询满足条件的数据行数据库的分组统计查询1、使用聚合函数查询2、使用分组...

    select语句的语法

    1、select语法简介

    • 数据查询是数据库管理系统中的一个最重要的功能。数据查询不是简单的返回数据库中存储的数据,而是根据用户的不同需求对数据进行筛选、统计,并且以用户需要的格式返回。
    • SQL Server提供了强大、灵活的Select语句,用于实现用户的各种数据查询操作。

    2、select语法结构

    Select <检索内容> [As<别名>] [Into<目标表名>]
    From <源表名>
    [Where<检索条件>]
    [Group by<分类字段>][Having<检索条件>]
    [Order by<排序字段>[Asc|Desc]]
    

    Select:指定要查询的数据列
    Into:创建新表并将查询的结果存到新表当中
    From:指定要查询的数据源,可以是表,也可以是视图
    Where:指定查询条件
    Group by:对查询结果进行分组
    Having:与Group by子句结合使用,指定分组筛选条件
    Order by:对查询结果排序,默认为升序(ASC),降序(Desc)

    3、select执行过程

    • 每个select语句必须有一个from子句,其他字句的顺序非常重要,依次是:where、group by、having、order by。可以省略可选子句,但若使用必须按适当的顺序出现。
      在这里插入图片描述

    4、select书写格式

    • 不区分大小写
    • 可以随意分行
    • 没有语句结束标志

    数据库的简单查询

    • 单表查询是指要检索的信息来自数据库中的某一张表,是最简单的一种查询操作。

    1、查询表中的数据列

    查询所有列:

    • 最简单的select语句是查询表中的所有数据,只需要使用select、from两个关键字即可。
    • 要把表中的所有列以及列数据展示出来,可以先使用符号“*”,它表示所有列。
    格式:
    select * from <表名>
    功能:
    使用select输出表中的所有列及数据
    
    • 实例1:在SCC数据库中,查询student表中的所有学生的详细信息
    Use SCC
    select * from studnet
    

    查询表中指定列:

    • 如果用户只需要获取部分列的数据,只需要将select语句中的“*”换成所需字段的字段列表即可。
    • 若将表中所有列都放在这个列表中,将查询整张表的数据。
    格式:
    select <字段列表> from <表名>
    功能:
    使用select输出表中指定列及列数据
    
    • 实例2: 查询student表中所有学生的学号和姓名
    select sno,sname from student
    

    为结果列使用别名:

    • 查询结果中默认输出列的列标题就是表的列名,输出表达式的列标题为无列名
    • 如果用户觉得该列名不能表达清楚,可对列名设置别名。
    • 设置别名只是设置显示查询结果时的列名,而表中的列名未改变。
    • 实例3: 查询student表中所有学生的学号和姓名,将显示结果加中文别名
    格式1select sno 学号,sname 姓名 from student
    格式2select sno as 学号,sname as 姓名 from student
    格式3select 学号=sno,姓名=sname from student
    

    2、查询满足条件的数据行

    • 若需要查询表中满足条件的数据而不是全部数据,需要在select语句中通过where子句实现。
    格式:
    select <字段列表> from <表名> where <条件表达式>
    功能:
    使用select输出表中满足条件的列及列数据
    

    在这里插入图片描述

    • 实例4:查询student表中所有男生的详细信息
    select * from student where sex='男'
    
    • 实例5:查询score表中有不及格现象的学生信息
    select * from score where uscore<60 or endscore<60
    
    • 实例6:查询course表中数据库类课程的信息,结果显示为课程编号、课程名称、任课教师
    select cno,cname,teacher from course where cname like '%数据库%'
    
    • 实例7:在score表中查询期末有缺考现象的学生信息
    select * from score where endscore is null
    

    数据库的分组统计查询

    1、使用聚合函数查询

    • 在数据库查询时,经常需要对查询结果进行计算或分类汇总,比如,统计人数、计算总分、平均分等,可以利用SQL提供的聚集函数来完成这类查询操作。
    • 常见的聚集函数如下:
      在这里插入图片描述
    • 实例1:查询student表中学生的总人数
    select count(*) from student
    

    【说明:】使用聚集函数列的列标题为默认为“无列名”,为了说明问题,通常需要使用别名。

    • 实例2:查询student表中学生的总人数
    select count(*) 总人数 from student
    
    • 实例3:查询score表中课程c001的期末成绩、平均成绩、最高成绩和最低成绩。
    select sum(endscore),avg(endscore),max(endscore),min(endscore) 
    from score where cno='c001'
    

    2、使用分组查询

    • 若要对查询结果进行分类汇总时,需要使用group by子句。
    • Group by子句将查询结果按某列(或多列)的值分组,值相等的为一组。
    • 若未对查询结果分组,聚集函数将作用于整个查询结果;分组后聚集函数将作用于每一个组。
    • Having子句用于对分组结果进行筛选,通常在Group by子句中使用。
    格式:
    select <字段列表> form <表名>
    [where <查询条件>]
    group by <分类字段> [having <检索条件>]
    
    • 实例4:查询student表中男、女生人数,要求使用中文别名
    select sex 性别,count(*) 人数 from student group by sex
    
    • 实例5:在score表中,查询期末成绩在80分以上的学生的学号和平均成绩
    select sno,avg(endscore) from score
    group by sno having avg(endscore) >= 80
    

    3、查询结果排序

    • 使用select查询获取的数据通常是无序的,可使用Order by子句对查询结果集排序。
    • Order by子句可将查询结果按一个或多个列值的大小顺序输出
    格式:
    select <字段列表> from <表名> [where<查询条件>]
    [group by <分类字段> [having <检索条件>]]
    order by <排序字段> [Asc|Desc]
    功能:
    使用order by 子句对查询结果集的相应列进行排序。Asc关键字表示升序,Desc关键字表示降序。默认情况为Asc
    • 实例6:在score表中,查询每门课的平均成绩,并按照平均成绩降序排列
    select cno,avg(endscore) from score 
    group by cno order by avg(endscore) desc
    

    数据库的内连接查询

    • 数据查询时,用户需要查询的数据有时并不都在一个数据表中,可能涉及到一个以上的表,这是就需要用到多表查询
    • 多表查询是将多个表连接在一起的查询,也称为连接查询
    • 根据查询的需要,连接查询分为内连接外连接

    1、内连接查询简介

    • 内连接查询时将表中的一些记录按照一定的条件与其他表的一些记录连接起来,连接条件通常是表间列的相等关系。
    • 在内连接查询中,只有满足条件的元组才能出现在结果集中。
    • 内连接是多表查询的主要方式。
    格式1select <列表字段> from <表名1>,<表名2>
    where <表名1.列名=表名2.列名> [And 条件表达式]
    

    【说明:】
    1、from子句指明进行连接的表名,表明之间实用逗号隔开
    2、where子句指明连接的列名及其连接条件,列名若在表1和表2中都包含,则必须使用“表名.列名”的形式,以示区别。
    3、连接条件即为个表之间的关联,其形式为“表名1.主键=表名2.外键”
    4、如果是有条件的连接查询,则将条件表达式放在连接条件的后面,使用And关键字即可。

    格式2select <列表字段> from <表名1> Inner Join <表名2> on
    <表名1.列名=表名2.列名> 
    [Where 条件表达式]
    

    【说明:】
    Inner Join称为内连接,关键字ON与之对应,以表明连接的条件。

    2、内连接查询操作

    • 实例1:查询所有学生的学号、姓名、课程编号、平时成绩和期末成绩
    select student.sno,sname,cno,uscore,endscore 
    from studet,score
    where student.sno=score.sno
    或者
    select studnet.sno,sname,uscore,endscore
    from student inner join score
    on student.sno=score.sno
    
    • 实例2:查询所有男生的学号、姓名、课程编号、平时成绩、期末成绩
    select student.sno,sname,cno,uscore,endscore 
    from studet,score
    where student.sno=score.sno and sex='男'
    或者
    select studnet.sno,sname,uscore,endscore
    from student inner join score
    on student.sno=score.sno
    where sex='男'
    
    • 实例3:查询所有学生的学号、姓名、课程名、课程成绩
    select student.sno,sname,cname,uscore,endscore 
    from studet,course,score
    where student.sno=score.sno and course.cno=score.cno
    或者
    select student.sno,sname,cname,uscore,endscore 
    from student inner join score
    on student.sno=score.sno
    inner join course on course.cno=score.cno
    
    • 实例4:查询每门课的课程号、课程名及选课人数
    select score.cno,cname,count(*) as num
    from course,score
    where course.cno=score.cno
    group by score.cno,cname
    

    数据库的外连接查询

    • 外连接查询通常用于相连接的表中至少有一个表需要显示所有数据行的情况。
    • 外连接的结果集中不但包含满足连接条件的记录,还包括相应表中的所有记录,即某些记录即使不满足连接条件,但仍需要输出。
    • 外连接主要分为左外连接、右外连接和全外连接。

    1、左外连接查询

    格式:
    select <列表字段> from <表名1> Left [Outer] Join <表名2>
    on <表名1.列名=表名2.列名>
    

    【说明:】
    1、左外连接的结果集中包括了左表的所有记录,而不仅是满足连接条件的记录,即将位于Left Join关键字左侧表的所有行都输出。
    2、如果右表的某条记录在左表中没有匹配行,此时右表的数据行显示为NULL

    • 实例1:查询所有学生的选修课程情况,结果显示为学号、姓名、课程编号和课程成绩
    1、使用内连接,只显示有选课记录的学生信息
    select student.sno,sname,score.cno,uscore,edscore
    from student inner join score on student.sno=score.sno
    2、使用左外连接,显示所有学生的信息,没有选课的学生,其成绩列显示为NULL
    select student.sno,sname,score.cno,uscore,endscore
    from student left join score on studnet.sno=score.sno 
    

    2、右外连接查询

    格式:
    select <列表字段> from <表名1> Right[Outer] Join <表名2>
    on <表名1.列名=表名2.列名>
    

    【说明:】
    1、右外连接的结果集中将位于Right Join关键字右侧表的所有行都输出
    2、如果左表的某条记录在右表中没有匹配行,此时左表的数据行显示为NULL

    • 实例2:查询所有学生的选修课程情况,结果显示为课程号、课程名和课程成绩
    1、使用内连接,只显示有选课记录的学生信息
    select course.cno,cname,uscore,endscore
    from score inner join course on score.cno=course.cno
    2、使用右外连接,显示所有学生的信息,没有选课的学生,其成绩列显示为NULL
    select course.cno,cname,uscore,endscore
    from student right join course on score.sno=course.cno
    

    3、全外连接查询

    格式:
    select <列表字段> from <表名1> Full Join <表名2>
    on <表名1.列名=表名2.列名>
    

    【说明:】
    1、全外连接的结果集中包括了左表和右表的所有记录
    2、当某条记录在另一表中没有匹配记录时,则该表的相应列值为NULL

    • 实例3:将课程表course和成绩表score进行内连接和全外连接比较
    1、使用内连接,只显示有选课记录的学生信息,为便于查看,使用了order by子句
    select course*,score.* 
    from course inner join score on score.cno=course.cno order by cname
    2、使用全外连接,显示两个表中的所有记录行,没有学生选课的课程,相应列显示为NULL
    select course*,score.* 
    from course full join score on score.sno=course.cno order by cname
    

    子查询

    • SQL子查询又称为嵌套查询,是指在一个嘻哈寻语句中又包含另一个查询的情况,其一般格式如图。子查询块必须是单表查询,然后通过相同的字段与其他查询进行联系。
    select <目标列> from <单个目标表或视图>
    where <字段> in (
    select <目标列> from <单个目标表或视图>
    where <条件>
    )
    

    1、数据库子查询的基本形式

    • 带in谓词的子查询
    • 带Any或All谓词的子查询
    • 带exists谓词的子查询

    2、数据库的子查询

    • 在嵌套查询中,子查询的结果往往是一个集合,in子查询用于判断一个给定值是否在子查询结果集中,其语法格式为:
    父查询 [NOT] IN (子查询)
    
    • 例题1:查询选修了3门及以上的课的学生的姓名
    select sname from student where sno in (
    	select sno from score group by sno having count(*)>=3
    )
    
    • 例题2:查询选修“数据库应用”课程的学生的姓名
    select sname from student where sno in(
    	select sno form score where cno in(
    		select cno from course where cname='数据库应用'
    	)
    )
    

    视图

    1、视图概述

    • 视图是有基于一个或多个表(或视图)上的一个查询所生成的虚拟表,其中不包含任何数据,只是保存着该查询的定义。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)和删除。
    • 作用:简化用户操作,使用户关注自己感兴趣的数据
    • 优点:1、方便用户使用;2、提供一定的数据安全性

    2、创建视图

    • 创建视图的基本语法结构如图所示:
      在这里插入图片描述
    • 视图名后面的属性列可全部省略,隐含该视图子查询中select子句目标列中的字段组成。
    • 下面情况属性列不能够省略:
    • 1、子查询目标列you聚集函数或列表达式
    • 2、子查询为多表查询,并且选出来几个同名列作为视图的字段
    • 3、需要在视图中为某个列使用别名
    • 例题:创建性别为“女生”的学生视图,并要求对试图进行更新时保证该视图只有性别为“女生”的学生。
    create view is_student as
    select * from Student where sex='女' with check option
    

    索引

    1、索引概述

    • 索引是对数据库表中的一个或多个列的值进行排序的结构,索引是依赖于表建立的,它提供了数据库中编排表中数据的内部方法。
    • 索引的优缺点:
      优点:
    • 1、索引能提高查询表内数据的速度
    • 2、能加快表与表之间的连接速度
      缺点:
    • 1、创建和维护索引增加了额外的时间开销
    • 2、索引会占用一定的存储空间,占用空间过大会影响数据库的性能
    • 索引的分类:
      根据索引页的顺序与数据页中行的物理存储顺序是否相同,可以把索引分为聚集索引非聚集索引

    在这里插入图片描述

    2、创建索引

    • 创建索引的基本原则:
    • 1、定义有主键或外键的数据列一定要建立索引
    • 2、对于经常查询的数据列最好建立索引
    • 3、对于需要在指定范围内快速或频繁查询的数据列最好建立索引
    • 4、经常使用在where子句中的数据列最好建立索引
    • 创建索引的基本语法格式为:
      在这里插入图片描述
    • 例题:利用SQL语句,在student表中创建一个基于姓名的简单非聚集索引,设索引名为stu_name
    create index stu_name on student(sname)
    

    3、修改索引

    • 例题:利用资源管理器查看、修改、删除创建的stu_name索引:

    在这里插入图片描述

    展开全文
  • 今天在写一个人事系统时,碰到过这样的问题,按出生日期分类统计每个年代的员工人数,经过一番思考,今天总算把语句写出来了,特发布出来,供大家参考,如果有更好的方法,都可以提出来。 有一个人员信息表HR...

      今天在写一个人事系统时,碰到过这样的问题,按出生日期分类统计每个年代的员工人数,经过一番思考,今天总算把语句写出来了,特发布出来,供大家参考,如果有更好的方法,都可以提出来。
      有一个人员信息表HREmployee,其中有两个字段:strWorkNo为员工编号,dtBirthDay为出生日期,现要按出生日期分类统计出每个年代的员工人数,即按(1940-1-1~1949-12-31,1950-1-1~1959-12-31,……)来分类统计,我写出的语句如下:

    None.gifSELECT COUNT(strWorkNo) CountPer, YearFirst FROM (
    None.gif
    SELECT strWorkNo,'YearFirst' = CASE WHEN dtBirthday Between CAST((YEAR(dtBirthday)/10as varchar(4))+'0-1-1'
    None.gif    
    and CAST((YEAR(dtBirthday)/10as varchar(4))+'9-12-31' THEN CAST((YEAR(dtBirthday)/10as varchar(4))+'0'
    None.gif    
    ELSE '0' END
    None.gif
    from HREmployee 
    None.gif) a
    None.gif
    GROUP BY YearFirst


    在Windows 2003 Server+SP1,SQL Server 2005中调试通过。

    转载于:https://www.cnblogs.com/wxmxiaoming/articles/473005.html

    展开全文
  • 在线人数统计

    2015-08-28 15:19:35
    在线人数统计  分类: 系统运维 主要是利用HttpSessionBindingListener接口的对象 当这个对象被绑定到Session中或者从Session中被删除时,更新当前在线的用户名单   1 login.html ...
    
    
    分类: 系统运维

    主要是利用HttpSessionBindingListener接口的对象 当这个对象被绑定到Session中或者从Session中被删除时,更新当前在线的用户名单
     
    1  login.html
    1. <html>
    2.     <head>
    3.         <title>登录页面</title>
    4.     </head>
    5.     <body>
    6.         <form action="online" method="post">
    7.             <table>
    8.                 <tr>
    9.                     <td>请输入用户名:</td>
    10.                     <td><input type="text" name="user"></td>
    11.                 </tr>
    12.                 <tr>
    13.                     <td>请输入密码:</td>
    14.                     <td><input type="password" name="password"></td>
    15.                 </tr>
    16.                 <tr>
    17.                     <td><input type="reset" value="重填"></td>
    18.                     <td><input type="submit" value="登录"></td>
    19.                 </tr>
    20.             </table>
    21.         </form>
    22.     </body>
    23. </html>
     
    2  UserList.java
     
    1. package org.sunxin.ch15.online;

    2. import java.util.Vector;
    3. import java.util.Enumeration;

    4. public class UserList
    5. {
    6.     private static final UserList userList=new UserList();
    7.     private Vector<String> v;
    8.     
    9.     private UserList()
    10.     {
    11.      v=new Vector<String>();
    12.     }

    13.     public static UserList getInstance()
    14.     {
    15.         return userList;
    16.     }
    17.     
    18.     public void addUser(String name)
    19.     {
    20.         if(name!=null)
    21.             v.addElement(name);
    22.     }
    23.     
    24.     public void removeUser(String name)
    25.     {
    26.         if(name!=null)
    27.             v.remove(name);
    28.     }
    29.     
    30.     public Enumeration<String> getUserList()
    31.     {
    32.         return v.elements();
    33.     }
    34.     
    35.     public int getUserCount()
    36.     {
    37.         return v.size();
    38.     }
    39. }

    在这个类的设计上 运用了单例的设计模式

    [1]  UserList是一个单例类 所谓单例类,是指一个类只有一个实例 而且zixing实例化并向整个系统提供这个实例  单例类的一个最重要的特点就是构造方法是私有的 从而避免了外部利用该类的构造方法直接创建多个实例 

    UserList类的对象是用于存储和获取在线用户的列表 而这个用户列表对于所有的页面来说都应该是同一个 所有的类访问的就是同一个userList对象了

    [2]  第八行 定义一个静态的常量 userList 它表示了UserList类的一个对象 在UserList类加载的时候 这个对象就产生了

    [3]  11-14行 声明UserList类的构造方法为private,这个是为了避免在外部使用UserList类的构造方法创建其对象

    [4]  16-19行 定义一个静态的方法 getInstance()  这个方法 返回在类加载时创建的UserList类的对象 因为getInstance() 方法本身是静态的 所以直接可以通过类名来调用、

    [5]  代码的第九行 定义了一个私有的Vector类型的变量 在UserList的构造方法中 对Vector类型的变量v进行了初始化 用于存放String类型的对象 在这个地方没有使用ArrayList  是因为UserList对象可能会被多个线程进行同时访问  因为ArrayList不是同步的 而Vector是同步的 所以采用Vector来保存用户列表

     

    3  User.java

     

    1. package org.sunxin.ch15.online;

    2. import javax.servlet.http.HttpSessionBindingListener;
    3. import javax.servlet.http.HttpSessionBindingEvent;

    4. public class User implements HttpSessionBindingListener
    5. {
    6.     private String name;
    7.     private UserList ul=UserList.getInstance();
    8.     
    9.     public User()
    10.     {
    11.     }
    12.     public User(String name)
    13.     {
    14.         this.name=name;
    15.     }
    16.     public void setName(String name)
    17.     {
    18.         this.name=name;
    19.     }
    20.     public String getName()
    21.     {
    22.         return name;
    23.     }
    24.     public void valueBound(HttpSessionBindingEvent event)
    25.     {
    26.         ul.addUser(name);
    27.     }
    28.     public void valueUnbound(HttpSessionBindingEvent event)
    29.     {
    30.         ul.removeUser(name);
    31.     }
    32. }

    User类实现了HttpSessionBindingListener接口 表示登录的用户

    [1]  第九行 通过UserList类的静态方法 getInstance()得到UserList类的对象

    [2]  26-29行 当User对象加入到Session中时 Servlet容器将调用valueBound()方法 我们将用户的名字保存到用户列表中

    [3]  30-33行 当User对象从Session中被删除时,Servlet容器将调用valueUnbound()方法 我们从用户列表中删除该用户

    4  OnlineUserServlet.java

     

    1. package org.sunxin.ch15.online;

    2. import java.io.IOException;
    3. import java.io.PrintWriter;
    4. import java.util.Enumeration;

    5. import javax.servlet.ServletException;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import javax.servlet.http.HttpSession;

    10. public class OnlineUserServlet extends HttpServlet
    11. {
    12.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
    13.                throws ServletException,IOException
    14.     {
    15.         req.setCharacterEncoding("gb2312");
    16.         String name=req.getParameter("user");
    17.         String pwd=req.getParameter("password");
    18.             
    19.         if(null==name || null==pwd || name.equals("") || pwd.equals(""))
    20.         {
    21.             resp.sendRedirect("login.html");
    22.         }
    23.         else
    24.         {
    25.             HttpSession session=req.getSession();
    26.             User user=(User)session.getAttribute("user");
    27.             if(null==user || !name.equals(user.getName()))
    28.             {
    29.                 user=new User(name);
    30.                 session.setAttribute("user",user);
    31.             }
    32.             
    33.             resp.setContentType("text/html;charset=gb2312");
    34.             PrintWriter out=resp.getWriter();
    35.             
    36.             out.println("欢迎用户"+name+"登录");
    37.             UserList ul=UserList.getInstance();
    38.             out.println("
      当前在线的用户列表:
      "
      );
    39.             Enumeration<String> enums=ul.getUserList();
    40.             int i=0;
    41.             while(enums.hasMoreElements())
    42.             {
    43.                 out.println(enums.nextElement());
    44.                 out.println("    ");
    45.                 if(++i==10)
    46.                 {
    47.                     out.println("
      "
      );
    48.                 }
    49.             }
    50.             out.println("
      当前在线的用户数:"
      +i);
    51.             out.println("

      退出登录");

    52.             out.close();
    53.         }
    54.     }
    55.     
    56.     public void doPost(HttpServletRequest req, HttpServletResponse resp)
    57.                throws ServletException,IOException
    58.     {
    59.         doGet(req,resp);
    60.     }
    61. }

    用于向用户显示欢迎信息 当前在线人数列表和在线用户数

    [1]  代码的第24-29行 首先从Session中获取名为user的属性对象 通过判断它是否为空来判断在此次对话中用户是否已经登录   如果user对象不为null 那么接着判断在同一个会话中 用户是否更换了一个用户名登录 如果user对象为空或者当前登录的用户名和先前登录的用户名不同 则以当前登录的用户名创建一个User对象 将这个对象绑定到Session 这个时候  Servlet容器就会调用User对象的valueBound()方法 将这个用户的名字保存在用户列表中

    [2]  35行 得到UserList类的对象

    [3]  37行 得到用户列表的枚举对象

    [4]  39-47行 循环取出在线用户的名字并输出 一旦输出超过10个用户名 就输出一个换行

    [5]  48行 输出当前在线的用户数

     

    5  LogoutServlet.java

     

    1. package org.sunxin.ch15.online;

    2. import java.io.IOException;
    3. import java.io.PrintWriter;

    4. import javax.servlet.ServletException;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import javax.servlet.http.HttpSession;

    9. public class LogoutServlet extends HttpServlet
    10. {
    11.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
    12.                throws ServletException,IOException
    13.     {
    14.         resp.setContentType("text/html;charset=gb2312");
    15.         
    16.         HttpSession session=req.getSession();
    17.         User user=(User)session.getAttribute("user");
    18.         session.invalidate();
    19.         
    20.         PrintWriter out=resp.getWriter();
    21.         out.println("");
    22.         out.println(user.getName()+",你已退出登录
      "
      );
    23.         out.println("重新登录");
    24.         out.println(" ");
    25.         out.close();
    26.     }
    27. }

    代码第16行 调用HttpSession对象的invalidate()方法 使session失效 从而删除绑定到这个Session中的User对象 Servlet容器就会调用这个User对象的valueUnbound()方法 从用户列表中删除该用户

     

     原文:http://blog.chinaunix.net/uid-26284395-id-3040474.html?bsh_bid=409601823

    展开全文
  • 2,索引的分类 1,普通索引 最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,字段的值可以为空也可以重复。 2,主键索引 给主键字段添加的索引、 主键特点:唯一且非空 3,...

    1,索引的概念

    是数据库对象,实现数据库的快速查询

    使用索引的原因:实现数据库的快速查询,提高查询速度

    2,索引的分类

    
    1,普通索引
    		最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,字段的值可以为空也可以重复。
    
    2,主键索引
    		给主键字段添加的索引、
    		主键特点:唯一且非空
    
    3,唯一索引
    		给唯一字段添加的索引
    				唯一索引和主键索引的区别:
    				唯一索引:只有唯一,可以有空值
    				主键索引:唯一且非空
    				
    4,全文索引
    		适用于给一大串文本添加的索引,只可以给字符串数据类型添加
    		字符串数据类型(char varchar text)
    		
    5,空间索引
    		字段的数据类型只能是空间数据类型,且改字段的值必须为 非空 not null
    		空间数据类型 geometry point linestring polygon
    		
    6,复合索引
    		给多个字段添加的索引
    		注意:如果使用了复合索引,查询条件中只有使用了第一个字段,该索引才会被触发
    		例如(id name)只有查询条件中使用了id字段,索引才会被使用
    		如果查询条件只有name字段,则索引不会被触发
    

    3,创建索引

    1,自动创建索引
    	在创建表的时候,给表添加了主键和唯一约束时,数据库给自动的给主键约束和唯一约束创建对应的主键索引和唯一索引
    			create table index_student(
    			sno int(8) primary key auto_increment,
    			sname varchar(4) unique,
    			age int(2)
    			);
    	查询表中的索引语法为:show index from 表名
    	show index from index_student;
    	
    2,手动创建索引
    
    		a,创建表时创建索引
    		
    		
    				1,创建普通索引、
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);
    				create table index_student(
    				sno int(8),
    				sname varchar(20),
    				age int(2),
    				index (sno)
    				);
    				show index from index_student;
    
    		
    				2,唯一索引的创建
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						unique index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);
    									create table index_student(
    									sno int(8),
    									sname varchar(20),
    									age int(2),
    									unique index (sno)
    									);
    									show index from index_student;
    
    
    				3,创建主键索引
    						create table表名(
    						字段名1 字段类型1,
    						....,
    						primary index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);				
    									create table index_student(
    									sno int(8),
    									sname varchar(20),
    									age int(2),
    									primary key (sno)
    									);
    									show index from index_student;
    
    
    
    				4,创建全文索引、只有:只能给字符串数据类型添加
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						fulltext index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);		
    								
    										create table index_student(
    										sno int(8),
    										sname varchar(20),
    										age int(2),
    										sinfo varchar(200),
    										fulltext key (sinfo)
    										);
    										show index from index_student;		
    
    
    
    				5,创建复合索引
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						index|key [索引名] [索引类型] (字段名1[(长度)] [asc|desc], 字段名2[(长度)] [asc|desc], 字段名3[(长度)] [asc|desc])
    						);		
    						
    								---创建表index_student,给sno 和 sname 添加复合索引
    								create table index_student(
    								sno int(8),
    								sname varchar(20),
    								age int(2),
    								sinfo varchar(200),
    								index (sno,sname)
    								);
    
    								show index from index_student;						
    
    
    				6,创建空间索引
    				注意:只能给空间数据类型添加,且该字段的值不能为空 not null
    						create table 表名(
    						字段名1 字段类型1,
    						....,
    						spatial index|key [索引名] [索引类型] (字段名[(长度)] [asc|desc])
    						);	
    						
    							---创建表index_student,给sloc字段(是point字段类型)添加空间索引
    							create table index_student(
    							sno int(8),
    							sname varchar(20),
    							age int(2),
    							sinfo varchar(200),
    							sloc point not null,
    							spatial index (sloc)
    							);
    							
    							show index from index_student;
    
    				
    		b,创建表后使用“create index ”创建索引
    		create [ unique|fulltext|spatial ] index 索引名称 [索引的类型] on 表名 (字段名1[(长度)] [asc|desc], 字段名2[(长度)] [asc|desc])
    
    		需要注意的是:使用create index这种创建索引的方式不能创建主键索引
    
    		(1),创建普通索引
    						---创建表index_student,给表sno添加普通索引
    						create table index_student(
    						sname varchar(8),
    						sno int(5),
    						age int(2)
    						);
    						create index index_student_sno on index_student (sno);
    						show index from index_student;
    
    
    		(2),创建唯一索引
    						---创建表index_student,给表sname添加唯一索引
    						create table index_student(
    						sname varchar(8),
    						sno int(5),
    						age int(2)
    						);
    						create unique index index_student_sname on index_student (sname);
    						show index from index_student;
    
    
    		(3),创建全文索引 fulltext
    					---创建表index_student,给表sinfo添加全文索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2),
    					sinfo varchar(200)
    					);
    					create fulltext index index_student_sinfo on index_student (sinfo);
    					show index from index_student;
    		
    
    		(4),创建空间索引
    					---创建表index_student,给表sloc添加空间索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2),
    					sloc point not null
    					);
    					create spatial index index_student_sloc on index_student (sloc);
    					show index from index_student;
    
    
    		(5),创建复合索引
    					---创建表index_student,给表sno和sname添加复合索引
    					create table index_student(
    					sname varchar(8),
    					sno int(5),
    					age int(2)
    					);
    					create index index_student_sno_sname on index_student (sno, sname);
    					show index from index_student;	
    
    
    c,给已有表添加索引“alter table”
    		
    		(1)添加普通索引
    		语法为:alter table 表名 add index|key [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sno添加普通索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add index (sno)
    				show index from index_student;
    
    
    		(2)添加唯一索引
    		语法为:alter table 表名 add unique [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sname添加唯一索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add unique index (sname);
    				show index from index_student;
    
    
    		(3)添加主键索引
    		语法为:alter table 表名 add primary key [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sno添加主键索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add primary key (sno);
    				show index from index_student;
    		
    		
    		(4)添加全文索引
    		语法为:alter table 表名 add fulltext [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sinfo添加全文索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2),
    				sinfo varchar(200)
    				);
    				alter table index_student add fulltext index(sinfo);
    				show index from index_student;		
    
    
    		(5)添加空间索引
    		语法为:alter table 表名 add spatial [index|key] [索引名] [索引类型] (字段名 [长度] [asc | desc])
    				---创建表index_student,给表sloc添加空间索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2),
    				sloc point not null
    				);
    				alter table index_student add spatial index (sloc);
    				show index from index_student;		
    
    
    		(6)添加复合索引
    		语法为:alter table 表名 add index|key [索引名] [索引类型] (字段名1 [长度] [asc | desc], 字段名2 [长度] [asc | desc])
    				---创建表index_student,给表sno和sname添加复合索引
    				create table index_student(
    				sname varchar(8),
    				sno int(5),
    				age int(2)
    				);
    				alter table index_student add index (sno,sname);
    				show index from index_student;	
    
    

    4,删除索引

    1,使用alter table 删除
    		语法为alter table 表名 drop index|key 索引名称
    		alter table index_student drop index sno;
    		
    2,使用drop index 删除
    		语法为drop index 索引名称 on 表名
    		
    注意:使用alter table 方式不能删除主键索引
      删除主键索引的方式为:
      a,	alter table 表名 drop primary key
      b,	使用drop index进行删除
    

    5,数据的插入

    (1)为所有字段插入数据
    		语法为:insert [into] 表名 [(字段名1,字段名2,字段名3,....)] values|value (值1,值2,值3....)
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---为表中所有字段插入数据
    				insert into student (sno,sname,age,sex,email) values (1,"张三", 20, "男", "zhangsan@163.com");
    				
    				---另一种写法表后面不写字段名,则插入值的顺序要与表结构相同
    				insert into student values (2,"李四", 21, "女", "lisi@163.com");
    				---查询表student中的数据
    				select * from student;
    
    
    
    (2)为指定字段插入数据
    		语法为:insert [into] 表名 (字段名1,字段名2,字段名3,....) values|value (值1,值2,值3....)
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---给表中sname和age插入数据
    				insert into student (sname,age) values ("王五", 18);
    				
    				---查询表student中的数据
    				select * from student;
    
    
    (3)使用SET方式插入数据
    		语法为:insert into 表名 set 字段名1=字段值1,字段名2=字段值2,....;
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				---使用set方式给表中所有字段插入数据
    				insert into student set sno=4,sname="皮皮",age=17,sex="男",email="pipi@16.com";
    				
    				---使用set方式给指定的字段插入数据
    				insert into student set sname="彬彬",age=2,email="binbin@163.com";
    				
    				---查询表student中的数据
    				select * from student;
    				
    
    (4)同时插入多条数据
    		语法为:insert [into] 表名 [(字段名1,字段名2,字段名3,....)] values|value (值1,值2,值3....),(值1,值2,值3....),....;
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---给所有字段插入多条数据
    				insert into student (sno,sname,age,sex,email) 
    				values (6,"小红",15,"女","xiaohong@163.com"),(7,"小二",17,"男","xiaoer@163.com");
    				
    				---给指定字段插入多条数据
    				insert into student (sname,age,email) 
    				values ("小花",14,"xiaohua@163.com"),("小强",11,"xiaoqiang@163.com");
    				
    				---查询表student中的数据
    				select * from student;
    
    
    
    (5)插入查询结果
    		语法为:insert [into] 表名 (字段名1,字段名2,字段名3,....) select 字段名1,字段名2,字段名3.....from 表 where 条件;
    		注意:插入表的字段和查询的字段个数和类型要保持一致
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---创建t_student表
    				create table t_student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "女",
    				email varchar(20) unique
    				);
    				
    				---将student表中的数据查询结果插入到t_student表中
    				insert into t_student select * from student;
    				
    				select * from t_student;
    
    

    6,数据的更新

    1,更新指定数据
    		语法为:update 表名 set 字段名1=值1[,字段名2=值2,....] where 条件
    		
    				---创建一张表student(sno主键 自动增长 sname 非空 age sex默认男 email唯一)
    				create table student(
    				sno int(8) primary key auto_increment,
    				sname varchar(20) not null,
    				age int(8),
    				sex varchar(1) default "男",
    				email varchar(20) unique
    				);
    				
    				---更新指定数据
    				update student set sname="张老大" where sname="张三";
    				select * from student;
    				
    
    2,更新全部数据
    		语法为:update 表名 set 字段名1=值1[,字段名2=值2,....] 
    
    				---更新全部数据 将表中年龄都修改为18
    				update student set age=18;
    				select * from student;
    

    7,数据的删除

    1,删除指定数据
    		语法为:delete from 表名 where 条件
    		
    			---删除student表中sno大于2的学生信息
    			delete from student where sno>2;
    
    
    2,删除全部数据
    		语法为:delete from 表名 where 条件
    		
    				---删除student表的全部数据
    				delete from student;
    
    
    3,truncate关键字删除数据
    		语法为:truncate 表名
    
    4,truncate与delete删除全部记录的区别:
    
    		a,delete是数据操纵语言DML 而truncate是数据定义语言DDL
    		
    		b,delete删除数据是一条一条删除
    			truncate删除数据是保留表结构,直接删除数据,删除后表的状态相当于新表
    			truncate的效率比delete高
    			
    		c,delete删除数据,会显示删除行数
    			truncate不会显示
    			
    		d,删除记录后,再次向表添加数据,自增的值会在原来最大值+1
    			truncate删除记录后,会从1开始自增
    			
    		e,delete操作可以回滚即删除的数据可以恢复
    			truncate操作隐士提交,删除的数据不能恢复
    
    

    8,创建emp表并插入数据以及表的查询

    1,单表查询

    
    
    		用户用不同的方式从数据库中获取自己所需要的数据
    		是数据库操作中非常重要且频繁的操作
    
    ---创建新库test
    ---在test库中创建emp(雇员表)
    emp(雇员编号empno
    		雇员名称ename
    		雇员职位job
    		雇员领导mgr
    		雇员入职日期hiredate
    		雇员月薪sal
    		雇员津贴comm
    		雇员部门编号deptno
    		
    create database test;
    create table emp(
    empno int(4) primary key,
    ename varchar(10),
    job varchar(9),
    mgr int(4),
    hiredate date,
    sal decimal(7,2),
    comm decimal(7,2),
    deptno int(2)
    );
    
    ---同时插入多条数据
    
    insert into emp values
    (7369, 'Smith', 'clerk', 7902, '1980-12-17', 800, null, 20), (7499, 'Allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30), (7521, 'Ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30), (7566, 'Jones', 'manager', 7839, '1981-04-02', 2975, null, 20), (7654, 'Maritn', 'salesman', 7698, '1981-09-28', 1250, 1400, 30), (7698, 'Blake', 'manager', 7839, '1981-05-01', 2850, null, 30), (7782, 'Clark', 'manager', 7839, '1981-06-09', 2450, null, 10), (7788, 'Scott', 'analyst', 7566, '1987-04-19', 3000, null, 20), (7839, 'King', 'president', null, '1981-11-17', 5000, null, 10), (7844, 'Turner', 'salesman', 7698, '1981-09-08', 1500, 0, 30), (7876, 'Adams', 'clerk', 7788, '1987-05-23', 1100, null, 20), (7900, 'James', 'clerk', 7698, '1981-12-03', 950, null, 30), (7902, 'Ford', 'analyst', 7566, '1981-12-03', 3000, null, 20), (7934, 'Miller', 'clerk', 7782, '1982-01-23', 1300, null, 10);
    
    select * from emp;
    
    
    
    2,以上表创建完成之后进行单表查询
    
    	a,查询所有字段
    	语法1为:select 字段名1,字段名2,字段名3,....from 表名
    	语法2为:select * from 表名
    
    	b,查询指定字段
    	语法为:select 字段名1,字段名2,字段名3,....from 表名
    			---查询雇员表中雇员姓名,职位,部门号,薪资
    			select ename,job,deptno,sal from emp;
    
    	c,去重distinct的使用
    	语法为:select distinct 字段名1,字段名2,字段名3,....from 表名	
    			---查询雇员在哪个部门号中
    			select distinct deptno from emp;
    			---查询雇员部门号及职位
    			select distinct deptno,job from emp;
    		注意:distinct使用到多个字段上时,只有多个字段的值都相同时才去重
    
    	
    	d,查询时算术运算符的使用
    	 +   -   *  /(div)   v%(mod)
    			---查询每个雇员的年薪
    			select ename,sal*12 from emp;
    
    	e,给字段起别名
    	语法为:select 字段名1 [as] 别名,字段名2,字段名3,....from 表名;
    			---查询每个雇员的年薪,别名为yearsal
    			select ename,sal*12 as yearsal from emp;
    	注意:如果别名中有空格特殊符号,需要使用单引号括起来
    			---查询每个雇员的年薪,别名为yearsal&年薪 或者别名为 yearsal 年薪
    			select ename,sal*12 as 'yearsal&年薪' from emp;
    			select ename,sal*12 as 'yearsal 年薪' from emp;
    

    2,查询结果排序

    默认升序 asc
    降序 desc
    
    1,在单个字段中排序
    	语法为:select 查询内容 from 表名 order by 字段  asc|desc
    			---查询雇员信息按雇员薪资升序排序
    			select * from emp order by sal asc;
    			---由于默认的排序方式是升序,所以asc可以省略
    			select * from emp order by sal;
    			
    2,在多个字段中使用排序
    	语法为:select 查询内容 from 表名 order by 字段名1  asc|desc,字段名2  asc|desc....
    			---查询雇员信息,先按雇员薪资升序排,如薪资相同则按入职日期降序排序
    			select * from emp order by sal,hiredate desc;
    	注意:排序可以起别名
    			---查询雇员的年薪给年薪起个别名yearsal,按年薪降序排序
    			select ename,sal*12 as yearsal from emp order by yearsal desc;
    

    3,条件查询

    是用户按照一定条件查询,查询满足条件的部分记录
    语法格式:select 查询内容 from 表 where 条件
    
    (1)比较运算符的使用   =    >    <      >=      <=      !=       <>
    			---查询部门号为20的雇员信息
    			select * from emp where deptno=20;
    			---查询薪资大于等于3000的雇员信息
    			select * from emp where sal>=3000;
    			---查询薪资小于3000的雇员名称,薪资,职位
    			select ename,sal,job from emp where sal<3000;
    			---查询名为Smith的雇员信息
    			select * from emp where ename="Smith";
    	注意:MySQL默认不区分大小写,如果要区分大小写则可以使用binary关键字
    			---binary的使用
    			select * from emp where binary ename="Smith";
    			
    (2) [not] between and的使用 
    		可以查询某区间范围的记录
    			---查询薪资在1200-3000之间的雇员信息
    			---between后面是开始值,and后面是结束值,不能颠倒。包括边界
    			select * from emp where sal between 1200 and 3000;
    			---查询薪资不在1200-3000范围之内的雇员姓名,薪资
    			select ename,sal from emp where sal not between 1200 and 3000;
    
    (3)[not] in的使用
    	语法格式为:select 查询内容 from 表名 where 字段名 in(值1,值2,值3,...)
    			---查询雇员姓名是smith,scott,king的雇员信息
    			select * from emp where ename in("smith","scott","king");
    			---查询雇员姓名不是smith,scott,king的雇员信息
    			select * from emp where ename not in("smith","scott","king");
    
    (4)is null 或者 is not null  判断某个字段是否为空
    			---查询雇员中,有津贴的雇员信息
    			select * from emp where comm is not null;
    			---查询雇员中,没有津贴的雇员信息
    			select * from emp where comm is null;
    
    (5)模糊查询
    		可查询以XX开头,以XX结尾,包含XX,第几个是X
    		%:指任意长度的字符
    		_:匹配一个字符
    		语法为:select 查询内容from表名where字段名like
    				---查询雇员姓名以S开头的雇员信息
    				select * from emp where ename like"S%";
    				---查询雇员姓名以S结尾的雇员信息
    				select * from emp where ename like"%S";
    				---查询雇员姓名包含S的雇员信息
    				select * from emp where ename like"%S%";
    				---查询雇员姓名第二个字符是L的雇员信息
    				select * from emp where ename like"_L%";
    				---查询雇员姓名长度是5的雇员信息
    				select * from emp where ename like"_____";
    
    (6)条件中的逻辑运算符
    		and:查询时,只有满足所有条件的记录才会被查询出来
    		select 查询内容from表名where 条件1 and 条件2 and....
    				---查询雇员表中部门号为20 职位是clerk的雇员姓名 部门编号 职位
    				select ename,deptno,job from emp where deptno=20 and job="clerk";
    				---查询部门号为30,薪资在1500-3000之间的雇员信息
    				select * from emp where deptno=30 and sal between 1500 and 3000;
    				
    		or:查询时,只要满足任一条件记录就能被查询出来
    		select 查询内容from表名where 条件1 or 条件2 or....
    				---查询雇员表中部门号为20 或者职位是clerk的雇员姓名 部门编号 职位
    				select ename,deptno,job from emp where deptno=20 or job="clerk";
    
    

    4,分页查询

    select 查询内容 from 表名 where 条件 order by 字段名 asc|desc limit a,b 
    注意:
    	(a代表从哪条记录开始,b代表每页显示的条数) 且默认第一条数据的值为0
    	如果limit与order by 连用的时候,先排序再分页
    		---显示第一页雇员信息 例如每页显示4条
    		select * from emp limit 0,4;
    		---显示第二页雇员信息 每页显示4条
    		select * from emp limit 4,4;
    		---显示第三页雇员信息 每页显示4条
    		select * from emp limit 8,4;
    		---显示第n页雇员信息 每页显示4条
    		select * from emp limit (n-1)*4,4;
    
    

    9,函数的使用

    (1)单行函数

    a,字符函数 
    		(1)concat() 拼接字符串
    			---查询雇员信息,以指定格式输出
    			雇员姓名:XX,薪资:XX,职位:XX,入职日期:XX,年薪:XX,
    			select concat("雇员姓名:",ename,",薪资:",sal,",职位:",job,",入职日期:",hiredate,",年薪:",sal*12) from emp;
    		
    		(2)length()计算字符串的长度
    			---查询雇员姓名长度是5的雇员信息
    			select * from emp where length(ename)=5;
    			
    		(3)lower()  upper()转换大小写
    			---查询雇员姓名 大写的雇员姓名 小写的雇员姓名
    			select ename,lower(ename),upper(ename) from emp;		
    			
    		(4)replace()在指定的字符串中,将某子串替换为新的字符串
    			replace(目标字符串,查找的子串,新字符串)
    				---将helloWord字符串中的hello替换为hi
    				select replace("helloworld","hello","hi") from dual;
    				---另一种写法为
    				select replace("helloworld","hello","hi");
    				
    		(5)substring()截取子串
    			substring(目标字符串,开始位置,长度)  注意开始索引是从1开始的。
    				---截取雇员姓名的前4个字符
    				select substring(ename,1,4) from emp;
    
    
    b,数值函数
    	1,abs()  作用是:取绝对值
    			select(1),(-1);
    
    	2,pi()  作用是:获取圆周率
    			select pi();
    
    	3,mod() 作用是:取余
    			select mod(3,2);
    	
    	5,pow() 作用是:求一个数的n次方
    			select pow(3,2)
    
    	6,ceil() 向上取整  floor()向下取整
    			select ceil(5.43),floor(5.7);
    
    	7,round(num) 代表返回四舍五入的整数
    	round(num,n)返回四舍五入n位小数
    		select round(5.4),round(6.8),round(5.34,1),round(6.789,2);
    		
    	8,truncate(num,n) n的值可以为0,1,2,3,4...其中n为0时代表截取整数
    		select truncate(5.3,0),truncate(5.67,1),truncate(5.789,2);
    	
    	9,rand() 获取浮点类型的随机数,范围是0-1.0。包括0但不包含1
    			select rand(),rand(),rand();
    
    
    c,时间日期函数
    	1,now() 获取SQL执行时当前日期和时间 包括年月日 时分秒
    			select now();
    
    	2,curdate()获取当前日期 只包括年月日
    			select curdate()
    			
    	3,curtime()获取当前时间 只包括时分秒
    			select curtime();
    	
    	4,sysdate()获取函数执行时的日期和时间
    		select sysdate(),now(),sleep(3),sysdate(),now();
    	
    	5,dayofyear()获取某个日期是所在年份的第几天
    	 week()获取某个日期是所在年份的第几周
    	 	select dayofyear(now()),week(now());
    	
    	6,datediff()计算两个日期之间的时间间隔
    		---计算2019.1.1日距离现在时间间隔
    		select datediff("2019-12-30",now());
    
    	7,date_add(),date_sub() 实现日期的加减运算
    		date_add(日期, 时间间隔类型关键字interval, 时间间隔类型对应的表达式, 时间间隔类型)
    		 day_hour  1_12 代表1天12个小时
    		 year_month 2_1 代表2年1个月
    		 
    		 select date_add(now(), interval "2_1" year_month)
    		 select date_sub(now(), interval 10 day);
    
    e,流程控制函数
    	1,if(条件,t,f) 如果条件成立返回t,否则返回f
    		select if(1>2,"1大于2","1小于2");
    			---查询雇员的薪资,如果薪资>=3000,输入“高薪”,否则“低薪”
    			select sal,if(sal>=3000,"高薪","低薪") "薪资水平" from emp;
    			
    	2,ifnull(值1,值2) 如果值1不为空则返回值1,否则返回值2
    			---查询雇员的年薪
    			select sal,comm,(sal+comm)*12 from emp; 此语句达不到想要的效果
    			select (sal+ifnull(comm,0))*12 from emp;
    			select sal,comm,(sal+ifnull(comm,0))*12 from emp;
    	3,nullif(值1,值2) 如果值1等于值2返回null,否则返回值1
    			select nullif(1,2),nullif(1,1);
    	
    	4,	   case 值
    			when 值1 then 结果1
    			when 值2 then 结果2
    			...
    			else 其他结果
    			end
     		select case 1 when 1 then "这是结果1" when 2 then "这是结果2" else "这是其他结果" end;
    
    	5,   case 
    			when 条件 then 结果1
    			when 条件 then 结果2
    			...
    			else 其他结果
    			end
    示例为:---查询雇员薪资,如果薪资>=3000返回“高薪”,否则“低薪”
    		select sal,case
    		when sal>=3000 then "高薪"
    		else "低薪"
    		end "薪资水平"
    		from emp;
    

    (2)多行函数

    定义:操作一组数据(多行记录)返回一个结果,也叫分组函数
    大多用于统计
    例如:统计各部门中雇员的人数。统计各部门中最高和最低薪资

    1,count()统计表中记录的数目
    		---查询emp表中有多少条记录
    		select count(*) from emp;
    
    	另一条语法是count(exp)统计exp值非空的记录数目
    	---查询雇员表中,有多少位雇员有津贴
    	select count(comm) from emp;
    
    	另一条语法是count(distinct(exp)) 返回表达式exp的值不重复且非空的总记录数目
    		---统计雇员表中有多少位雇员是领导
    		select count(distinct(mgr)) from emp;--统计的是除董事长外的领导人数
    		---统计雇员表中包含董事长的领导数 需要用到ifnull函数
    		select count(distinct(ifnull(mgr,1))) from emp;
    
    2,sum(exp) 返回表达式值的总和
    	select sum(sal) from emp;
    	
    	另一条语法是sum(distinct(exp))返回不重复的表达式exp的总和
    	select sum(sal),sum(distinct(sal)) from emp;
    
    3,avg(exp)返回表达式值的平均值
    	select avg(sal) from emp;
    
    	另一条语法是avg(distinct(exp))返回不重复的表达式exp的平均值
    	select avg(distinct(sal)) from emp;
    
    4,max()  min() 
    	max(emp)返回表达式值的最大值
    	min(emp)返回表达式值的最小值
    	select min(sal),max(sal) from emp;
    

    (3)分组统计

    语法为:
    		select 查询内容
    		from 表名
    		[where 条件]
    		[group by 分组字段名1,分组字段名2,...]
    		[order by 字段名 asc|desc]
    		[limit]
    
    示例如下:
    	 ---求每个部门的人数
    	 select deptno,count(*) from emp  group by deptno;
    	 ---求每个部门的平均工资
    	 select deptno,avg(sal) from emp group by deptno;
    	 ---求每个部门中最高工资和人数
    	 select deptno,max(sal),count(*) from emp group by deptno;
    	 ---求每个岗位的人数
    	 select job,count(*) from emp group by job;
    	 ---显示每个部门不同岗位的人数
    	 select deptno,job,count(*) from emp group by deptno,job;
    
    注意事项1:如果查询字段,没有在多行函数中,则必须是分组字段
    	select ename,job,sum(sal) from emp group by job; 此语句运行后会报错
    
    注意事项2:如果没有group by 则查询字段不能与多行函数一起查询
    	select sal,empto from emp; 合法
    	select sum(sal),empto from emp;不合法
    
    注意事项3:不允许在where条件中使用多行函数
    

    having子句

    语法为:
    		select 查询内容
    		from 表名
    		[where 条件]
    		[group by 分组字段]
    		[having 条件]
    		[order by]
    select from ---where过滤---group by---having过滤
    示例如下:
    	---每个部门不同岗位的人数,且人数大于2
    	select count(*),deptno,job from emp group by deptno,job having count(*)>2;
    	---在emp表中列出工资最小值小于2000的职位
    	select job,min(sal) from emp group by job having min(sal)<2000;
    	---查询每个职位的最低薪资
    	select job,min(sal) from emp group by job;
    	---列出平均工资大于1200的部门和职位搭配组合
    	select avg(avg) from emp group by deptno,job having avg(sal)>1200;
    	---求每个部门不同职位的平均工资
    	select avg(sal) from emp group by deptno,job;
    
    展开全文
  • java—实现一个监听器HttpServletRequest的创建销毁、在线人数 (56) 在JavaWeb中的监听器分类  在Javaweb中存在三个被监听对象:  HttpServletRequest  HttpSessoin  ServletContext ...
  • CentOS环境中,在Python程序中创建Spark对象并进行行数统计
  • 数据查询不是简单地返回数据库中存储的数据,而是根据用户的不同需求对数据进行筛选、统计,并且以用户需要的格式返回结果。 SQL Server提供了强大、灵活的Select语句,用于实现用户的各种数据查询操作。 Select...
  • 文章目录1, 统计系统需求2,创建项目3,创建统计类3.1 创建文件3.2头文件实现3.3 源文件实现4,菜单功能4.1添加成员函数4.2 菜单功能实现5,退出功能5.1提供功能接口5.2 实现退出功能6,创建省份类6.1创建省份抽象...
  •  如果现在希望将上表中各种性别的人数进行统计,sql语句如下: SQL> select 2 sum( case u.sex when 1 then 1 else 0 end)男性, 3 sum( case u.sex when 2 then 1 else 0 end)女性, 4 sum( case ...
  • ????文章代码???? 5.12 案例 ...现在我们有一组从2006年到2016年1000部最流行的电影数据 ...问题1:我们想知道这些电影数据中...问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据? 2
  • 建立一个存储过程查询各部门各职位的人数 职工表:职工号,部门号,职位号
  • 创建YGGL数据库并在YGGL数据库创建三个表:employees,salary,departments 创建XSCJ数据库并在XSCJ数据库创建三个表:XS,KC,XS_KC 一、YGGL 1.首先需要创建YGGL数据库: create database YGGL default character...
  • 判断数据库是否存在,若存在则删除,不存在则创建 drop database if exists 数据库名 ; create database if not exists 数据库名; 任务1:用SQL语言创建企业门户系统数据库HYDB 1)如果不存在数据库HYDB,则创建。 2)...
  • SELECT pid 产品ID, SUM(ocount) 销售总量 FROM orders GROUP BY pid;
  • 作者 : lnboy 标题 : jsp实用两例:用filter解决汉字编码及禁止页面缓存 和 用listener实现在线人数统计. 关键字: jsp filter 汉字编码 listener 在线人数
  • 实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示 https://blog.csdn.net/ddxygq/article/details/81258643 Flume+Kafka+Storm+Redis构建大数据实时处理系统:实...
  • 空间统计(三)聚类分布制图

    万次阅读 多人点赞 2015-03-17 15:59:43
    这组工具中包含众所周知的...工具集中的其他工具也有类似的作用,都是通过执行聚类分析来识别具有统计显著性的热点、冷点和空间异常值的位置。依照惯例,我们还是 one by one 来看。Similarity Search相似搜索工具,
  • 统计数据时发现 门诊使用抗菌药人数 字段需在分组后的结果中进行统计 --门诊挂号人次,门诊抗菌药使用率 门诊挂号人次、门诊抗菌药使用率ID 挂号日期 大科编码 大科 亚科编码 亚科 挂号人次 门诊使用抗菌药人数 ...
  • 2001-使用Hive+MR统计分析网站指标

    千次阅读 2015-11-25 11:02:54
    使用Hive+MR统计分析网站指标
  • 3 SQL 语句分类 4 DDL 操作数据库、表 4.1DDL操作数据库(数据库CRUD) DDL操作数据库-- C(Create):创建数据库 DDL操作数据库-- R(Retrieve):查询数据库 DDL操作数据库-- U(Update):修改数据库 DDL操作数据库...
  • 通过搭建大数据平台,然后利用hadoop+hive对用户行为日志加强并分析,统计网站中常用到的一些关键性指标,用于指导运营和建设,更好服务于客户。
  • 8统计模型

    2019-08-26 11:40:51
    第8章 统计模型图 统计模型用于描述一个或多个解释变量与响应变量之间的关系,图形有助于可视化变量间关系。在本节中,我们将重点关注具有单个响应变量的模型,该变量可以是定量或定性变量。 8.1 相关图 相关图通过...
  • 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列、行计数(count): 标准格式 ...
  • 朴素贝叶斯(社区恶意留言分类,垃圾邮件分类,新浪新闻分类)代码实现 以下代码为本人学习后,修改或补充后的代码实现,数据集和原代码请参考:https://github.com/Jack-Cherish/Machine-Learning 社区恶意留言分类...
  • zoj分类

    千次阅读 2013-05-26 16:01:24
    zoj分类 搜建模搜来的。。。 简单题 #1001 -____-b A+B。 #1110 Dick and Jane 胡乱枚举收缩一下情况就可以了。 #1115 a[i+1] = a[i] 的全部数位上的加起来,直到剩下一个,直接模拟。 #1414 太弱太弱...
  • web开发中常用的几种统计图使用

    千次阅读 2015-11-14 15:22:31
    最近,笔者结合自己在公司项目使用统计图的经验以及自己的研究,对地图统计、柱形图统计、饼图统计以及折线图统计这几种常用的统计作以归纳。主要使用到的js框架是highstock.js,一种完全基于javascript的前端框架。...
  • 总体思想是创建一个类,在类里面创建处理数据的函数。 import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans #引入sklearn模块里的机器学习算法Kmeans ...
  • 机器学习 二分类分类阈值 分类评估 (Classification Evaluation) The metric we use to evaluate our classifier depends on the nature of the problem we want to solve and the potential consequences of ...
  • 饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。 特点:分类数据的占比情况(占比) 饼图广泛得应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照...
  • zoj 题目分类

    千次阅读 2014-08-16 00:59:17
    简单题 #1001 -____-b A+B。 #1110 Dick and Jane 胡乱枚举收缩一下情况就可以了。 #1115 a[i+1] = a[i] 的全部数位上的加起来,直到剩下一个,直接模拟。 ...#1414 太弱太弱,按照模 4 分类...预处理 O(W*H),查询

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,313
精华内容 4,125
关键字:

创建查询分类统计人数