SQL语句学习

SQL基础

数据库基础操作

MYSQL数据库操作

--创建库
create database 库名;

--创建库时判断库是否存在,不存在则创建
create database if not exists 库名;

--查看所有数据库
show databases;

--切换到指定的数据库
use 库名;

--查看当前数据库包含的表
show tables;

--查看数据库的结构定义信息
show create database 库名;

--删除数据库
drop database 库名;

--修改数据库的字符集为utf8
alter database 库名 character set utf8;

MYSQL数据库表操作

--创建表
create table 表名(
字段1 类型1,
字段2 类型2,
...........);

例:创建一个学生表,其中表字段
create table student(
  sno int,           #int 整数型
  mno int,
  sname varchar(10), #varchar字符串类型
  sex bit,           #Bit称为位数据类型,其数据有两种取值:0和1,长度为1位。在输入0以外的其他值时,系统均把它们当1看待。这种数据类型常作为逻辑变量使用,用来表示真、假或是、否等二值选择。
  grade decimal(5,2), #DECIMAL是MySQL中存在的精准数据类型,以字符串的形式保存精确的原始数值,而float,double则是非精准类型,在DB中保存的是近似值。在此示例中,grade列最多可以存储5位数字,小数位数为2位;
  primary key(sno),   #primary key主键唯一
  foreign key(mno) references B表(mno)    #外键需要关联另外一个表的主键;第一个mno是本表的,具体建表时看是否关联
  )

--查看表结构
desc 表名;

--查看创建表的SQL语句
show create table 表名;

--修改表名
alter table 表名 rename to 新的表名;

--修改字段名
alter table 表名 rename column 字段名 to 新的字段名;

--删除表
drop table 表名;

--删除表时判断表是否存在,若存在则删除
drop table if exists 表名;

--删除列
ALTER TABLE 【表名】 DROP 【列名】

--增加列
ALTER TABLE 【表名】 ADD 【列名】 【类型】
举例:alter table student add transactor varchar(10) not Null; 

--重命名列
ALTER TABLE 【表名】 CHANGE 【列名】【新名】 

--修改表字段
alter table 表名 modify column 字段名 新的字段类型;
alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空];
alter table 表名称 modify 字段名称 字段类型 [是否允许非空];

--创建索引
ALTER TABLE tbl_name ADD INDEX index_name (column list);

--删除索引
ALTER TABLE tbl_name DROP INDEX index_name (column list);

添加用户
create user '用户名'@'主机名' identified by '密码';
删除用户
drop user '用户名'@'主机名';

权限管理
查询权限
show grants for '用户名'@'主机名';

授予权限
--语法
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';

--授予faker用户所有权限,在任意数据库任意表上
grant all on *.* to 'faker'@'localhost';

撤销权限
--语法
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
--撤销faker用户对test数据库中city数据表的权限
revoke update on test.city from 'faker'@'localhost';

增删改查-基本适用于sqlserver、mysql、oracle数据库

INSERT-增

insert插入单行数据
语法:insert [into] <表名> [列名] values <列值>
例:insert into Students (姓名,性别,出生日期) values ('张三','男','1983/6/15')
注意:默认只有表名,将依次插入所有列
例:insert into Students values ('张三','男','1983/6/15','null','null')

insert,select语句将现有表中的 数据添加到已有的新表中
语法:insert into <已有的新表> <列名> select <原表列名> from <原表名>
例:insert into newstudent('张三','男','1983/6/15') select name,sex,birthday from strdent
列:全部数据插入新表中 insert into newstudent from student
注意:查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致

DELETE-删

DELETE 语句来删除表的一行或者多行数据
语法: DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
<表名>:指定要删除数据的表名
ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除
WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行
LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值
例: delete from student where grade ='' order by age limit 10   --删除学生表中某个年级下前10个年龄的学生

注意: delete删除别的表有外键需要先将别的这个字段置为null
例:B表中有外键num = 1;A表中这个外键num =1,删除B表外键报错,需将A表中的这个字段num置为空
先 update A set num = NULL where num =1  
再删除 delete B where num = 1

#也可truncate使用删除
truncate table 表名

UPDATE-改

用途:更新表中原有数据,set后面,更新字段值,既可以一次一项,也可以一次多项,使用where匹配字段
语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
       UPDATE 表名称 SET 列名称1 = 新值,列名称2 = 新值,列名称n = 新值 WHERE 条件

与select联合使用
update用来更新用select选择出的数据
update 表名 set 字段名='值' select .....

SELECT-查

--查询表中所有数据
select *from 表名;

--查询表中年龄在某区间内的
--方式1 between..and..
select *from 表名 where age between 12 and 22;
--方式2 &&
select *from 表名 where age>=12 && age<=22;
--方式3 and
select *from 表名 where age>=12 and age<=22;

指定条件查询
①单个条件(or / in)
--查询表中年龄为2,12,22岁的记录
--方式1 or
select *from 表名 where age=2 or age=12 or age=22;
--方式2 in
select *from 表名 where age in(2,12,22);
②多个条件(and)
--查询users表中年龄为23,性别为女,名字为小楠的记录
select *from users where age=23 and gender='女' and name='小楠'; 

--查询表中序号不为空的记录
select *from 表名 where 表字段 is not null;
--查询user表中序号为空的记录
select *from 表名 where 表字段 is null;

模糊查询(like)
_:单个任意字符
%:多个任意个字符
--查询表中姓名第一个字为李的记录
select *from 表名 where name like '李%';
--查询表中姓名第二个字为李的记录
select *from 表名 where name like '_李%';
--查询表中姓名含有李字的记录
select *from 表名 where name like '%李%';
--查询表中姓名是两个字的记录
select *from 表名 where name like '__';

去除重复记录查询(distinct)
--查询表中不相同的记录
--select distinct 字段 from 表名;
select distinct 表字段 from 表名;

排序查询(order by)
--查询表中记录,并以升序排序
select *from 表名 order by 字段; --默认升序
 
--查询表中记录,并以降序排序
select *from 表名 order by 字段 desc;   --desc降序

--多个排序条件时,只有当第一个排序条件值一样,才会执行第二个排序条件,以此类推
--查询users表中记录,并体育成绩降序,年龄降序
select *from users order by PE desc,age desc;

聚合函数(其中as后面将字段作为新的别名,方便区分)
①计算和(sum)
select sum(字段) (as sumvalue) from 表名;
②计算最大值(max)
select max(字段) (as maxvalue) from 表名;
③计算最小值(min)
select min(字段) (as minvalue) from 表名;
④计算平均值(avg)
select avg(字段) (as avgvalue) from 表名;
⑤计算个数(count)
select count(字段) (as totalcount) from 表名;

分组查询(group by)
select 字段 from 表名 where 条件 group by  字段
或者
select 字段 from 表名 group by 字段 having  过滤条件
例:--查询users表中的记录,按照性别分组,分别查询男、女的体育成绩平均分,人数 要求:分数高于80分的人,分组之后,人数要大于2个人
select gender,avg(PE),count(id) from users where PE > 80 group by gender having count(id)>2;

分页查询(limit)
注意:第一条记录的索引是0
--查询表中的前10行条记录
select *from 表名 limit 10;
--查询表中第2~11条记录 (从第2条记录开始累加10条记录,查询结果是从第3行开始后的11条数据,即总数还是11条)
select *from 表名 limit 1,10;

子查询
select *from 表1 where 表1字段 = (select 表2字段 from 表2 where 表2字段2='AA')   --表1字段和表2字段一样
列:select *from studentinfowhere class = (select class from classinfo where className='A')

相关子查询
子级查询不能独立运行,要依赖主查询数据。
select (select name from studentinfo where studentId=e.studentId),(select courseName from courseinfo where courseId = e.courseId),score from examinfo e

将子级查询作为一个表查询
select s.name,e.courseId,e.score
from studentInfo s
join examinfo e
on s.studentId =e.studentId
join (select courseId , max(score) max_score from examInfo group by courseId) as c on e.courseId = c.courseId and e.score = c.max_score

内连接

内连接查询的是两张表的并集,也就是A表和B表都必须有数据才能查询出来;三种查询方式(看自己熟悉习惯那种)
-- join
select * from A  join B on A.id = B.id 

-- inner join
select * from A inner join B on A.id = B.id 

-- 逗号的连表方式就是内连接
select * from A , B where A.id = B.id   

左外连接和左连接

左外连接和左连接是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全称为左外连接,是外连接的一种。下面2个查询的结果是一样的
-- left join
select * from A left join B on  A.id = B.id 

-- left outer join
select * from A left outer join B on  A.id = B.id 

右外连接和右连接

右外连接和右连接是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分。右连接全称为右外连接,是外连接的一种。下面2个查询的结果是一样的
-- right join
select * from A right join B on  A.id = B.id 

-- right outer join
select * from A right outer join B on  A.id = B.id 

全连接

全连接显示两侧表中所有满足检索条件的行
select * from a left join b on a.id = b.id union select * from a right join b on a.id = b.id

1.内连接与外连接的区别是什么?
内连接和外连接的区别:
内连接:inner join(等值连接) 只返回两个表中联结字段相等的数据。
外连接:返回包括左/右表中的所有记录和右/左表中联结字段相等的记录。

2.左外连接和右外连接的区别是什么?
左外连接和右外连接的区别:
左外连接也称左连接。以左表为基表,在FROM子句中使用关键字“LEFT OUTER JOIN”或关键字“LEFT JOIN”来连接两张表。
右外连接也称右连接。以右表为基表,在FROM子句中使用关键字“RIGHT OUTER JOIN”或关键字“RIGHT JOIN”来连接两张表。

3.概括
1.内连接就是取交集的部分。
2.左连接就是左表全部的数据加上交集的数据。
3.右连接就是右表全部的数据加上交集的数据。
4.交叉连接就是数据全都要。

视图

从SQL的角度来看,视图就是一张表,存在表名、字段列
视图和实体表的区别就在与:是否保存了实际数据。
实体表中保存实际数据,使用实体表创建视图后,实体表中的数据发生变化,视图查询出的数据就会发生变化。
从视图中读取数据时,视图会在内部执行对应的SELECT语句,并创建出一张临时表。

视图的优点:简化用户操作
1.将频繁使用的查询语句保存成视图,这样就不用每次都重新写。在创建好视图后,可以将视图和其他实体表一样,在SELECT语句中进行调用
2.对于常用的联表查询,可将联表的结果创建为视图,后续使用联表结果时,不用重新写select语句,直接调用视图即可

创建视图

create view v_表名 as select * from 表名
select * from v_表名

视图数据增和改

视图也可以使用INSERT,UPDATE进行数据的增和改,但是需要符合以下条件:
(1)视图FROM子句只有一张表;
(2)未使用GROUP BY子句,未使用HAVING子句

视图新增和修改数据后,视图对应表中的数据同步修改

删除视图

drop view v_表名 

全部评论
谢谢友友分享
点赞 回复 分享
发布于 2023-09-07 23:35 重庆

相关推荐

03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
无面如何呢:用心包装一下自己的实习
点赞 评论 收藏
分享
评论
9
41
分享

创作者周榜

更多
牛客网
牛客企业服务