MySQL基础_2_SELECT 语句

!说明:最近5天看了尚硅谷康师傅(强推JVM)的MySQL基础篇,分享一下笔记,mark,mark!

一、SQL的分类

1、DDL

  • 即数据定义语言
  • CREATE / ALTER / DROP / RENAME / TRUNCATE
  • 定义不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构

2、DML

  • 即数据操作语言
  • INSERT / DELETE / UPDATE / SELECT
  • 用于添加、删除、更新和查询数据库记录,并检查数据库完整性

3、DCL

  • 即数据控制语言
  • COMMIT / ROLLBACK / SAVEPOINT / GRANT / REVOKE
  • 用于定义数据库、表、字段、用户的访问权限和安全级别

二、SQL语言的规则和规范

1、基本规则

  • 每条查询语句以;结束,或者在命令行中使用\g\G结束
  • 字符串、日期时间类型的数据需使用''表示

2、SQL大小写规范

  • 在Window下是大小写不敏感的
  • 在Linux上是大小写敏感的
    • 数据库名、表名、表的别名、变量名是严格区分大小写的
    • 关键字、函数名、列名(字段名)、列的别名(字段的别名)是大小写不区分的

3、注释

  • 单行注释:#或者-- --
  • 多行注释:/**/

三、基本的SELECT语句

1、SELECT…FROM 表名

2、列的别名

  • 1 直接空格后续跟别名newname

SELECT oldname newname FROM ...

  • 2 原名和别名之间使用AS,表示alias

SELECT oldname AS newname FROM ...

  • 列的别名使用一对""引起来,不要使用单引号

SELECT oldname "newname" FROM ...

3、列的去重

  • 使用DISTINCT

SELECT DISTINCT… FROM…

  • DISTINCT的去重是针对其后面跟着的多个列有效的,如后面有两列,则会去这两列都相同的部分,仅一列相同的会保留

4、空值null

  • 空值null不等同于0,’’
  • 只是在输入信息时还未确定好
  • 空值参与运算:结果也一定为null,处理方法,使用IFNULL

5、着重号

  • 在创建表、数据库、视图等需要与关键字等区分
  • 但是如果确实与其相矛盾了,使用着重号````,能够使得各种操作正常执行

SELECT... FROM...表名``

6、查询常量

  • 查询表中没有的列,会在最终的查询结构中每一行都加上该列的内容,如果是字符串形式,则需要使用''

7、显示表结构

  • DESCRIBE 表名
  • 显示表中字段的详细信息

![image.png](https://img-blog.csdnimg.cn/img_convert/c369ab889e9e01bde5db73b801d3dd2c.png#clientId=ua1e75efc-2fd0-4&from=paste&height=164&id=uc9917496&margin=[object Object]&name=image.png&originHeight=328&originWidth=562&originalType=binary&ratio=1&size=63586&status=done&style=none&taskId=u26292d23-d7bf-4a10-a1f7-9506f5f4ec7&width=281)​

8、过滤数据

  • 使用WHERE,需要声明在FROM的后面

四、运算符

1、算数运算符

2、比较运算符

  • 比较的结果为真则返回1,为假则返回0,其他情况返回null
  • 只要有null参与比较,结果就是null
  • <=>,安全等于符号,当左右均为null时,返回的结果为null
1)非符号类型运算符(关键字)
  • IS NULL:为空运算符
  • IS NOT NULL:不为空运算符
  • LEAST:最小值运算符
  • GREATEST:最大值运算符
  • BETWEEN... AND...:查询两个条件范围内的数据,包括两个边界(或者使用&&),注意先写条件的下界后写条件上界,否则不会返回任何查询结果
  • NOT BETWEEN... AND...:不在该范围内的
  • IN / NOT IN,对于多个条件值的时候使用
# 查询工资是1000或2000或3000的
SELECT 
    salary
FROM
    employees
WHERE
    salary IN (1000 , 2000, 3000)
  • LIKE:模糊查询
    • %:代表不确定个数的字符,0个,1个…
    • _:代表一个不确定的字符
    • \:转义字符,可以使得后跟的符号不会发挥代表的效果,直接显示
    • 使一个特定字符作为转义字符,WHERE ... LIKE '....$.....' ESCAPE '$',此时可以使得$作为转义字符
2)正则表达式
  • ^’匹配后跟字符开头的字符串
  • $’匹配后跟字符结尾的字符串
  • .’匹配任何一个字符
  • [..., ..., ... ...]’匹配方括号中的任何字符,为了命名字符的范围,使用一个‘-’
  • *’匹配零个或多个在它前面的字符

3、逻辑运算符

  • NOT
  • AND&&
  • OR||
  • XOR
  • OR和AND可以同时使用,但是AND的优先级高于OR

4、位运算符

。。。略过

5、运算符习题

# 1 选择工资不在5000到12000的员工的姓名和工资
select first_name, salary
from employees
where salary not between 5000 and 12000;

# 2 选择在20或者50号步迷们工作的员工姓名和部门号
select first_name, department_id
from employees
where department_id in (20, 50);

# 3 选择公司中没有管理者的员工姓名和job_id
select first_name, job_id
from employees
where manager_id is null;

# 4 选择公司中有奖金的员工姓名,工资和奖金级别
select first_name, salary, commission_pct
from employees
where commission_pct is not null;

# 5 选择员工姓名的第三个字母是a的员工姓名and
select first_name
from employees
where first_name like '__a%';

# 6 选择姓名中有字母a和k的员工姓名
 select first_name
 from employees
 where first_name like '%a%k%' or first_name like '%k%a%';

# 7 显示出first_name以e结尾的员工信息
select *
from employees
where first_name like '%e';

# 8 显示出部门编号在80-100之间的员工的姓名、工种
select first_name, job_id
from employees
where department_id between 80 and 100;

# 9 显示出manager_id是100、101、110的员工姓名、工资、管理者id
select first_name, salary, manager_id
from employees
where manager_id in (100, 101, 110);

五、排序与分页

1、排序规则

  • 如果没有使用排序,默认情况下返回的数据是按照添加数据的顺序显示的(即表中的顺序)
1)ORDER BY
  • 使用对数据进行操作排序
  • 若ORDER BY后面未指定排序的规则,则默认为升序
  • 我们可以使用列的别名进行排序,但是列的别名不能在WHERE中使用
  • ORDER BY的使用需要放在WHERE的后面
2)排序规则
  • ASC:升序
  • DESC:降序
3)二级排序
  • 例子:显示员工信息,按照department_id降序,再按照salary升序
  • 多级排序规则类似
# 二级排序
SELECT 
    employee_id, department_id, salary
FROM
    employees
ORDER BY department_id DESC , salary ASC;  # 这个ASC可不写

六、分页

  • 查询返回的记录太多,查看起来不方便 --> 分页查询
  • 查询表里的指定范围的数据
1)LIMIT
  • LIMIT (pageNo - 1) * pageSize,pageSize
  • 每页显示pageSize条记录,此时显示第pageNo页
  • LIMIT 0, pageSize相当于LIMIT pageSize(不推荐)
  • LIMIT的声明在ORDER BY后
# 分页
# 需求1 每页显示20条数据,此时显示第1页
SELECT 
    *
FROM
    employees
LIMIT 0 , 20;
# 需求2 每页显示20条数据,此时显示第2页
SELECT 
    *
FROM
    employees
LIMIT 20 , 20;
2)LIMIT新特性
  • 8.0中可加入OFFSET
  • LIMIT pageSize OFFSET (pageNo - 1) * pageSize,注意和原本的是相反的
  • !注意:LIMIT适用于MySQL、PostgreSQL、MariaDB和SQLite,但是不适用于SQL Server、Oracle等
3)排序与分页习题
# 1 查询员工的姓名、部门号和年薪,按年薪降序,再姓名升序
SELECT 
    first_name, department_id, salary * 12 annual_sal
FROM
    employees
ORDER BY annual_sal DESC , first_name;

# 2 选择工资不在8000到17000的员工的姓名和工资,按工资降序,显示21-24的位置的数据
SELECT 
    first_name, salary
FROM
    employees
WHERE
    salary BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20 , 20;

# 3 查询邮箱中包含e的员工信息,并按照邮箱中的字节数降序,再按部门号升序
SELECT 
    *
FROM
    employees
WHERE
    email LIKE '%e%'
ORDER BY LENGTH(email) DESC , department_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值