达梦数据库语法

查询基础语法结构

    select 列1 别名,…,列n 别名 from 表名1,…,表名n

    [where 条件语句]

    [group by 分组列1,…,列n] [having 筛选分组条件]

   [order by 排序列1,…,列n]

   以下所有的举例都基于下方的表student和course

达蒙数据库语法_数据

达蒙数据库语法_表名_02

一、条件语句

1. 关系运算符:

<, >, =, >=, <=, !=或者<>(不等于), !>(不大于), !<(不小于)

2. 逻辑运算符:

and, or, not


3. 范围运算
  • 关系运算符和逻辑运算符的组合

//查询年龄小于18,大于22的学生姓名

select name from student where age<18 or age>22;

//查询选修了英语课程并且成绩大于60的学生姓名,科目和成绩

select s.name,c.c_name,c.grade from student s,course c

where c.sno=s.sno and c_name='大学英语' and grade>=60;

  • between…and…

//查询年龄在18-22之间(包括18和22)的学生姓名

select name from student where between 18 and 22;

//查询年龄 不 在18-22之间的学生姓名

select name from student where not between 18 and 22;

  • in(值1,…,值n)

//查询年龄为18,22,24的学生姓名

select name from student where in(18,22,24);

//查询年龄 不 为18,22,24的学生姓名

select name from student where not in(18,22,24);

4.模糊查询like

% 代表任意长度(可以为0)的字符串

  • //查询姓张的学生的信息

 select * from student like '张%';

  • _ 代表单个字符串

//查询姓张,且名字为两个字的学生的信息

select * from student like '张_';

5.空值和非空值查询

//查询没有选课的学生姓名

select s.name from student s,course c

where c.sno=s.sno and course is null;

//查询课程成绩已经出来的学生姓名,课程和成绩

select s.name,c.c_name,c.grade from student s,course c

where c.sno=s.sno and grade is not null;

二、group by子句以及having子句

1. group by子句


聚集函数:

注意:聚集函数只能用于select子句和group by中的having子句


   sum() ------求和

   count() ----计算数量

   max() ------求最大值

   min() -------求最小值

   avg() -------求平均值

//查询每个学生选修的课程数量,总学分,最高成绩,最低成绩,平均成绩

select s.name,count(c.c_name),sum(c.credit),

max(c.grade),min(c.grade),avg(c.grade)

from student s,course c where c.sno=s.sno  

group by s.name;

三、order by 子句

升序使用asc,降序使用desc,默认值是升序

//每页显示3条数据,显示第3页的数据

select top 3 * from course where num not in(
select top 6 num from course
);

四、分页查询

1. top分页

规律总结:

select top 每页显示条数 要查询的列表 from 表名 where 编号 not in(
select top (当前页码 - 1) * 每页显示条数 编号 from 表名 );

//每页显示3条数据,显示第3页的数据

select top 3 * from course where num not in(
select top 6 num from course
);

2. limit分页

规律总结:

selct 列表 from 表名 limit (当前页码-1)*每页条数,每页显示条数;

//每页显示3条数据,显示第3页的数据

select * from course limit 6,3;

3. 伪列分页

rowid

规律总结:
select rowid,* from 表名;
----先查看rowid的编号是从几开始的,假设是n
select rowid,* from 表名 where rowid
between ((当前页码-1)*每页条数+n)
and (当前页码 * 每页条数+n-1);

//每页显示3条数据,显示第3页的数据

select rowid,* from course;//n=1
select rowid,* from course where rowid between 7 and 9;

rownum

规律总结:
select * from (
select rownum,* from (
----此处可以是任意复杂的查询
) where rownum <= 当前页码 * 每页条数
)t where t.rownum>(当前页码 - 1) * 每页显示条数;

//每页显示3条数据,显示第3页的数据

select * from (
select rownum,* from (
select * from course
)where rownum <= 9
)t where t.rownum>6;

达梦数据​​库函数​​使用

    1.length(string) ----获取字符串长度,包括空格

//查询course表中的"高级路由技术"字符串的长度

select length(c_name) from (

select c_name from course where c_name ='高级路由技术')

   2.concat(str1,…,strn) ----拼接字符串

//将学号sno和姓名name两个字符串用_连在一起

select concat(sno,'_',name) from student;

  3. initcap(string) ----将字符串的首个字母变成大写

//将course表中的课程名"database"字符串的首字母变成大写

select initcap(c_name) from (

select c_name from course where c_name ='database');

  4. insert(str1,begin_index,length,str2) ----从str1字符串的指定下标开始删除指定长度的内容,再插入str2并返回新字符串

//将course表中的课程名"高级路由技术"变成"高级交换技术"

select insert(c_name,3,2,'交换') from (

select c_name from course where c_name ='高级路由技术')


  5. lower(string) ----转小写

//将course表中的课程名"English"改为全小写字母

select lower(c_name) from (

select c_name from course where c_name ='English');

   6.upper(string) ----转大写

//将course表中的课程名"database"改为全大写字母

select upper(c_name) from (  

select c_name from course where c_name ='database');

  7. trim(string) ----去除字符串左右两边的空格

//将course表中的课程名"    高等数学"前面的空格去掉

select trim(c_name) from (  

select c_name from course where c_name ='    高等数学')

   8.left(string,n) ----从字符串左边截取长度为n的子串

//将course表中的课程名"高级路由技术"截取显示"高级路由"

select left(c_name,4) from (

select c_name from course where c_name ='高级路由技术');

   9.right(string,n) ----从字符串右边截取长度为n的子串

//将course表中的课程名"高级路由技术"截取显示"路由技术"

select right(c_name,4) from (

select c_name from course where c_name ='高级路由技术')

   10.substring(string,begin,n) ----从字符串的begin下标开始截取长度为n的子串

//将course表中的课程名"高级路由技术"截取显示"路由"

select substring(c_name,3,2) from (

select c_name from course where c_name ='高级路由技术')

   11.replace(string,old,new) ----将string字符串中的old字符串替换成new字符串

//将course表中的课程名"高级路由技术"中的"路由"变成"交换"

select replace(c_name,substring(c_name,3,2),'交换') from (

select c_name from course where c_name ='高级路由技术');

数学函数

  1. pi() ----获取圆周率
    //查看圆周率
    select pi(); 2.rand() ----生成0-1之间的随机小数
    //生成100-999之间的一个随机数
    select (900*rand()+100);
  2. floor() ----向下取整
    //生成一个随机的三位数(100-999)
    select floor(900*rand()+100);
  3. ceil() ----向上取整
    //生成一个随机的三位数(100-999)
    select ceil(901*rand()+99);
  4. round(number,n) ----四舍五入到n位小数
    //将course表中的成绩grade四舍五入都显示成整数
    select round(grade,0) from (
    select grade from course );
  5. trunc(number,n) ----直接截断到第n位小数
    //将course表中的成绩grade截断到个位
    select round(grade,-1) from (
    select grade from course );
  6. mod(m,n) ----求m/n的余数

      //求8/5的余数
      select mod(8,5);

  1. sqrt(number) ----求平方根
    //求26的平方根(以小数5.0990195135927845显示结果)
    select sqrt(26);
  2. power(m,n) ----求m的n次方
    //求24.5的5次方(以小数8827351.53125显示结果)
    select power(24.5,5);

日期函数

1.curdate() ----获取当前日期
//获取当前年月日
select curdate();

2.curtime() ----获取当前时间
//获取当前精确的纳秒的时间
select curtime();

3.now() ----获取当前日期时间
//获取当前年月日及其精确到纳秒的时间
select now();

4.add_days(date,num) ----在指定日期上增加指定的天数(可以为负数)
//从course表中获取最近十天录入的成绩详情
select * from course
where grade_input_date between add_days(now(),-10) and now();
 5.add_months(date,num) ----在指定日期上增加指定的月数
//查询六个月后是哪天
select add_months(now(),6);

6.dateadd(datepart,num,date) ----在指定日期的指定部分增加指定的数值
//查询68天后是几月几日
select dateadd(DD,68,now());

7.datediff(datepart,date1,date2)----计算两个日期的指定部分的差值(date2-date1)
//计算距离大年初一还有多少小时
select datediff(HH,now(),'2021-02-12');

8.datepart(datepart,date) ----获取指定日期中指定部分的值
//获取现在是19点13分多少秒
select datepart(S,now());

9.dayofweek(date) ----计算指定日期是一周中的第几天
//查看今天是一周中的第几天(从周日开始算)
select dayofweek(now());

10.dayofyear(date) ----计算指定日期是一年中的第几天
//查看今天是一年中的第几天
select dayofyear(now());