Lnux数据库

 1. 能够通过ls、cd命令查看目录的内容及切换目录
2. 能够通过touch、mkdir命令创建文件和目录
3. 能够通过rm、cp、mv命令实现对文件或目录的删除、复制、移动操作
4. 能够通过cat、more、grep命令查看文件的内容
5. 能够通过管道符 | 分屏显示内容及过滤显示的内容
6. 能够通过重定向符号(>>>)输出内容到文件
清屏:        ctrl +  字母l
方向键        上(上一条写过的命令)  下(下一条)
history      查看最新写命令的记录
tab          自动补全
ctrl  +  c   中断当前操作

第一节:Liunx操作命令

1.1【重点】 查看目录内容:ls

  • 格式: ls -lah
    • 选项说明:
      • -l: 以列表的形式显示出文件或目录的内容
      • -a:显示所有的文件或目录,包含 隐藏文件
      • -h:显示出文件的目录或者大小
    • 参数:文件或者目录
  • 通配符可以匹配符合条件的文件或者目录
      • :表示匹配0到多个任意字符
    • ? : 表示匹配单个任意字符
    • [abcd] : 表示匹配括号内(a、b、c、d中的)任意的一个字符
    • [a-d] : a-d表示的是从a到d的范围,也就是a、b、c、d. 从中匹配任意一个字符。

1.2【重点】目录切换:cd

  • 格式: cd [目录路径]

  • 注意:文件及目录名称区分大小写

  • 绝对路径:绝对路径必面是以根目录(/)开头或者家目录开头(~),然后一个层级一个层级定义对应目录,目录与目录之间用 / 分隔

  • 相对路径:不以根目录(/)或者家目录(~)开头,而是以当前路径开始,结合 返回上层路径(…)来实相对路径的切换。

    • cd 或者cd ~ : 返回到家目录
    • cd … : 返回到上一层目录
    • cd - : 返回到上一次的目录

2.1【了解】创建文件:touch

  • touch [文件名]
    • 如果创建的文件名不存在,则新建一个文件
    • 如果创建的文件名已存在,则更新文件的修改时间

2.2【重点】创建目录:mkdir

  • mdir [-p] [目录] 多个目录之间用空格隔开
    • 通过 -p的选项,实现多个层级的目录创录
      eg: mkdir dir1/dir2/dir3
    • 如果创建的目录名称已存在,则创建失败。
    • tree -a以树状显示全部

3.1【重点】删除文件或目录:rm

命令格式: rm [-irf] 目录名或者文件

选项说明:

  • -i :表示交互式执行删除操作,删除前会有提示(默认选项)
  • -f : 表示强制删除,忽略不存在的文件
  • -r : 表示删除目录及目录下所有的内容。

3.2【重点】文件或目录的复制:cp

命令格式: cp 源文件 目标文件

选项说明:

  • -f : 强制覆盖已存在的文件而不提示
  • -i : 覆盖已存在的文件时,会提示用户是否确认
  • -r : 复制目录及目录下所有的内容时,必须带上-r参数
  • -v : 显示复制的进度(一般不用)

3.3【重点】文件或目录的移动:mv

命令格式: mv 源文件 目标文件

选项说明:

  • -f : 强制覆盖已存在的目标文件而不提示
  • -i : 覆盖文件时提示用户是否确认
  • -v : 显示移动的进度(一般不用)

4.1【知道】查看文件内容:cat

  • cat命令: 适用于查看文件内容较少的文件 cat [-bn]文件名
    • cat 可以用来查看文件、创建文件、合并文件、追加文件
      常用选项:
    • -b : 表示输出非空的行编号
    • -n : 表示输出所有的行编号

4.2【知道】查看文件内容:more

  • more命令:查看文件内容较多的文件
    命令格式: more 文件名
    常用的快捷 键操作:
    • 空格: 显示下一页内容
  • enter(回车): 滚动显示下一行
    • b 键: 显示上一页内容
    • f键: 显示下一页内容
    • q键:退出

4.3【重点】查看文件内容:grep

  • grep 搜索文件并显示对应的关键字行信息
    命令格式: grep '关键字' 文件名
    常用选项:
    • -v : 显示不包含匹配文本的所有行(取反)
    • -n : 显示匹配的行及行号
    • -i : 忽略大小写
  • grep正则表达式(什么是正则表达式:匹配字符串的规则)
    ‘^a’ : 表示搜索的文件内容行是以 a 开头
    ‘ke$’: 表示搜索的文件内容行是以 ke 结尾
    [Ss]igna[Ll]: 匹配[]中的任意一个字符,搜寻匹配单词为 SignaL、Signal、signaL、signal的行;

5.1【知道】管道符命令 |

说明:通过管道符命令可以将一个命令的执行结果,传给另一个命令当做参数来使用。

常用的管道符命令:

  • more: 分屏显示执行结果
  • grep: 通过grep过滤执行结果

6.1【知道】重定向:>和>>

将命令输出的结果写入到(重定向)到另外的文件当中。

将命令输出的结果覆盖到对应的文件当中

将命令输出的结果追加到对应的文件当中

7.1【了解】其他的命令:pwd、clear、which

  • pwd : 查看当前目录的路径
  • clear: 清屏
  • which 工具名称: 查找工具的安装位置

8.总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72NkgyF1-1659149525091)(C:\Users\ADMINI~1\AppData\Local\Temp\1657446118925.png)]

第二节 Liunx命令及权限命令

1.【了解】重启和关机的命令

  • 重启 命令: reboot

  • 关机命令: shutdown

    对应的选项:

    • shutdown -r now 表示重启时,会给其他用户发送提示信息
    • shutdown -h now 表示立刻关机
    • shutdown -h 20:25 表示定时关机, 晚上8:25定时关机
    • shutdown -h +10 表示从当前时再往后十分钟进行关机

2.【重点】查看系统进程:ps

命令格式: ps -aux | grep ‘关键字’

选项说明:

  • -a 选项: 显示所有用户的进程
  • -u选项:显示进程的详细状态
  • -x选项:显示没有控制终端进程

一般会结合grep及管道符去查找特定的进程信息

  • 例子: ps -aux | grep ‘sedispatch’ 查找系统进程当中包含 sedispatch 关键字的进程信息
    • 另一种写法: ps -ef|grep ‘sedispatch’ (苹果电脑用此方法)

3.【知道】实时查看系统的进程信息:top

  • 命令: top
  • 快捷键:
    • M(按shift+m) 可以按内存的使用率降序排列显示进程的信息
    • P(按shift+p) 可以按cpu的使用率降序排列显示进程的信息

4.【重点】关闭进程:kill

    • 命令格式: kill -9 进程ID
      • 进程id一般会通过ps命令去查看到。
      • -9 表示的是强制的关闭对应的进程。
    • 注意:需要注意当前执行操作的用户,普通用户不能关闭其他用户的进程,只能关闭自己打开的进程

5.【重点】查看系统监听端口:netstat

  • 命令格式:netstat [-anptu] |grep ‘关键字’ (root用户操作)

  • 选项说明:

    • -a 选项: 查看所有已打开的端口

    • -n 选项: 以数字方式显示已打开的端口,不显示别名

      (http:80 https:443 mysql:3306 ssh:22 )

    • -p 选项:显示对应的进程的PID

    • -t 选项: 显示出tcp协议的端口

    • -u 选项: 显示出udp协议的端口

  • 例子:

    • 查看当前系统中已打开的TCP协议端口: netstat -anpt
    • 查看当前系统中是否已打开3306的端口: netstat -anptu | grep ‘3306’
    • 查看当前系统中是否已打开http的服务: netstat -aptu | grep ‘http’
    • mac: netstat -anp tcp

6.【知道】查看系统监听端口:lsof

  • 命令格式: lsof -i (root用户操作)
    • -i: 表示查看所有已打开的进程的端口
      • lsof -i: 端口号 表示查看特定的端口是否已打开。
  • 例子: 查看系统所有已打开的进程端口: lsof -i
    • 查看系统中3306的端口是否已打开: lsof -i:3306
    • 查看系统中http的服务端口是否已打开: lsof -i:80
  • 使用场景:
    • 当我们去启动某个应用程序时,该 应用程序的端口有可能被其他程序所占用。
    • 那么此时就可以通过netstat 或者 lsof 查看对应的端口被谁占用了。
    • 然后关闭对应的进程,重新启动要启动的应用程序即可。

7.【了解】查看日志信息:head

  • head 文件名
    • 默认查看文件前10条信息
    • head -20 文件名 : 查看文件的前20条信息
    • 例子: head -30 log.log 查看当前目录下log.log 的前30条信息

8.【重点】查看日志信息: tail

  • tail -f 文件名

    • tail 文件名 默认查看文件的最后10条信息

    • tail -20 文件名 查看文件的最后20条信息

      • tail -f 文件名 实时查看日志的文件信息
    • 例子:

      • tail -30 log.log 查看当前目录下log.log 文件的最后30条信息
      • tail -f log.log 实时查看当前目录下log.log文件的日志信息
  • 工作中的使用场景:

    • 当测试发现问题时,需要去查看后台的日志信息,具体操作步骤:
      • 通过tail -f 日志文件名 (实时打开对应的日志文件并查看)
      • 操作系统复现对应的问题(此时会将操作中出现错误的日志信息打印到tail -f 的查看窗口中)

9.【了解】查看操作系统信息

  • cat /proc/version
    • 查看当前操作系统版本信息

10.【了解】权限的概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIcmopS8-1659149525092)(D:/Testing/就业学习进度/02_Linux数据库{系统命令、权限管理、vi}/01_资料/笔记day02/Linux%E6%95%B0%E6%8D%AE%E5%BA%93day02.assets/image-20210823161802334.png)]

11.【重点】修改用户权限chmod:数字法

  • 命令格式: chmod 755 文件名

    image-20210819150446453

12.【了解】查看登录用户

  • 查看当前登录的用户: who

13.【知道】切换用户、修改密码、退出

  • 切换用户

    su - : 切换到root用户, 需要输入root的密码

    su 用户名: 切换到指定的用户下,如果是从root用户下切换,不需要输入密码

  • 修改密码

    passwd : 修改当前用户的密码,需要输入原密码

    passwd 用户名: 修改指定用户的密码,必须通过root用户来实现.

  • 退出登录的用户 exit

    • 如果是图形界面,退出当前终端。
    • 如果是使用ssh远程登录,退出登陆账户。
    • 如果是切换后的登陆用户,退出则返回上一个登陆账号

14.【重点】查找文件

  • 命令格式: find [路径] -name 文件名
    • 路径可有可无,没有的情况表示的是当前目录
    • 文件名可以使用通配符,使用通配符时,文件名必须在引号里面
      • 例子: find . -name test.sh 在当前目录及子目录下查找名称为test.sh的文件
      • 例子: find . -name ‘abc*.txt’ 在当前目录及子目录下查找名称为abc开头的txt文件

15.【了解】软链接:ln

  • 命令格式: ln -s 源文件 链接文件

    说明:

    • 源文件必须使用绝对路径
    • 不加 -s 参数表示的是硬链接

16.【知道】打包和解包

  • 打包和解包:

    格式: 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文件

17.【重点】压缩解压缩:gzip

  • 压缩文件: tar -zcvf 压缩文件名.tar.gz 被压缩的文件或目录
    • -z 选项: 调用gzip实现打包和压缩的过程
  • 解压缩文件: tar -zxvf 压缩文件名
    • 将压缩文件解压到指定的目录: tar -zxvf 压缩文件名 -C 目标路径
  • 例子:
    • tar -zcvf test.tar.gz *.txt 表示将当前目录下的所有txt文件压缩test.tar.gz文件当中
    • tar -zcvf acd.tar.gz acd 表示将当前目录下的acd目录压缩到acd.tar.gz文件当中
    • tar -zxvf test.tar.gz 将test.tar.gz文件进行解压缩
    • tar -zxvf acd.tar.gz -C abc 表示将acd.tar.gz文件中的内容解压缩到当前目录的abc文件夹下

18.【重点】压缩解压缩:zip、unzip

  • 压缩文件: zip [-r] 压缩文件名 文件或目录

    • -r 选项: 表示压缩的是一个目录
    • 压缩的文件名可以不带后缀名
  • 解压缩: unzip -d 解压目录 压缩的文件名

  • 例子:

    • zip -r acd _test acd 表示将当前目录下面的acd目录压缩到 acd_test.zip文件当中
    • unzip -d /home/admin1 acd_test.zip 表示将acd_test.zip文件中的内容解压缩到 /home/admin1目录下面

19.【了解】vi编辑器介绍和三种模式

  • vi编辑器简介
    • vi是linux系统下的命令行工具
      • vi和vim是同一个编辑器
    • vi可以对linux下的文件内容进行新增、修改、删除、替换等操作。
    • vi编辑器也可以用来创建文件。
    • vi编辑器不能对文件进行排版。
  • vi编辑器的三种模式
    • 命令行模式: 通过对应的快捷键或者命令来管理文件
    • 插入模式: 在插入模式下主要是用来对文件的增加、修改操作
    • 末行模式: 主要是用来保存文件或者退出文件

20.【知道】vi编辑器三种模式的切换

  • 首次进入到VI编辑器使用的是命令行模式

  • 可以通过 i、I、a、A进入到插入模式。 在插入模式中按 ESC键可以回到命令行模式

  • 可以通过 shift + : 进入到末行模式。

    在末行模式可以通过以下快捷键来进行操作:

    • w: 表示保存文件并回到命令行模式
    • q: 表示的是退出vi编辑器
    • !:表示的是强制
    • wq!:表示的是强制保存并退出vi编辑器

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcLo9mso-1659149525095)(C:\Users\ADMINI~1\AppData\Local\Temp\1657447083380.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXqvqodR-1659149525096)(C:\Users\ADMINI~1\AppData\Local\Temp\1657447110388.png)]

第二节SQL数据库语句操作

1.数据库操作语句(了解)

  -- 查看数据库
  show databases;
  -- 指定数据库
  use sql_name;
  -- 查看数据库
  select database();
  -- 创建数据库
  create database sql_name charset=utf8;
  -- 删除数据库
  drop database sql_name;

2.数据表操作语句(了解)

 -- 查看数据库所有表
  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;
  

3.数据表查询语句(掌握)

-- 查询字段起别名
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;

4.举例

– 数据准备
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;

5.总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m86LEcyi-1659149525098)(D:\桌面\SQL笔记\linux笔记\9eb69fb83870734c4ac85a8fa6411cf0.png)]

第三节:SQL数据库多表查询语句

1.内连接:

连接两个表时,取的是两个表中都存在的数据。(取交集)
select * from 表名1 inner join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)

2.外连接

2.1 左连接(掌握)

连接两个表时,取的是左表中特有的数据,对于右表中不存在的数据,用null来填充
select * from 表名1 left join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)

2.2 右连接(了解)

连接两个表时,取的是右表中特有的数据,对于左表中不存在的数据,用null来填充
select * from 表名1 right join 表名2 on 表名1字段=表名2字段 ...(有关联的共同字段)

3.自连接(了解)

要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
select * from 表名 as 别名1 inner join 表名 as 别名2  on  别名1.=别名2.

4.子查询(掌握)

select * from 表名 where 字段名 条件表(select 字段名 from 表名);

4.举例

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’);

/*

  1. 要通过自关联进行查询时,当前自关联的表当中一定会存在两个相关联的字段
  2. 自关联要用别名
  3. 语法格式
    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称之为主查询

  1. 子查询select语句,要么是充当条件,要么充当数据源
  2. 子查询语句是一条完整的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 );


你可能感兴趣的:(linux,服务器,ubuntu)