所包含内容:使用SQL语句实现数据添加、修改、查询,修改表、为表添加约束
1、修改表:
在创建了表后,我们可能会因为某些原因需要修改表结构,如添加列等。如果将表删除后重建,往往可实现性不高,风险较大,此时需要原来已存在的数据表结构上对其进行修改,使用alter关键字实现。
1.1、修改表名
在一个数据库中,表名是唯一的。可以通过SQL语句对已创建的表修改表名,语法如下:
alter table<旧表名> rename [to] <新表名>;
其中,to为可选参数,使用与否不影响结果。接下来可省略的皆会以[]框住。此语法仅修改表名,表结构不变。
1.2、添加字段
随着业务需求变化,可能需要向已存在的表中添加新的字段,添加字段的语法如下:
alter table 表名 add 字段名 数据类型 [属性];
1.3、修改字段
数据表中一个字段中包含字段名和数据类型,因此如果实现修改字段,可以包括修改字段名和修改数据存储的类型,语法如下:
alter table 表名 change 原字段名 新字段名 数据类型 [属性];
1.4、删除字段
删除字段是将数据表中的某个字段从表中移出,语法如下:
alter table 表名 drop 字段名;
1.5、添加主键约束
添加单个主键字段:alter table 表名 add constraint 主键名 primary key 表名(主键字段);
添加组合主键:alter table 表名 add constraint 主键名 primary key 表名(主键1,主键2,……);
1.6、添加外键约束
alter table 表名 add constraint 外键名 foreign key (外键字段) references 关联表名 (关联字段);
2、DML语句
2.1、插入数据记录
插入单行数据:insert into 表名 [(字段名列表)] values (值列表);
其中:
表的字段名是可选的,如果省略,则依次插入所有字段。
多个列表和多个值之间使用逗号分隔。
值列表必须和字段名列表数量相同,且数据类型相符。
如果插入的是表中部分数据,字段名列表必须填写。
插入多行数据:insert into 新表(字段名列表) values(值列表1),(值列表2),……,(值列表n);
将查询结果插入到新表
语法1:
insert into 新表(字段1,字段2,……)
select 字段1,字段2,……
from 原表;
语法2:
create table 新表 (select 字段1,字段2,……from 原表);
其中,语法1需要先按照所插入字段的类型、顺序、个数创建新表,才能插入数据,语法2随插入语句的执行而创建新表。
2.2、更新数据记录
对表中数据进行更新是一类频繁发生的操作,语法如下:
update 表名 set 字段1=值1,字段2=值2,……,字段n=值n [where 条件];
2.3、删除数据记录
语法1:
delete from 表名 [where 条件];
语法2:
truncate table 表名;
注意:truncate语句实现删除表中所有数据,删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比delete快。
3、DQL语句
语法如下:
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[having <条件>]
[order by <排序的字段名>[ASC或DESC]];
[limit [位置偏移量,]行数];
位置偏移量指从结果集中第几条数据开始显示(第一条记录的偏移量是0,第二条的偏移量是1,依此类推)
行数指显示记录的条数
4、常用函数
4.1、聚合函数
函数名 | 作用 |
avg() | 返回某字段的平均值 |
count() | 返回某字段的行数 |
max() | 返回某字段的最大值 |
min() | 返回某字段的最小值 |
sum() | 返回某字段的和 |
4.2、字符串函数
函数名 | 作用 | 举例 |
concat(str1,str2,……,strn) | 连接字符串str1、str2、……、strn为一个完整字符串 |
select concat(‘My‘,‘S‘,‘QL‘); 返回:MySQL |
insert(str,pos,len,newstr) |
将字符串str从pos位置开始, len个字符长的子串替换为字符串newstr |
select insert(‘这是SQL Server数据库‘,3,10,‘MySQL‘); 返回:这是MySQL数据库 |
lower(str) | 将字符串str中所有字符变为小写 |
select lower(‘MySQL‘); 返回:mysql |
upper(str) | 将字符串str中所有字符变为大写 |
select upper(‘MySQL‘); 返回:MYSQL |
substring(str,num,len) |
返回字符串str的第num个位置 开始长度为len的子字符串 |
select substring(‘JavaMySQLOracle‘,5,5); 返回:MySQL |
4.3、时间日期函数
函数名 | 作用 | 举例(部分结果与当前日期有关) |
curdate() | 获取当前日期 |
select curdate(); 返回:2020-12-23 |
curtime() | 获取当前时间 |
select curtime(); 返回:09:48:12 |
now() | 获取当前日期和时间 |
select now(); 返回:2020-12-23 09:48:12 |
week(date) | 返回日期date为一年中的第几周 |
select week(now()); 返回:51 |
year(date) | 返回日期date的年份 |
select year(now()); 返回:2020 |
hour(time) | 返回时间time的小时值 |
select hour(now()); 返回:9 |
minute(time) | 返回时间time的分钟值 |
select minute(now()); 返回:48 |
datediff(date1,date2) | 返回日期参数date1与date2之间相隔的天数 |
select datediff(now(),‘2020-12-22‘); 返回:1 |
adddate(date,n) | 计算日期参数date加上n天后的日期 |
select adddate(now(),5); 返回:2020-12-28 09:48:12 |
4.4、数学函数
函数名 | 作用 | 举例 |
ceil(x) | 返回大于或等于数值x的最小整数 |
select ceil(2.3); 返回:3 |
floor(x) | 返回小于或等于数值x的最大整数 |
select floor(2.3); 返回:2 |
rand() | 返回0~1间的随机数 |
select rand() 返回:0.314151292 |
5、子查询
5.1、简单子查询
语法:select …… from 表1 where 字段1 比较运算符 (子查询);
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。
5.2、in和not in子查询
in子查询:
使用in关键字可以使父查询匹配子查询返回的多个单字段值,用于检测某字段的值是否存在于某个范围中,可以解决“Subquery returns more than 1 row”的问题,也就是子查询返回值不唯一。
SELECT student.`studentNo`,studentName,studentResult FROM student,result WHERE student.`studentNo` =( SELECT studentNo FROM result WHERE studentResult > 90 )AND student.`studentNo` = result.`studentNo`;
比如,以上查询考试成绩在90分以上的所有学生学号、姓名及成绩时,返回结果多余一个,便会报出错误。
而这时,我们只需要将比较运算符”=“替换为“in”就好了。
not in子查询:
在in前加上not表示否定,检测某字段的值是否不存在于某个范围中,与in子查询的用法相似,作用相反。
原文:https://www.cnblogs.com/zhake/p/14173357.html