sql之查询语句的基本操作详解上

### Select查询语句分类

  • 简单查询语句
    • 从一个表中查询数据
  • 复杂查询语句
    • 多表连接查询 (将来源于多个表的列横向叠加)
      • 内连接
      • 左连接
      • 右连接
      • 全连接
      • 自连接
      • 非等值连接
    • 复合查询(将查询结果集上下叠加)
      • Union
      • Union All
      • Intersect
      • Minus
    • 子查询
      • 非关联子查询
      • 关联子查询

查询语句语法结构

SELECT select_list  #select_list 要显示的列,列之间用逗号隔开,列也称作投影
[ INTO new_table ]  # 结果集导入新表
FROM [table_source] #表名 
[ WHERE search_condition ] #表行过滤条件
[ GROUP BY group_by_expression ]  #按照指定的列将表行分组
[ HAVING search_condition ] #对分组后的新行进行过滤  
[ ORDER BY order_expression [ ASC | DESC ] ] #按照指定的1个或多个列进行排序,ASC增序,DESC降序

select中常用运算符

  • 算数运算符:
    • + 加法运算
    • - 减法运算
    • * 乘法运算
    • /或DIV 除法运算
    • % 或MOD 求余运算
  • 逻辑运算符:
    • and 而且
    • or 或者
    • xor 异或
    • not或! 非
  • 比较运算符:
    • = 等于
    • != 或<>不等于
    • > 大于
    • < 小于
    • >= 大于等于
    • <= 小于等于;
    • <=> 严格比较两个NULL值是否相等,同为NULL时为真
    • is null 为空值
    • is not null 为非空值;
    • in (值列表) 在值列表中
    • not in (值列表)不在值列表中;
    • between 低值 and 高值 (包含低值和高值)在低值和高值之间;
    • not between 低值 and 高值 (包含低值和高值)不在低值和高值范围内;
    • like ‘通配符’ 按照通配符进行匹配;
      • % 匹配0个或任意多个字符
      • _ 匹配任意1个字符
  • 位运算符
    • & 按位与
    • | 按位或
    • ^ 按位异或
    • ! 取反
    • << 左移
    • >> 右移
  • 赋值运算符
    • := 用于select语句中的赋值,
  • 运算符优先级
优先级 运算符
1 !
2 ^
3 *,/,DIV,%,MOD
4 -,+
5 <<,>>
6 &
7 |
8 =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
9 BETWEEN,CASE,WHEN,THEN,ELSE
10 NOT
11 &&,AND
12 ||,OR,XOR
13 :=

select where子句

  • stu表数据如下
    image-20191127143147761
  • 查询学生表中性别为'女',体重超过60公斤的学生的所有信息
    image-20191127142809675
  • 查询学生表中1班或者2班中,身高超过190的学生
    image-20191127142923218
  • 查询学生表中3班学生里面考分在400和520之间的女生
    image-20191127143111204
  • 查询学生表中没有分配班级而且是女生的学生
    image-20191127143249233
  • 在学生表体重低于40公斤且身高低于1.65米的学生,列出其姓名,身高,体重,总分以及总分占750分满分的百分比
    image-20191127143530710
  • 在学生表中查找学生姓名,第二个字是‘侯’,或者 第一个字是‘张’且名字只有两个
    image-20191127143724804

函数

  • 函数用来处理SQL语句中的数据,可以嵌入在SQL语句中使用,增加了SQL语句对数据的处理功能

    • 函数可以有0到多个参数,但是总会有一个返回值
    • 函数可以用来计算、修改、格式化输出二维表中的各类数据
    • 不同数据库的函数的名称和用法略有不同,但都会提供如:字符串处理、数值处理、日期处理、统计等分类的函数、方便用户处理各类数据
  • 常用字符串函数

    • char_length(str) 计算给定字符串长度

      image-20191127144143374

    • concat(str1,str2...) 字符串拼接

      image-20191127144436508

    • substr(str,pos,len) 字符串str从pos位置(1开始)开始截取len个字符

      image-20191127144726414

  • 常用数值函数

    • round(num,n) 数值num对n+1位进行四舍五入运算,正数表示保留的小数位,负数表示对整数位进行四舍五入,0表示四舍五入取整

      image-20191127145058922

  • 常用日期函数

    • year(date) 对日期date取年份

      image-20191127150809181

    • month(date) 对日期date取月份

      image-20191127150922189

    • curdate() 获取当前日期

      image-20191127151014210

    • curtime() 获取当前时间

      image-20191127151045436

    • now() 获取当前时间

      image-20191127151127752

    • datediff(date1,date2) 返回date1与date2之间相隔的天数(date1-date2)

      image-20191127151359574

      也可以这样写

      image-20191127151424890

      image-20191127151439549

  • 常用条件判断函数

    • if(expr,v1,v2) 如果表达式expr成立返回v1,不成立返回v2

      image-20191127151659946

      也可以进行嵌套

      image-20191127151902239

      image-20191127165142041

      select sname,score,if(score>600,'优秀',if(score>500,'良好',if(score>400,'合格','不合格'))) from stu ;
      select sname,substr(sname,if(sname in('大乔','小乔'),2,1 ),if(substr(sname,1,2) in('诸葛','夏侯','太史'),2,1)) 姓氏 from stu;
      #substr(sname,if(sname in('大乔','小乔'),2,1 ),if(substr(sname,1,2) in('诸葛','夏侯','太史'),2,1)) 姓氏 表示使用姓氏作为别名代替原有的列名
      
  • CASE运算

    • 可以添加多个条件判断,比单个if更加灵活

    • 语法格式:case when expr1 then v1 [when expr2 v2 then] …… else vn end

      image-20191127152600651

      select sname,score,(case when score>600 then '优秀' when score >500 then '良好' when score>400 then '合格' else '不合格' end)level from stu;
      
  • 常用空值处理函数

    • 当表中有空值时,任何运算与函数的返回结果均为null

      image-20191127153039406

    • ifnull(v1,v2) 如果v1为null则返回v2否则返回v1

      image-20191127153308851

      显示出2班与未分班的学生

    • isnull(expr) 若expr为空返回1否则返回0

      image-20191127153634092

      显示所有未分班的学生

  • 常用聚合函数

    • max(col) 返回最大值,列的数据类型可以是数值、字符、日期型

      image-20191127154218718

    • min() 返回最小值,列的数据类型可以是数值、字符、日期型

      image-20191127154646401

    • sum() 列求和,列的数据类型不能是字符型

      image-20191127154727585

    • avg() 求平均值,列的数据类型不能是字符型

      image-20191127154748231

    • count() 统计,列中的如果有空值不会被统计计数

      image-20191127154818802

  • DISTINCT关键字

    • 用于去除重复记录,需要放在第一个字段前

      image-20191127154953839

  • 别名

    • 为表或列设置代替的名称显示

    • 列别名语法格式:select sname [as] 别名 from table;as可省略

      image-20191127155257432

    • 表别名语法格式:select 表别名.字段名,表别名.字段名... from 表明 [as] 表别名;

      image-20191127155703186

  • order by排序

    • 对查询结果集按照order by后面指定的1列或多列排序

      • 分为升序和降序
        • 升序 ASC,默认可以不写
        • 降序 DESC
      • 对于数值,升序是从小到大,降序是从大到小
      • 对于日期和时间,升序是从远到近,降序是从近到远
      • 对于英文字符,升序是从a到z,降序是从z到a
      • 对于中文字符,升序按照字符集编码从小到大,降序按照字符集编码从大到小,如果选择gbk编码可以按照拼音来排序
      • 对于排序列的名称,可以用以下方式
        • 列名
        • 列别名
        • 列的序号
        • 函数
        • 表达式
    • 按照学生成绩由高到低排序显示

      image-20191127192209472

    • 按照学生年龄由老到幼排序

      image-20191127192635261

    • 按照姓名首字母排序

      image-20191127192855403

      注:convert(sname using gbk) 用于转换所使用的字符集

  • limit 区域显示

    • 用于显示查询结果中的部分内容

    • LIMIT子句最后执行

    • 语法格式:limit N,M 由第N条显示M条记录,N从0开始,省略N默认为0

      image-20191127160331402

posted @ 2019-11-28 08:35  MirL  阅读(1099)  评论(0编辑  收藏  举报