首页 > 其他 > 详细

高级查询(一)

时间:2020-12-23 12:51:07      阅读:26      评论:0      收藏:0      [点我收藏+]

  所包含内容:使用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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!