高级查询—— 使用Java实现数据库编程

本文详细介绍了SQL中的数据库操作,包括修改表结构、DML语句(增删改查)、常用函数的使用,以及子查询的应用。通过实例演示了如何修改表名、添加字段、删除字段、设置主键和外键,以及执行复杂的查询操作,如查询特定条件的数据、计算统计值等。同时,文章还提到了 EXISTS 和 NOT EXISTS 子查询的用法,以及子查询的注意事项。整体内容深入浅出,是学习和理解SQL数据库操作的重要参考资料。

一、修改表

  1. 修改表名
alter table <旧表名> rename <新表名>;
  1. 添加字段
alter table 表名 add 字段名 数据类型 [属性];
  1. 修改字段
alter table 表名 change 原字段名 新字段名 数据类型 [属性];
  1. 删除字段
alter table 表名 drop 字段名;
  1. 添加主键
alter table 表名 add constraint 主键名 primary key 表名(主键字段名);
  1. 添加外键约束
alter table 从表 add constraint 外键名 foreign key (从表的外键) references 主表 (主键);

二、DML语句 数据的赠删改查

  1. 插入数据
    1. 插入单行数据
insert into 表名 (字段1,字段2,......) values (值1,值2,......);

​ 2. 插入多行数据

insert into 表名 (字段1,字段2,......) values (值列表1),(值列表1),...... ;

​ 3.将查询的结果插入新表

insert into 新表 (字段1,字段2,......)
select 字段1,字段2,......
from 原表
create table 新表 (select 字段1,字段2,...... from 原表) ;

​ 第二个无需提前创建

  1. 更新数据记录
update 表名 set 字段1=值1,字段2=值2,......,字段n=值n where 条件;
  1. 删除数据记录
delete from 表名 where 条件;

​ 使用truncate删除表中所有行

truncate table 表名;

truncate 语句实现删除表中所有的数据,删除后将重置自增列,表结构及字段,约束,索引保持不变,执行速度比 delete 语句快

  1. 查询
select  <目标列名序列> --需要哪些列
from <表名> --来自哪张表
[where <行选择条件>]
[group by <分组依据列>]
[having <组>]
[order by <排序依据列>]
[limit [位置偏移量,] 行数]

select 子句用于指定输出的字段;

from 子句用于指定数据的来源;

where子句用于指定数据的选择条件;

group by子句用于对检索到的记录进行分组;

having 子句用于指定组的选择条件;

order by 子句用于对查询的结果进行排序;

limit 位置偏移量值从结果集中的第几天数据开始显示,第一条是0 ,第二条是1 以此类推 行数值显示记录的条数

以上子句中,SELECT 子句和FROM子句是必需的,其它是可选的。

三、常用函数

  1. 聚合函数
函数名作用
avg ( )返回某字段的平均值
count ( )返回某字段的行数
max ( )返回某字段的最大值
min ( )返回某字段的最小值
sum ( )返回某字段的和
  1. 字符串函数
函数名作用举例
concat(str1,str1…strn)字符串连接SELECT CONCAT(‘My’,‘S’,‘QL’); 返回:MySQL
insert (str,pos,len,newstr)字符串替换SELECT INSERT( ‘这是SQL Server数据库’, 3,10,‘MySQL’); 返回:这是MySQL数据库
lower(str)将字符串转成小写SELECT LOWER(‘MySQL’);返回:mysql
upper(str)将字符串转为大写SELECT UPPER(‘MySQL’);返回:MYSQL
substring(str,num,len)字符串截取SELECT SUBSTRING( ‘JavaMySQLOracle’,5,5); 返回:MySQL
  1. 时间日期函数
函数名作用举例
curdate( )获取当前日期SELECT CURDATE();返回:2016-08-08
curtime( )获取当前时间SELECT CURTIME();返回:19:19:26
now( )获取当前日期和时间SELECT NOW();返回:2016-08-08 19:19:26
week(date)返回日期date为一年中的第几周SELECT WEEK(NOW());返回:26
yeat(date)返回日期date的年份SELECT YEAR(NOW());返回:2016
hour(time)返回时间time的小时值SELECT HOUR(NOW());返回:9
minute(time)返回时间time的分钟值SELECT MINUTE(NOW());返回:43
datediff(date1,date2)返回日期参数date1和date2之间相隔的天数SELECT DATEDIFF(NOW(), ‘2008-8-8’);返回:2881
adddate(date,n)计算日期参数date加上n天后的日期SELECT ADDDATE(NOW(),5);返回:2016-09-02 09:37:07
  1. 数学函数
函数名作用举例
ceil(x)返回大于或等于数值x的最小整数SELECT CEIL(2.3) 返回:3
floor(x)返回小于或等于数值x的最大整数SELECT FLOOR(2.3) 返回:2
fand()返回0~1间的随机数SELECT RAND() 返回:0.5525468583708134

四、子查询

  1. 子查询在 where 语句中一般用法如下
select ...... from 表1 where 字段1 比较运算符(子查询);

​ **比较运算符包括 > = < >= <= **

子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询

将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个

  1. innot int 子查询

    1. in 子查询

    in 后面的子查询可以返回多条记录,用于限制筛选范围。

     1. 常用IN替换等于(=)的子查询
     	2. IN后面的子查询可以返回多条记录
    
    1. not in 子查询

      not 就是不包含

五、一些例子

  1. 修改表名
ALTER TABLE student RENAME student2;
  1. 添加字段
ALTER TABLE student2 ADD test VARCHAR(100) DEFAULT '测试';
  1. 修改字段
ALTER TABLE student2 CHANGE test demo INT;
  1. 删除字段
ALTER TABLE student2 DROP demo;
  1. 添加主键
ALTER TABLE student ADD CONSTRAINT pk_student PRIMARY KEY student(studentNo);
  1. 添加外键
ALTER TABLE student ADD CONSTRAINT fk_student_grade FOREIGN KEY (gradeId) REFERENCES grade (gradeID);
  1. 查询2016年2月17日考试前5名的学员的学号和分数
SELECT studentNo,studentResult FROM result WHERE examDate='2016-2-17' LIMIT 5;
  1. 将所有女学生按年龄从大到小排序,从第2条记录开始显示6名女学生的姓名、年龄、出生日期、手机号信息
SELECT studentName,FLOOR(DATEDIFF(CURDATE(),bornDate)/365),bornDate,phone FROM student WHERE sex='女' ORDER BY DATEDIFF(CURDATE(),bornDate) ASC LIMIT 1,6;
  1. 按出生年份分组统计学生人数,将各组中人数达到2人的年份和人数显示出来
SELECT COUNT(*),YEAR(bornDate) FROM student GROUP BY YEAR(bornDate) HAVING COUNT(*)>1;
  1. 查询参加2016年2月17日考试的所有学员的最高分、最低分、平均分
SELECT MAX(studentResult),MIN(studentResult),AVG(studentResult) FROM result WHERE examDate='2016-2-17';
  1. 查询参加最近一次Logic Java考试成绩的学生的最高分和最低分
SELECT MAX(studentResult),MIN(studentResult) FROM result 
WHERE examDate=(
	SELECT MAX(examDate) FROM result WHERE subjectNo=(
		SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'
	)
) AND subjectNo=(
	SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'
)
  1. 查询S1学期开设的课程
SELECT subjectName FROM `subject` WHERE gradeID = 
	(
	SELECT gradeID FROM grade WHERE gradeName='S1'
	) ;
  1. 查询未参加“HTML”课程最近一次考试的在读学生名单
SELECT * FROM student WHERE studentNo NOT IN 
(
	SELECT studentNo FROM result 
	WHERE examDate=
	(
		SELECT MAX(examDate) FROM result WHERE subjectNo=
		(
			SELECT subjectNo FROM `subject` WHERE subjectName='HTML'
		)
	)
	AND subjectNo = 
	(
		SELECT subjectNo FROM `subject` WHERE subjectName='HTML'
	)
)
 AND gradeId=
 (
		SELECT gradeId FROM `subject` WHERE subjectName='HTML'
)

六、总结

在这里插入图片描述

七、exists 和 not exists 子查询

​ 用来检测数据库对象是否存在

  1. exists子查询

    1. 可以使用 exists 语句判断数据库对象是否存在,返回值是 truefalse

      #例如 如果存在数据表temp 则先删除它,然后重写创建。
      drop table if exists temp;
      
    2. exists 也可以作为 where 语句的子查询

      select ..... from 表名 where exists(子查询);
      

      exists 关键字后面的参数是一个任意的子查询,如果该子查询有返回行,则 exists 子查询的结果为 true 此时在执行外层查询语句。如果子查询没有返回行,则 exists 查询的结果为 false ,此时外层语句不再查询。

  2. not exists 查询

    1. existsin 一样,同样允许添加 not 关键词实现取反操作,not exists 表示不存在。
    2. existsnot exists 的结果只取决于是否有返回记录,不取决于这些记录的内容,所有 existsnot exists 子查询后 select 语句中的字段列表通常是无关紧要的。

八、子查询注意事项

  1. 子查询语句可以嵌套在 SQL 语句中任何表达式出现的位置。

    1. 嵌套在父查询SELECT语句的子查询可包括
      select 子句
      from 子句
      where 子句
      group by 子句
      having 子句
  2. 只出现在子查询中而没有出现在父查询中的列不能包含在输出列中

    1. 多层嵌套的子查询最终数据集质保含父查询的 select 子句出现的字段。而子查询的输出结果通常 作为其外层子查询数据源或用于数据判断匹配。

九、总结在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾拾柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值