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语句

DROP DELETE TRUNCATE
类型 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个字符长的子串替换为字符串newstr SELECT 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

你可能感兴趣的:(MySQL,mysql)