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存储类型的表不支持外键。因此,可以通过建立逻辑关联的方式保证数据的完整性和一致性
DML(Data Manipulation Language),DML对数据库中表记录的执行操作
插入(INSERT)
插入单行数据
插入多行数据
将查询结果插入到新表
更新(UPDATE)
删除(DELETE)
软件开发人员日常使用最频繁的操作,必备技能!!!
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 ) ;
如果新表已存在,将会报错!
UPDATE 表名 SET 字段1=值1, 字段2=值2, …, 字段n=值n [WHERE 条件];
# 改
UPDATE gradeinfo SET gradeinfo.grade='BCSP' WHERE gradeinfo.id=2;
DELETE FROM 表名 [WHERE条件];
# 删
DELETE FROM gradeinfo WHERE gradeinfo.id=1;
TRUNCATE TABLE 表名;
# 格
TRUNCATE TABLE gradeinfo;
使用TRUNCATE语句删除表中记录后,将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快
DROP | DELETE | TRUNCATE | |
---|---|---|---|
类型 | DDL 会隐式提交,不能回滚 | DML 每次从表中删除一行数据的同时将改行的删除操作记录在redo和undo表空间中,以便进行回滚和重做操作 需要手动提交操作才能生效,可通过ROLLBACK撤销操作 | DDL 会隐式提交,不会记录日志,不能回滚 |
功能 | 删除表结构及所有数据,并将标所占用的空间全部释放 | 可根据条件删除表中满足条件的数据,如果不指定WHERE子句,则删除表中所有记录 | 删除表中所有记录,并将重建表结构 |
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;
*
或<字段名列表>表示要查询的字段。若查询表中的所有字段,则使用*
;查询指定字段使用字段名列表,其中字段列表至少包含一个字段名称,若查询多个字段,则字段之间使用逗号分隔,最后一个字段后不加逗号为了提高语句的执行效率,建议:编写查询语句时采用
SELECT 字段列表 FROM 表名 WHERE 条件表达式;
SELECT <字段名列表>
FROM <表名或视图>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>] [HAVING <条件>]
[ORDER BY <排序的字段名> [ASC 或 DESC]]
[LIMIT [位置偏移量,]行数];
# 位置偏移量:第1条记录的位置偏移量是0,第2条记录的位置偏移量是1……
# 行数:显示记录的条数
使用LIMIT子句时,第1条记录的位置是0!
LIMIT子句经常和ORDER BY子句一起使用,即先对查询结果进行排序,再根据LIMIT子句的参数返回指定的数据
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
SELECT …… FROM 表1 WHERE 字段1 比较运算符 (子查询);
先执行子查询,返回所有来自子查询的结果
再执行外围的父查询,返回查询的最终结果
将子查询和比较运算符联合使用
必须保证子查询返回的值不能多于一个
SELECT 字段列表 FROM 表名 AS 表的别名
SELECT 字段列表 FROM 表名 表的别名;
# 中间是空格
为某个表命名了别名后,在SELECT语句中出现该表的字段需要指定表名时,就必须统一使用该表的别名;否则将产生语法错误
SQL中将一些常用的数据处理操作封装起来,作为函数提供给程序员使用,可以提高程序员开发效率
MySQL支持的常用函数
字符串函数
时间日期函数
聚合函数
数学函数
函数名 | 作用 | 举例 |
---|---|---|
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. |
函数名 | 作用 | 举例(部分结果与当前日期有关) |
---|---|---|
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 |
函数名 | 作用 |
---|---|
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
AVG() | 返回某字段的平均值 |
函数名 | 作用 | 举例 |
---|---|---|
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