1. 能够通过ls、cd命令查看目录的内容及切换目录
2. 能够通过touch、mkdir命令创建文件和目录
3. 能够通过rm、cp、mv命令实现对文件或目录的删除、复制、移动操作
4. 能够通过cat、more、grep命令查看文件的内容
5. 能够通过管道符 | 分屏显示内容及过滤显示的内容
6. 能够通过重定向符号(> 、>>)输出内容到文件
清屏: ctrl + 字母l 方向键 上(上一条写过的命令) 下(下一条) history 查看最新写命令的记录 tab 自动补全 ctrl + c 中断当前操作
- 格式:
ls -lah
- 选项说明:
- -l: 以列表的形式显示出文件或目录的内容
- -a:显示所有的文件或目录,包含 隐藏文件
- -h:显示出文件的目录或者大小
- 参数:文件或者目录
- 通配符可以匹配符合条件的文件或者目录
- :表示匹配0到多个任意字符
- ? : 表示匹配单个任意字符
- [abcd] : 表示匹配括号内(a、b、c、d中的)任意的一个字符
- [a-d] : a-d表示的是从a到d的范围,也就是a、b、c、d. 从中匹配任意一个字符。
格式:
cd [目录路径]
注意:文件及目录名称区分大小写
绝对路径:绝对路径必面是以根目录(/)开头或者家目录开头(~),然后一个层级一个层级定义对应目录,目录与目录之间用 / 分隔
相对路径:不以根目录(/)或者家目录(~)开头,而是以当前路径开始,结合 返回上层路径(…)来实相对路径的切换。
- cd 或者cd ~ : 返回到家目录
- cd … : 返回到上一层目录
- cd - : 返回到上一次的目录
- touch [文件名]
- 如果创建的文件名不存在,则新建一个文件
- 如果创建的文件名已存在,则更新文件的修改时间
- mdir [-p] [目录] 多个目录之间用空格隔开
- 通过 -p的选项,实现多个层级的目录创录
eg: mkdir dir1/dir2/dir3- 如果创建的目录名称已存在,则创建失败。
- tree -a以树状显示全部
命令格式:
rm [-irf] 目录名或者文件
选项说明:
- -i :表示交互式执行删除操作,删除前会有提示(默认选项)
- -f : 表示强制删除,忽略不存在的文件
- -r : 表示删除目录及目录下所有的内容。
命令格式:
cp 源文件 目标文件
选项说明:
- -f : 强制覆盖已存在的文件而不提示
- -i : 覆盖已存在的文件时,会提示用户是否确认
- -r : 复制目录及目录下所有的内容时,必须带上-r参数
- -v : 显示复制的进度(一般不用)
命令格式:
mv 源文件 目标文件
选项说明:
- -f : 强制覆盖已存在的目标文件而不提示
- -i : 覆盖文件时提示用户是否确认
- -v : 显示移动的进度(一般不用)
- cat命令:
适用于查看文件内容较少的文件 cat [-bn]文件名
- cat 可以用来查看文件、创建文件、合并文件、追加文件
常用选项:- -b : 表示输出非空的行编号
- -n : 表示输出所有的行编号
- more命令:查看文件内容较多的文件
命令格式:more 文件名
常用的快捷 键操作:
- 空格: 显示下一页内容
- enter(回车): 滚动显示下一行
- b 键: 显示上一页内容
- f键: 显示下一页内容
- q键:退出
- grep 搜索文件并显示对应的关键字行信息
命令格式:grep '关键字' 文件名
常用选项:
- -v : 显示不包含匹配文本的所有行(取反)
- -n : 显示匹配的行及行号
- -i : 忽略大小写
- grep正则表达式(什么是正则表达式:匹配字符串的规则)
‘^a’ : 表示搜索的文件内容行是以 a 开头
‘ke$’: 表示搜索的文件内容行是以 ke 结尾
[Ss]igna[Ll]: 匹配[]中的任意一个字符,搜寻匹配单词为 SignaL、Signal、signaL、signal的行;
说明:通过管道符命令可以将一个命令的执行结果,传给另一个命令当做参数来使用。
常用的管道符命令:
more
: 分屏显示执行结果grep
: 通过grep过滤执行结果
将命令输出的结果写入到(重定向)到另外的文件当中。
将命令输出的结果覆盖到对应的文件当中
将命令输出的结果追加到对应的文件当中
pwd
: 查看当前目录的路径clear
: 清屏which
工具名称: 查找工具的安装位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72NkgyF1-1659149525091)(C:\Users\ADMINI~1\AppData\Local\Temp\1657446118925.png)]
重启 命令: reboot
关机命令: shutdown
对应的选项:
命令格式: ps -aux | grep ‘关键字’
选项说明:
一般会结合grep及管道符去查找特定的进程信息
命令格式:netstat [-anptu] |grep ‘关键字’ (root用户操作)
选项说明:
-a 选项: 查看所有已打开的端口
-n 选项: 以数字方式显示已打开的端口,不显示别名
(http:80 https:443 mysql:3306 ssh:22 )
-p 选项:显示对应的进程的PID
-t 选项: 显示出tcp协议的端口
-u 选项: 显示出udp协议的端口
例子:
tail -f 文件名
tail 文件名 默认查看文件的最后10条信息
tail -20 文件名 查看文件的最后20条信息
例子:
工作中的使用场景:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIcmopS8-1659149525092)(D:/Testing/就业学习进度/02_Linux数据库{系统命令、权限管理、vi}/01_资料/笔记day02/Linux%E6%95%B0%E6%8D%AE%E5%BA%93day02.assets/image-20210823161802334.png)]
命令格式: chmod 755 文件名
切换用户
su - : 切换到root用户, 需要输入root的密码
su 用户名: 切换到指定的用户下,如果是从root用户下切换,不需要输入密码
修改密码
passwd : 修改当前用户的密码,需要输入原密码
passwd 用户名: 修改指定用户的密码,必须通过root用户来实现.
退出登录的用户 exit
命令格式: ln -s 源文件 链接文件
说明:
打包和解包:
格式: tar -cvf 打包文件名 文件或目录 (打包)
tar -xvf 打包文件名 (解包)
选项说明:
-c : 创建打包文件
-v : 显示出打包或解包的进度
-f :用于指定打包文件名(一般f放在选项的最后,用于指定打包的文件名)
-x : 表示解包对应的文件
例子: tar -cvf test.tar 1.txt 2.txt 3.txt 将当前目录下1.txt 2.txt 3.txt文件打包到test.tar文件中
tar -cvf acd.tar acd 将当前目录下的acd目录打包到acd.tar文件中
tar -xvf test.tar 解包test.tar文件
tar -xvf acd.tar 解包acd.tar文件
压缩文件: zip [-r] 压缩文件名 文件或目录
解压缩: unzip -d 解压目录 压缩的文件名
例子:
首次进入到VI编辑器使用的是命令行模式
可以通过 i、I、a、A进入到插入模式。 在插入模式中按 ESC键可以回到命令行模式
可以通过 shift + : 进入到末行模式。
在末行模式可以通过以下快捷键来进行操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcLo9mso-1659149525095)(C:\Users\ADMINI~1\AppData\Local\Temp\1657447083380.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXqvqodR-1659149525096)(C:\Users\ADMINI~1\AppData\Local\Temp\1657447110388.png)]
-- 查看数据库
show databases;
-- 指定数据库
use sql_name;
-- 查看数据库
select database();
-- 创建数据库
create database sql_name charset=utf8;
-- 删除数据库
drop database sql_name;
-- 查看数据库所有表
show tables;
-- 查看数据库表结构
desc table_name;
-- 查看数据库表sql语句
show create table table_name;
--创建表
create table table_name(字段名 数据类型 [约束], 字段名 数据类型 [约束]);
-- 约束
主键: primary key 非空:unique_key 外键:
--删除表
DROP table table_name;
--if table_name 删除 else 不删除
DROP table if exists table_name;
--添加数据
insert into table_name values(value);
insert into table_name values(value),(value),(value)...;
INSERT into table_name (字段名)values('value');
-- 查询数据
select*from table_name;
-- 修改数据
UPDATE table_name set 修改字段名=value WHERE 条件字段名 ='value';
-- 删除一行数据
-- 物理删除,真删,删除后,找不回来
-- 一定注意写过滤条件
-- 没有加过滤条件,删除整个表
DELETE FROM table_name WHERE 删除字段名='value';
-- 删除表所有数据,保留数据结构,自增长字段从1开始,执行效率高用Drop命令
truncate table table_name;
-- 查询字段起别名
select 字段1 as 别名1,字段2 as 别名2,... from 表名;
-- 查询去重
select distinct 字段1,... from 表名;
-- 条件查询-模糊查询
-- 关键字: like
-- % :匹配任意多个字符
select * from 表名 where 字段名 like '多字符%';
-- _ : 匹配一个任意字符
select * from 表名 where 字段名 like '一个字符_';
-- 查询非!=
SELECT * FROM表名 WHERE 字段名 !='值';(推荐)
SELECT * FROM表名 WHERE 字段名 <>'值';
-- 条件查询:逻辑运算符
-- and: 同时
SELECT * FROM 表名 WHERE 条件 and 条件;
-- or : 或
SELECT * FROM 表名 WHERE 条件 or 条件;
-- not 取反
SELECT * FROM 表名 WHERE 条件(字段名!= 不等于);
-- 条件查询-范围查询
-- in表示在一个非连续的范围内
select * from 表名 where 字段名 in(条件值1,条件值2);
-- between ... and ...表示在一个连续的范围内
select * from 表名 where 字段名 between 条件值1 and 条件值2;
-- between ... and ...表示在一个连续的范围外
select * from 表名 where 字段名 not between 条件值1 and 条件值2;
-- 条件查询-空判断
-- 注意:Mysql中空表示null,与''(空)是不一样的。
-- 判断为空: is null
-- 找出空字符的记录
-- null 是空
-- '' 是空字符
SELECT * FROM 表名 WHERE 字段名 ="";
-- 判断非空: is not null
SELECT * FROM 表名 WHERE 字段名 is not null;
-- 将行数据按照字段1进行排序,如果某些字段1的值相同时,则按照字段2排序,以此类推
-- 默认按照列值从小到大排列
-- asc从小到大排列,即升序
-- desc从大到小排序,即降序
select * from 表名 order by 字段名1 asc|desc, 字段名2 asc|desc,...;
-- 分组查询
-- 按照字段分组,此字段相同的数据会被放到一个组中
-- 分组的目的是对每一组的数据进行统计
--(使用聚合函数)
总数:count(*);最大:max();最小:min();平均值avg();求和:sum()
-- 语法格式:(显示数据一般显示分组后的字段)
select 字段1,字段2,聚合函数... from 表名 group by 字段1,字段2...
-- 说明: 关键字having后面的条件运算符与where的相同
-- 分组过滤,group by后面的语句不能用where,需要使用having
-- where不能用聚合函数做条件;having可以用聚合函数做条件
SELECT 字段1,字段2,聚合函数... from 表名 group by 字段1,字段2... having 条件;
-- 分页说明:
-- 从start开始,获取count条数据
-- start索引从0开始
-- limit 起点, 每页显示的数据
-- 如果起点为0, 这个0可以不写
SELECT * from students s limit start,count;
– 数据准备
drop table if exists students;
create table students (
studentNo varchar(10) primary key,
name varchar(10),
sex varchar(1),
hometown varchar(20),
age tinyint(4),
class varchar(10),
card varchar(20)
);insert into students values
(‘001’, ‘王昭君’, ‘女’, ‘北京’, ‘20’, ‘1班’, ‘340322199001247654’),
(‘002’, ‘诸葛亮’, ‘男’, ‘上海’, ‘18’, ‘2班’, ‘340322199002242354’),
(‘003’, ‘张飞’, ‘男’, ‘南京’, ‘24’, ‘3班’, ‘340322199003247654’),
(‘004’, ‘白起’, ‘男’, ‘安徽’, ‘22’, ‘4班’, ‘340322199005247654’),
(‘005’, ‘大乔’, ‘女’, ‘天津’, ‘19’, ‘3班’, ‘340322199004247654’),
(‘006’, ‘孙尚香’, ‘女’, ‘河北’, ‘18’, ‘1班’, ‘340322199006247654’),
(‘007’, ‘百里玄策’, ‘男’, ‘山西’, ‘20’, ‘2班’, ‘340322199007247654’),
(‘008’, ‘小乔’, ‘女’, ‘河南’, ‘15’, ‘3班’, null),
(‘009’, ‘百里守约’, ‘男’, ‘湖南’, ‘21’, ‘1班’, ‘’),
(‘010’, ‘妲己’, ‘女’, ‘广东’, ‘26’, ‘2班’, ‘340322199607247654’),
(‘011’, ‘李白’, ‘男’, ‘北京’, ‘30’, ‘4班’, ‘340322199005267754’),
(‘012’, ‘孙膑’, ‘男’, ‘新疆’, ‘26’, ‘3班’, ‘340322199000297655’);– 查询部分字段数据:
– select 字段1,字段2,… from 表名
select * from students s ;
SELECT name,sex,hometown from students s ;– 起别名: 为第5天的关联查询做铺垫,现在作用不大
– select 别名.字段1,别名.字段2,… from 表名 as 别名
– 把students改为名s, as可以省略– select 字段1 as 别名1,字段2 as 别名2,… from 表名
select name as 姓名,sex as 性别 ,hometown as 地址,age as 年龄,class as 班级,card as 身份证 from students;
– 去重:
– select distinct 字段1,… from 表名
select DISTINCT sex from students ;– 条件查询:比较运算符
– 例1:查询小乔的年龄
select age from students s WHERE name =‘小乔’;
– 例2:查询20岁以下的学生
select * from students s WHERE age < 20;
– 例3:查询家乡不在北京的学生
SELECT * FROM students s WHERE hometown !=‘北京’;
SELECT * FROM students s WHERE hometown <>‘北京’;
– 1、查询学号是’007’的学生的身份证号
SELECT card from students s WHERE studentNo =007;
– 2、查询’1班’以外的学生信息
SELECT * FROM students s WHERE class =‘1班’;– 3、查询年龄大于20的学生的姓名和性别
SELECT s.name ,s.sex FROM students s WHERE age >20;– 条件查询:逻辑运算符
– 例1:查询年龄小于20的女同学
– and: 同时
– 下面是错误的写法
SELECT * FROM students s WHERE age >20 and sex =‘女’;– 例2:查询女学生或’1班’的学生
SELECT * FROM students s WHERE class =‘1班’ and sex =‘女’;
– 例3:查询天津的学生
SELECT * FROM students s WHERE hometown =‘天津’ ;
– 例3:查询非天津的学生
– not 取反
SELECT * FROM students s WHERE hometown !=‘天津’ ;
– 1、查询河南或河北的学生
SELECT * FROM students s WHERE hometown =‘河南’ or hometown =‘河北’ ;
– 2、查询’1班’的’上海’的学生
SELECT * FROM students s WHERE hometown =‘上海’ AND class =‘1班’ ;
– 3、查询非20岁的学生
SELECT * FROM students s WHERE age !=20;– 条件查询-模糊查询
– 关键字: like
– % :匹配任意多个字符
– _ : 匹配一个任意字符– 例1:查询姓孙的学生
SELECT * FROM students s WHERE name like ‘孙%’;
– 例2:查询姓孙且名字是一个字的学生
SELECT * FROM students s WHERE name like ‘孙_’;
– 例3:查询姓名以‘乔’结尾的学生
SELECT * FROM students s WHERE name like ‘%乔’;
– 例4:查询姓名中包含‘白’的学生
SELECT * FROM students s WHERE name like ‘%白%’;– 1、查询姓名为两个字的学生
SELECT * FROM students s WHERE name like ‘__’;
– 2、查询姓‘百’且年龄大于20的学生
SELECT * FROM students s WHERE age >20 AND name like ‘百%’;
– 3、查询学号以1结尾的学生– 条件查询-范围查询
– in表示在一个非连续的范围内
– 例:查询家乡是北京或上海或广东的学生
SELECT * FROM students s WHERE hometown IN (‘北京’,‘上海’,‘广东’);
– between … and …表示在一个连续的范围内
– 例:查询年龄为18至20的学生
select * from students s WHERE age BETWEEN 18 and 20;– 1、查询年龄为18或19或22的女生
SELECT * FROM students s WHERE age IN (18,19,22) AND sex =‘女’;
– 2、查询年龄在20到25以外的学生
select * from students s WHERE age<20 and age>25;– 条件查询-空判断
– 注意:Mysql中空表示null,与’'(空)是不一样的。
– 判断为空: is null
– 例:查询没有填写身份证的学生
SELECT * FROM students s WHERE card =“”;
– 判断非空: is not null
– 例:查询填写了身份证的学生
SELECT * FROM students s WHERE card is not null;
– 找出空字符的记录
– null 是空
– ‘’ 是空字符– select * from 表名 order by 字段名1 asc|desc, 字段名2 asc|desc,…
– 将行数据按照字段1进行排序,如果某些字段1的值相同时,则按照字段2排序,以此类推
– 默认按照列值从小到大排列
– asc从小到大排列,即升序
– desc从大到小排序,即降序– 例1:查询所有学生信息,按年龄从小到大排序(升序)
select * FROM students s order by age asc;
– 例2:查询所有学生信息,按年龄从大到小排序(降序),年龄相同时,再按学号从小到大排序(升序)
SELECT * FROM students s order by age DESC ,studentNo asc;
– 例2:查询所有学生信息,按年龄从大到小排序(降序),年龄相同时,再按学号从大到小排序(降序)
SELECT * FROM students s order by age DESC ,studentNo desc;– 1、查询所有学生信息,按班级从小到大排序(升序),班级相同时,再按学号从小到大排序(升序)
SELECT * FROM students s order by class ASC ,studentNo asc;– 聚合函数: 用于统计,一般配合分组使用
– 例1:查询学生总数 count()
SELECT COUNT() from students s ;
– 例2:查询女生的最大年龄 max()
SELECT MAX(age) from students s ;
– 例:查询1班的最小年龄 min()
SELECT Min(age) from students s WHERE class =‘1班’ ;– 示例:查询北京学生的年龄总和 sum()
SELECT sum(age) from students s WHERE hometown =‘北京’;
– 例:查询女生的平均年龄 avg()
SELECT AVG(age) from students s WHERE sex =‘女’;– 1、查询所有学生的最大年龄、最小年龄、平均年龄
SELECT MAX(age),MIN(age),AVG(age) from students s ;
– 2、一班共有多少个学生
SELECT COUNT() from students s WHERE class =‘1班’;
– 3、查询3班年龄小于18岁的同学有几个
SELECT COUNT() from students s WHERE class =‘3班’ AND age <18;
– 分组查询
– 按照字段分组,此字段相同的数据会被放到一个组中
– 分组的目的是对每一组的数据进行统计(使用聚合函数)
– 语法格式:
– select 字段1,字段2,聚合函数… from 表名 group by 字段1,字段2…– 例1:查询各种性别的人数
– 查看分组后的性别
– 查询各种性别的人数
– 查询各种性别的人数, 每组最大年龄, 每组最小年龄
SELECT sex, COUNT(*),MAX(age),MIN(age) from students s group by sex;– 例2:查询每个班级中各种性别的人数, 各种性别的最小年龄
SELECT class ,sex,COUNT(*),MIN(age) from students s group by class,sex;– 分组后的数据筛选
– 语法格式:
– select 字段1,字段2,聚合… from 表名 group by 字段1,字段2,字段3…having 条件
– 说明: 关键字having后面的条件运算符与where的相同
– 例1:查询男生总人数(使用了分组)
– 分组过滤,group by后面的语句不能用where,需要使用having
– SELECT sex, COUNT() from students group by sex where sex = ‘男’; – err
– group by前面的语句可以使用where
SELECT sex ,COUNT() from students s group by sex having sex=‘男’;
– 例2:查询男生总人数(不使用分组)
– 没有使用分组,过滤使用where
SELECT sex,COUNT(*) from students s WHERE sex =‘男’;– 1、查询各个班级学生的平均年龄、最大年龄、最小年龄
SELECT class,MAX(age),MIN(age) from students s group by class ;
– 2、查询1班除外其他班级学生的平均年龄、最大年龄、最小年龄
SELECT class,MAX(age),MIN(age) from students s group by class HAVING class !=‘1班’;
– where 后面不能用聚合函数作为条件, having 可以
– 3、查询所有班级中不同性别的记录数(个数)大于1的信息
– 所有班级 按班级分组
– 不同性别 在按性别分组
– 记录数(个数) 聚合函数
SELECT class,sex,COUNT() from students s group by class ,sex HAVING COUNT()>1;– 分页显示
– 语法格式:
– select * from 表名 limit start,count;– 说明:
– 从start开始,获取count条数据
– start索引从0开始– 例1:查询前3行学生信息
– limit 起点, 每页显示的数据
– 如果起点为0, 这个0可以不写
SELECT * from students s limit 0,3;– 每一页显示4个数据
SELECT * from students s limit 0,4;– 每一页显示5个数据
SELECT * from students s limit 0,5;
– 1、查询第4到第6行学生信息
SELECT * from students s limit 3,3;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m86LEcyi-1659149525098)(D:\桌面\SQL笔记\linux笔记\9eb69fb83870734c4ac85a8fa6411cf0.png)]
连接两个表时,取的是两个表中都存在的数据。(取交集)
select * from 表名1 inner join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)
连接两个表时,取的是左表中特有的数据,对于右表中不存在的数据,用null来填充
select * from 表名1 left join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)
连接两个表时,取的是右表中特有的数据,对于左表中不存在的数据,用null来填充
select * from 表名1 right join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)
要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
select * from 表名 as 别名1 inner join 表名 as 别名2 on 别名1.列=别名2.列
select * from 表名 where 字段名 条件表(select 字段名 from 表名);
drop table if exists students;
create table students (
studentNo varchar(10) primary key,
name varchar(10),
sex varchar(1),
hometown varchar(20),
age tinyint(4),
class varchar(10),
card varchar(20)
);insert into students values
(‘001’, ‘王昭君’, ‘女’, ‘北京’, 20, ‘1班’, ‘340322199001247654’),
(‘002’, ‘诸葛亮’, ‘男’, ‘上海’, 18, ‘2班’, ‘340322199002242354’),
(‘003’, ‘张飞’, ‘男’, ‘南京’, 24, ‘3班’, ‘340322199003247654’),
(‘004’, ‘白起’, ‘男’, ‘安徽’, 22, ‘4班’, ‘340322199005247654’),
(‘005’, ‘大乔’, ‘女’, ‘天津’, 19, ‘3班’, ‘340322199004247654’),
(‘006’, ‘孙尚香’, ‘女’, ‘河北’, 18, ‘1班’, ‘340322199006247654’),
(‘007’, ‘百里玄策’, ‘男’, ‘山西’, 20, ‘2班’, ‘340322199007247654’),
(‘008’, ‘小乔’, ‘女’, ‘河南’, 15, ‘3班’, null),
(‘009’, ‘百里守约’, ‘男’, ‘湖南’, 21, ‘1班’, ‘’),
(‘010’, ‘妲己’, ‘女’, ‘广东’, 26, ‘2班’, ‘340322199607247654’),
(‘011’, ‘李白’, ‘男’, ‘北京’, 30, ‘4班’, ‘340322199005267754’),
(‘012’, ‘孙膑’, ‘男’, ‘新疆’, 26, ‘3班’, ‘340322199000297655’);drop table if exists courses;
create table courses (
courseNo int(10) unsigned primary key auto_increment,
name varchar(10)
);
insert into courses values (null, ‘数据库’), (null, ‘qtp’), (null, ‘linux’),
(null, ‘系统测试’), (null, ‘单元测试’), (null, ‘测试过程’);drop table if exists scores;
create table scores (
id int(10) unsigned primary key auto_increment,
courseNo int(10),
studentno varchar(10),
score tinyint(4)
);
insert into scores values (0, 1, ‘001’, 90), (0, 1, ‘002’, 75),
(0, 2, ‘002’, 98),(0, 3, ‘001’, 86),(0, 3, ‘003’, 80),
(0, 4, ‘004’, 79),(0, 5, ‘005’, 96),(0, 6, ‘006’, 80);/*
连接查询-内连接
语法格式:select * from 表1 inner join 表2 on 表1.列=表2.列
另一种写法:
select * from 表1,表2 where 表1.列=表2.列
*/– 案例
– 例1: 查询学生信息及学生的成绩
– 起别名可以不写as
select * FROM students s
inner join scores sc on s.studentNo =sc.studentno ;– 例2: 查询课程信息及课程的成绩
SELECT * FROM courses c
inner join scores s on c.courseNo =s.courseNo ;– 例3: 查询王昭君的成绩, 要求显示姓名、 课程号、 成绩
– 步骤1: 查询所有人成绩, 要求显示姓名、 课程号、 成绩
SELECT * from students s
inner join scores sc on s.studentNo = sc.studentno ;
– 步骤2: 查询王昭君的成绩, 要求显示姓名、 课程号、 成绩
SELECT s.name ,sc.courseNo ,sc.score from students s
inner join scores sc on s.studentNo = sc.studentno
where s.name =‘王昭君’;– 1、 查询学生信息及学生的课程对应的成绩
SELECT * from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on c.courseNo =sc.studentNo ;
– 2、 查询所有学生的数据库成绩, 要求显示姓名、 课程名、 成绩
SELECT s.name ,c.name ,sc.score from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on sc.courseNo =c.courseNo
where c.name =‘数据库’;– 3、 查询王昭君的数据库成绩, 要求显示姓名、 课程名、 成绩
SELECT s.name ,c.name ,sc.score from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on sc.courseNo =c.courseNo
where s.name =‘王昭君’ and c.name =‘数据库’;– 4、 查询男生中最高成绩, 要求显示姓名、 课程名、 成绩
SELECT s.name ,c.name ,MAX(sc.score ) from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on sc. courseNo =c.courseNo
where s.sex = ‘男’ ;
SELECT s.name ,c.name ,sc.score from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on sc. courseNo =c.courseNo
where s.sex = ‘男’ order by sc.score desc LIMIT 1;– 5、 查询男生中前3名最高成绩, 要求显示姓名、 课程名、 成绩
SELECT s.name ,c.name ,sc.score from students s
inner join scores sc on s.studentNo =sc.studentNo
inner join courses c on c. courseNo =sc.studentNo
where s.sex = ‘男’ order by sc.score desc limit 0,3;/*
连接查询-左连接
语法格式:
select * from 表1 left join 表2 on 表1.列=表2.列*/
– 例1:查询所有学生的成绩,包括没有成绩的学生
select * FROM students st
left join scores sc on sc.studentno =st .studentNo ;– 例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
select st.name ,c.name from students st
left join scores sc on st.studentNo = sc.studentno
LEFT JOIN courses c on c.courseNo =sc.courseNo ;/*
连接查询-右连接
语法格式:
select * from 表1 right join 表2 on 表1.列=表2.列
*/– 例1:查询所有学生的成绩,包括没有成绩的学生
SELECT * FROM scores sc
right join students st on st.studentNo =sc.studentno ;
select * FROM students st
right join scores sc on sc.studentno =st .studentNo ;– 例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
SELECT st.name , co.name FROM courses co
right join scores sc on co.courseNo =sc.courseNo
right join students st on st.studentNo =sc.studentno ;– 自关联数据准备
drop table if exists areas;
create table areas(aid varchar(10) primary key, atitle varchar(20),pid varchar(10));insert into areas values (‘130000’, ‘河北省’, NULL), (‘130100’, ‘石家庄市’, ‘130000’),
(‘130400’, ‘邯郸市’, ‘130000’), (‘130600’, ‘保定市’, ‘130000’),(‘130700’, ‘张家口市’, ‘130000’),
(‘130800’, ‘承德市’, ‘130000’),(‘410000’, ‘河南省’, NULL), (‘410100’, ‘郑州市’, ‘410000’),
(‘410300’, ‘洛阳市’, ‘410000’),(‘410500’, ‘安阳市’, ‘410000’),(‘410700’, ‘新乡市’, ‘410000’),
(‘410800’, ‘焦作市’, ‘410000’),(‘410101’, ‘中原区’, ‘410100’),(‘410102’, ‘二七区’, ‘410100’),
(‘410301’, ‘洛龙区’, ‘410300’);/*
- 要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
- 自关联要用别名
- 语法格式
select * from 表名 as 别名1 inner join 表名 as 别名2 on 别名1.列=别名2.列
*/– 案例
– 查询出河南省所有的市
– 步骤1:没有过滤的
select * from areas a1
inner join areas a2 on a1.aid =a2.pid ;
– 步骤2:过滤,只要’河南省’
select * from areas a1
inner join areas a2 on a1.aid =a2.pid WHERE a1.atitle =‘河南省’;– 查询出郑州市所有的区
select * from areas a1
inner join areas a2 on a1.aid =a2.pid WHERE a1.atitle =‘郑州市’;– 查询出河南省所有的市区信息
select * from areas a1
inner join areas a2 on a1.aid =a2.pid
inner JOIN areas a3 on a2.aid =a3.pid ;
– 查询出河南省所有的市区信息,包含没有区的信息
select * from areas a1
inner join areas a2 on a1.aid =a2.pid
LEFT JOIN areas a3 on a2.aid =a3.pid where a1.atitle =‘河南省’;– 练习
– 1、 查询河北省所有的市的信息
select * from areas a1
inner join areas a2 on a1.aid =a2.pid WHERE a1.atitle =‘河北省’;
– 2、 查询出洛阳市所有的区的信息
select * from areas a1
inner join areas a2 on a1.aid =a2.pid WHERE a1.atitle =‘洛阳市’;/*
将一条SQL查询的语句嵌入在其他的SQL语句中,被嵌入的SQL语句称之为子查询,其他的SQL称之为主查询
- 子查询select语句,要么是充当条件,要么充当数据源
- 子查询语句是一条完整的select语句,且可以单独执行
*/– 子查询充当条件
– 例1:查询王昭君的成绩,要求显示成绩(标量子查询)
– 步骤1: 找到王昭君的学号
SELECT studentNo FROM students WHERE name =‘王昭君’ ;
– 步骤2:通过学号找成绩
SELECT score FROM scores WHERE studentNo =
(SELECT studentNo FROM students WHERE name =‘王昭君’ );– 例2:查询18岁的学生的成绩,要求显示成绩(列子查询)
– 步骤1:找18岁学生的学号
– 结果竖着,列的内容 (002, 006)
select studentNo FROM students WHERE age =18;
– 步骤2:找学号对应的成绩
SELECT score FROM scores
WHERE studentno in (select studentNo FROM students WHERE age =18) ;
– 例3:查询和王昭君同班、同龄的学生信息(行子查询)
– 步骤1:查询王昭君班级、年龄是多少
– 结果为横着,行结果, ‘1班’, 20
SELECT class, age from students where name = ‘王昭君’;
– 步骤2:查询和王昭君同班、同龄的学生信息
SELECT * FROM students
WHERE (class,age)=(SELECT class, age from students where name = ‘王昭君’) ;– 子查询充当数据源
– 例1:查询数据库和系统测试的课程成绩
select * from courses WHERE name in (‘数据库’,‘系统测试’);
SELECT * FROM scores sc
inner join (select * from courses WHERE name in (‘数据库’,‘系统测试’) )
as co on sc.courseNo =co.courseNo;
– 练习
– 1、 查询大于平均年龄的学生
select * from students WHERE age >(SELECT AVG(age) from students );
– 2、 查询年龄在18-20之间的学生的成绩
select * from students WHERE age in
(SELECT age from students WHERE age BETWEEN 18 and 20 );