数据库查询

465 阅读6分钟

DQL(数据库查询语言)

select 语句

  • 查询全部数据

    select * from 表名
    
  • 查询指定字段

    select 字段1,字段2 from 表名
    
  • 给指定字段起 别名 (可以给字段起别名,也可以给表起别名)

    select 字段1 as 别名1, 字段2 as 别名2... from 表名 as 表别名
    
  • 使用函数concat(a,b) :拼接字符串

    select concat('a','b') from dual //ab
    
  • 去重,会将查询到的字段进行去重处理 关键字 : distinct

    select distinct 字段 from 表名
    
  • 表达式 : MySQL中的表达式可以是 : 列,文本值,null,函数,系统变量,计算表达式等

    select 表达式 from

SELECT 完整语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1]][,table.field2[as alias2]][,...]}
FROM table_name [as table_alias] 
[left | right | inner join table_name2] -- 关联查询
[WHERE ...] 	-- 指定查询条件
[GROUP BY ...]  -- 指定分组条件
[HAVING ..] 	-- 过滤分组的数据必须要满足的次要条件
[ORDER BY ...{ASC | DESC}]	-- 指定排序条件
[LIMIT {[offset,]row_count | row_countOffset offSet}]

where 条件子句

  • 作用 : 检索数据中符合条件 的值
  • 搜索的条件就是由一个或多个表达式组成,结果为布尔值
  • 逻辑运算符
运算符语法描述
and (&&)a and b (a && b)逻辑与,两个都为真,结果为真
or (||)a or b (a || b )逻辑或,有一个为真结果为真
Not (!)NOT a (!a)逻辑非,取反,真为假,假为真
  • 模糊查询 : 比较运算符

    运算符语法描述
    is nulla is nulla为null,结果为真
    is not nulla is not nulla不为null, 结果为真
    between ... and ...a between b and ca 在b和c之间,结果为真,包含b、c
    likea like b
    _ : 表示一个字符
    % : 表示0个或任意个字符
    SQL匹配,如果a匹配b,则结果为真
    a like b_ : 表示a匹配以b开头的两个字符
    a like b% : 表示a匹配以b开头的0个或任意个字符
    ina in (a1,a2,a3...)a1,a2,a3包含a,则结果为真
    not ina not in (a1,a2,a3...)a1,a2,a3不包含a,则结果为真

连表查询

连接方式语法描述
Inner join... on ...select a.* , b.* from a inner join b on a.id = b.id
等价于 :
select a.* , b.* from a inner join b where a.id = b.id
等价于 :
select a.* , b.* from a,b where a.id= b.id
内连接,查询的是a和b的交集,满足关联条件但是有字段为null的记录不会被查询出来。
内连接中,where条件子句等价于on条件子句
left join ... on ...select a.* , b.* from a left join b on a.id = b.id左外连接,以a(左)表为驱动表,查询出a(左)表中的所有数据,即使b(右)表中没有匹配
right join ... on ...select a.* , b.* from a right join b on a.id = b.id右外连接,以b(右)表为驱动表,查询出b(右)表中的所有数据,即使a(左)表中没有匹配
自连接select a.* , b.* from a a1 , a a2 where a1.id = a2.pid将同一张表看成两张表来进行关联操作

分页和排序

  • 排序 : ==order by 关键字 ,ASC - 升序 不写默认升序,DESC 降序==
select a,b,c from 表名 where 条件 order by a desc // 表示最终的查询结果根据a字段做降序排列
  • 分页 : limit([n],m) n : 起始的行数(n从0开始) , m要查询的条数,n可以忽略,表示直接从第一条开始查询m条数据
select a,b,c from 表名 where 条件 order by a desc limit (n,m) // 分页查询,查询从第n行开始的M条数据,n忽略时,表示直接从第一条开始查询m条数据

子查询

  • 本质 :在where字句中或者select语句中放入另外一条select子句

  • 案例:

    -- 查询c语言-1前五名学生的学号姓名
    SELECT
    	studentno,
    	studentname
    FROM
    	student where studentno in (
    		select studentno FROM result where subjectno = (
    			select subjectno from subject where subjectname = 'C语言-1'
    		)
    	)
    

分组和过滤

  • GROUP BY : 通过GROUP BY 子句 可以对查询数据进行分组

  • HAVING : 通过HAVING 条件 子句 可以对分组后的语句进行条件过滤

  • 注意 : WHERE子句不能和聚合函数一起使用,此处需要过滤条件只能使用HAVING 子句

  • 案例

    -- 查询课程平均分 >= 80 的总分,平均分,最大分和最小分
    SELECT
    	sub.subjectname,
    	SUM( r.studentresult ) as sum,
    	AVG( r.studentresult ) as avg,
    	MAX(r.studentresult) as max,
    	MIN(r.studentresult) as min
    	from
    	result r inner join `subject` sub on r.subjectno = sub.subjectno
    	group by r.subjectno
    having avg >= 80
    
    

MySQL函数

一般函数

  • 数学运算

    函数语法描述
    ABS()select ABS(-99)取绝对值
    CEILing() 或 CEIL()select CEILing(1.2) // 2
    select CEIL(-1.2) // -1
    向上取整
    FLOOR()select FLOOR(2.2)向下取整
    RAND()select RAND()返回一个0~1之间的随机数
    SIGN(99)select SIGN(99)判断一个数的符号,负数返回-1,0返回0,正数返回1
  • 字符串函数

    • MySQL中所有的字符串下标均是以1开始
    函数语法描述
    CHAR_LENGTH(str)select CHAR_LENGTH('你好世界') // 4返回字符串的字符长度
    LENGTH(str)select LENGTH('你好世界') // 12返回字符串的unicode编码长度
    CONCAT(str1,str2,str3...)select CONCAT('你好','我爱的','世界')拼接字符串,将所有参数字符串按顺序拼接成一个字符串
    INSERT(str,pos,len,newstr)select INSERT('你好世界',1,2,'美丽的') // 美丽的世界替换字符串,使用newstr替换从str的pos位置开始的len个长度的字符串
    LOWER(str)select LOWER('A') // a将str中的所有大写字母转换成小写
    UPPER(str)select UPPER('a') // A将str中的所有小写字母转换成大写
    INSTR(str,substr)select INSTR('你好世界','你') // 1返回substr子字符串在str字符串中第一次出现的位置
    REPLACE(str,from_str,to_str)elect REPLACE('你好世界','你好','再见') // 再见世界字符串的替换,使用to_str替换在str中出现的from_str
    SUBSTR(str,pos,len)
    SUBSTR(str,pos)
    等效于 SUBSTRING()
    select SUBSTR('你好世界',1,2) // 你好
    select SUBSTR('你好世界',1) // 你好世界
    字符串截取,截取从str字符串中pos位置开始的长度为len的字符串;如果没有len参数,则截取到str字符串末尾
    REVERSE(str)SELECT REVERSE('你好') // 好你翻转字符串
  • 时间和日期函数

    函数语法描述
    NOW()select NOW()返回当前日期时间,包括日期和时间
    CURRENT_TIME()select CURRENT_TIME()返回当前时间(时分秒)
    CURRENT_DATE()select CURRENT_DATE()返回当前日期(年月日)
    CURRENT_TIMESTAMP()select CURRENT_TIMESTAMP()返回当前日期时间,包含日期和时间

聚合函数(常用)

函数语法描述
COUNT([DISTINCT]列名)select COUNT(列名1[,列名2]...) from 表名查询某一列的总记录数,会忽略null值;如果该列为主键,效率比count(1)快,如果该列不为主键,count(1)效率更快
COUNT(*)select COUNT(*) from 表名查询表中的总记录数,不会忽略null值
COUNT(1)select COUNT(1) from 表名查询表中的总记录数,不会忽略null值
SUM([DISTINCT] 列名)select SUM(列名) as sum from 表名查询指定列的总和
AVG([DISTINCT] 列名)select AVG(列名) as sum from 表名查询指定列的平均值
MIN()select MIN(列名) as sum from 表名查询指定列的最小值
MAX()select MAX(列名) as sum from 表名查询指定列的最大值

MD5加密函数

函数语法描述
MD5(str)select MD5('222222')针对给定的字符串str进行MD5加密操作,该操作是数据库级别的MD5加密操作