BCSP-玄子JAVA开发之JAVA数据库编程CH-03_SQL高级(一)

BCSP-玄子JAVA开发之JAVA数据库编程CH-03_SQL高级(一)

3.1 修改数据表结构

3.1.1 修改表

  • 修改表名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
# 修改表名称
ALTER TABLE XuanZi RENAME TO patient;
  • 添加字段
ALTER TABLE 表名 ADD 字段名  数据类型  [属性];
# 添加字段
ALTER TABLE patient add XuanZi VARCHAR(20) NOT NULL;
  • 修改字段
ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型 [属性];
#修改字段
ALTER TABLE patient CHANGE XuanZiemail email  VARCHAR(20);
  • 删除表中的字段
ALTER TABLE 表名 DROP 字段名;
# 删除字段
ALTER TABLE patient DROP XuanZi;
  • 描述表结构
DESCRIBE 表名;
# 描述表结构
DESCRIBE prescription;
  • 添加主键约束
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段);
# 添加主键约束        添加约束       约束名称     约束类型     表(字段)
ALTER TABLE patient ADD CONSTRAINT pk_patientID PRIMARY KEY patient(patientID);
  • 添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段)REFERENCES 关联表名(关联字段);
# 添加外键约束               添加约束       约束名称          约束类型 (添加外键的字段)       关联     外键(字段)
ALTER TABLE prescription ADD CONSTRAINT fk_patientID_patient FOREIGN KEY (patientID) REFERENCES patient(patientID);

MySQL中,MyISAM存储类型的表不支持外键。因此,可以通过建立逻辑关联的方式保证数据的完整性和一致性


3.2 DML 数据操纵语言

DML(Data Manipulation Language),DML对数据库中表记录的执行操作

  • 插入(INSERT)

    • 插入单行数据

    • 插入多行数据

    • 将查询结果插入到新表

  • 更新(UPDATE)

  • 删除(DELETE)

软件开发人员日常使用最频繁的操作,必备技能!!!

3.2.1 插入数据

  • 一次向表中插入一条记录
INSERT INTO 表名 [(字段名列表)]  VALUES (值列表);
# 增
INSERT into gradeinfo (grade) VALUES ('ACCP');

字段名是可选的,如省略,则依次插入所有字段

多个列表和多个值之间使用逗号分隔

值列表和字段名列表一一对应

如果插入表中的部分字段数据,则字段名列表必填

  • 一次向表中插入多行数据
 INSERT INTO 表名 [(字段名列表)] VALUES (值列表1), (值列表2), ……, (值列表n);
 # 增
INSERT into gradeinfo (grade) VALUES ('ACCP'),('BCSP');

为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!

  • 将查询结果插入到新表
INSERT INTO 表名(字段1,字段2 , ……) SELECT 字段1,字段2 , ……FROM 原表;
# 插入
CREATE TABLE patient_address (SELECT  patientName, address  FROM patient ) ;

如果新表已存在,将会报错!

3.2.2 更新数据

  • 更新数据记录
UPDATE 表名 SET 字段1=值1, 字段2=值2, …, 字段n=值n [WHERE 条件];
# 改
UPDATE gradeinfo SET gradeinfo.grade='BCSP' WHERE gradeinfo.id=2;

3.3.3 删除数据

  • 删除数据记录
DELETE FROM 表名 [WHERE条件];
# 删
DELETE FROM gradeinfo WHERE gradeinfo.id=1;
  • 格式化表记录
TRUNCATE TABLE 表名;
# 格
TRUNCATE TABLE gradeinfo;

使用TRUNCATE语句删除表中记录后,将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快

3.3.4 比较DROP、DELETE与TRUNCATE语句

DROPDELETETRUNCATE
类型DDL 会隐式提交,不能回滚DML 每次从表中删除一行数据的同时将改行的删除操作记录在redo和undo表空间中,以便进行回滚和重做操作 需要手动提交操作才能生效,可通过ROLLBACK撤销操作DDL 会隐式提交,不会记录日志,不能回滚
功能删除表结构及所有数据,并将标所占用的空间全部释放可根据条件删除表中满足条件的数据,如果不指定WHERE子句,则删除表中所有记录删除表中所有记录,并将重建表结构
  • 执行速度:一般来说,DROP>TRUNCATE>DELETE
  • 使用DROP、TRUNCATE语句时,要慎重
  • 如果使用DELETE语句删除表中部分数据要带上WHERE子句
  • 且要注意表空间要足够大
  • 如果要删除表,使用DROP语句
  • 如果要保留表但删除表中所有数据
  • 如果与事务无关可以使用TRUNCATE语句
  • 如果与事务有关,则使用DELETE语句

3.3 DQL 数据查询语言

Data Query Language,用于查询数据库的表中数据,是数据库中最为核心的语言,使用频率最高

SELECT  <字段名列表>
FROM  <表名或视图>
[WHERE  <查询条件>]
[GROUP BY <分组的字段名>]
[HAVING <条件>]
[ORDER BY <排序的字段名> [ASC 或 DESC]]
SELECT patientID, patientName, gender, identityNum, address 
FROM patient  
WHERE gender='女' 
ORDER BY patientID DESC;
  • *或<字段名列表>表示要查询的字段。若查询表中的所有字段,则使用*;查询指定字段使用字段名列表,其中字段列表至少包含一个字段名称,若查询多个字段,则字段之间使用逗号分隔,最后一个字段后不加逗号
  • FROM 后的表名为要查询的数据的来源,可以单个或多个。
  • WHERE 子句为可选项,如果选择该选项,将限定查询的条件,查询结果必须满足此查询条件
  • GROUP BY 子句表明查询出来的数据按指定字段进行分组
  • HAVING 子句用于筛选组
    ORDER BY 子句指定按什么顺序显示查询出来的数据,需要指定排序字段在默认条件下MySQL 按照升序排列,也可通过代码指定升序 (ASC 默认) 或降序 (DESC)

为了提高语句的执行效率,建议:编写查询语句时采用

SELECT 字段列表 FROM 表名 WHERE 条件表达式;

3.3.1 分页查询

SELECT  <字段名列表>
FROM  <表名或视图>
[WHERE  <查询条件>]
[GROUP BY <分组的字段名>] [HAVING <条件>]
[ORDER BY <排序的字段名> [ASC 或 DESC]]
[LIMIT [位置偏移量,]行数];
# 位置偏移量:第1条记录的位置偏移量是0,第2条记录的位置偏移量是1……
# 行数:显示记录的条数

使用LIMIT子句时,第1条记录的位置是0!

LIMIT子句经常和ORDER BY子句一起使用,即先对查询结果进行排序,再根据LIMIT子句的参数返回指定的数据

3.3.2 子查询

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

SELECT …… FROM 表1 WHERE 字段1 比较运算符 (子查询);

先执行子查询,返回所有来自子查询的结果

再执行外围的父查询,返回查询的最终结果

将子查询和比较运算符联合使用

必须保证子查询返回的值不能多于一个

3.3.3 SQL 别名

  • 使用AS关键字,符合ANSI标准
SELECT 字段列表 FROM 表名 AS 表的别名
  • 使用空格,简便的方法
SELECT 字段列表 FROM 表名  表的别名;
# 中间是空格
  • 可以为表、字段、查询结果指定别名

为某个表命名了别名后,在SELECT语句中出现该表的字段需要指定表名时,就必须统一使用该表的别名;否则将产生语法错误


3.4 常用函数

SQL中将一些常用的数据处理操作封装起来,作为函数提供给程序员使用,可以提高程序员开发效率

MySQL支持的常用函数

  • 字符串函数

  • 时间日期函数

  • 聚合函数

  • 数学函数

3.4.1 字符串函数

函数名作用举例
CONCAT( str1,str1,…,strn)连接字符串str1、str2、……、strn为一个完整字符串SELECT CONCAT( ‘MySQL’,’ is powerful.'); 返回:MySQL is powerful.
LOWER(str)将字符串str中所有字符变为小写SELECT LOWER( ‘MySQL is powerful.’); 返回:mysql is powerful.
UPPER(str)将字符串str中所有字符变为大写SELECT UPPER( ‘MySQL is powerful.’); 返回:MYSQL IS POWERFUL.
SUBSTRING( str,num,len)返回字符串str的第num个位置开始长度为len的子字符串SELECT SUBSTRING( ‘MySQL is powerful.’,10,8); 返回:powerful
INSERT( str,pos,len,newstr)将字符串str从pos位置开始,len个字符长的子串替换为字符串newstrSELECT INSERT( ‘MySQL is powerful.’,10,0,'very '); 返回:MySQL is very powerful.

3.4.2 时间日期函数

函数名作用举例(部分结果与当前日期有关)
CURDATE()获取当前日期SELECT CURDATE(); 返回:2020-08-03
CURTIME()获取当前时间SELECT CURTIME(); 返回:16:54:40
NOW()获取当前日期和时间SELECT NOW(); 返回:2020-08-03 16:55:00
WEEK(date)返回日期date为一年中的第几周SELECT WEEK(NOW()); 返回:31
YEAR(date)返回日期date的年份SELECT YEAR(NOW()); 返回:2020
HOUR(time)返回时间time的小时值SELECT HOUR(NOW()); 返回:16
MINUTE(time)返回时间time的分钟值SELECT MINUTE(NOW()); 返回:56
DATEDIFF(date1,date2)返回日期参数date1和date2之间相隔的天数SELECT DATEDIFF(NOW(), ‘2019-8-8’); 返回:361
ADDDATE(date,n)计算日期参数date加上n天后的日期SELECT ADDDATE(NOW(),5); 返回:2020-08-07 16:57:28
UNIX_TIMESTAMP(date)将日期转换成时间戳SELECT UNIX_TIMESTAMP( “2020-9-1”); 返回:1598889600

3.4.3 聚合函数

函数名作用
COUNT()返回某字段的行数
MAX()返回某字段的最大值
MIN()返回某字段的最小值
SUM()返回某字段的和
AVG()返回某字段的平均值

3.4.4 数学函数

函数名作用举例
CEIL(x)返回大于或等于数值x的最小整数SELECT CEIL(-2.1); 返回:32
FLOOR(x)返回小于或等于数值x的最大整数SELECT FLOOR(-2.1); 返回:-3
RAND()返回0~1间的随机数SELECT RAND(); 返回:0.15013303621684485

BCSP-玄子JAVA开发之JAVA数据库编程CH-03_SQL高级(一)3.10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值