尚硅谷MYSQL笔记 上

数据库的概念

DB

数据库(database):存储数据的“仓库”,它保存了一系列有组织的数据

DBMS

数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器

在这里插入图片描述

SQL语言概述

结构化查询语言(Structure Query Language):专门用来与数据库通信的语言

SQL的优点

1. 不是某个特定数据库供应商专有语言,几乎所有DBMS都支持SQL
2. 简单易学
3. 虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作

在这里插入图片描述

数据库的特点

在这里插入图片描述

MYSQL

MYSQL的常见命令

1. 查看当前所有的数据库
show databases
2. 打开指定的库
use 库名
3. 查看当前库的所有表
show tables
4. 查看其他库的所有表
show tables from 库名
5. 创建表
create table 表名(
	列名 列表型,
	列名 列表型,
	...
)
6. 查看表结构
desc 表名
7.查看服务器版本
方式一:登录到mysql服务器
select version();
方式二:没有登录到mysql服务器
mysql --version
或者 mysql --V

MYSQL的语法规范

1. 不区分大小写,但建议关键字大写,表名,列名小写
2. 每条命令最好用分号结尾
3. 每条命令根据需要,可以进行缩进 或换行
4. 注释
       单行注释:#注释文字
       单行注释:--注释文字
       多行注释:/*注释文字*/

DQl语言的学习

查询全部

SELECT * FROM 表名;

查询常量

SELECT 100;
SELECT 'john'

查询表达式

SELECT 100*99; 

查询函数

SELECT VERSION();

起别名(好处:便于理解;如果要查询的字段有重名的情况,使用别名可以区分开来)
方式一:AS+别名

SELECT 参数 AS 别名 FROM 表名;

方式二:空格+别名(如果别名中有特殊符号需要用双引号(英文)包括)

SELECT 参数 别名 FROM 表名;

去重

#DISTINCT去除重复数据
SELECT DISTINCT 要查询的参数名 FROM 表名;

java中的+:

  1. 运算符,两个操作数都为数值型
  2. 连接符,只要有一个操作数为字符串

mysql中" + ":仅仅只有一个功能:运算符

  1. 两个操作数都为数值型,则做加法运算
  2. 如果其中一个操作数为字符型,试图将字符型转换为数值型,
    如果转换成功,则继续加法运算;
    如果转换失败,则将字符型数值转换为0;
  3. 只要其中一方为null,则结果肯定为null;
    CONCAT 拼接查询结果
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;

在这里插入图片描述

条件查询

#语法:SELECT 查询列表 FROM 表名 WHERE 筛选条件;

分类:
一、按条件表达式筛选
条件运算符:> < = != <> >= <=
二、按逻辑表达式筛选
逻辑运算符:&& || ! and , or ,not
三、模糊查询
like, between and, in, is null

1.按条件表达式筛选
#查询工资大于12000的员工信息
SELECT * FROM employees WHERE salary > 12000;

在这里插入图片描述

#查询部门编号不等于90号的员工名和员工编号
SELECT last_name,department_id FROM employees WHERE department_id <>90;

在这里插入图片描述

2.逻辑表达式筛选
#查询工资在10000到20000之间的员工名、工资以及奖金
SELECT last_name,salary,commission_pct FROM employees WHERE salary >= 10000 AND salary <= 20000;

在这里插入图片描述

3.模糊查询
like
特点:一般和通配符搭配使用;(通配符:%,任意多个字符,包含0;_任意单个字符)转义符 \... ESCAPE;
#查询员工名称中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';

在这里插入图片描述

between…and…
1.使用between and可以提高语句的简洁度
2.包含临界值
3.两个临界值不要调换顺序
#查询员工编号在100到120之间的员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;

在这里插入图片描述

in
含义:用于判断某字段值是否属于in列表中的某一项;
特点:1.使用in提高语句简洁度
     2.in列表的值类型必须一致或兼容
     3.in列表的值不能使用通配符
#查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id FROM employees WHERE job_id IN('IT_PROG','AD_VP','AD_PRES');

在这里插入图片描述

is null
#查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;

在这里插入图片描述

安全等于: <=>
IS NULL: 仅仅可以判断NULL值
<=>:既可以判断null值,又可以判断普通的数值
# 查询员工号为176的员工的姓名和部门号和年薪
SELECT
		last_name,
		department_id,
		salary * 12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
		employees

在这里插入图片描述

排序查询

ORDER BY
特点:
1.asc代表升序,desc代表降序;默认是升序
2.ORDER BY 支持单个字段和多个字段 ;表达式、函数、别名
3.ORDER BT 子句一般是放在查询语句的最后面,limit子句除外
#查询员工的工资,要求工资从高到低排序
SELECT * FROM employees ORDER BY salary DESC;

在这里插入图片描述

#查询部门编号>=90的员工信息,按入职时间的先后进行排序
SELECT * FROM employees WHERE department_id >= 90 ORDER BY hiredate ASC;

在这里插入图片描述

# 按年薪的高低显示员工的信息和年薪【按表达式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

在这里插入图片描述

# 按年薪的高低显示员工的信息和年薪 【按别名排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪 DESC;

在这里插入图片描述

# 按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT LENGTH(last_name) 字节长度,last_name,salary FROM employees ORDER BY 字节长度 DESC;

在这里插入图片描述

常见函数

概念: 类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1.隐藏了实现细节  2.提高代码的重用性
调用:select函数名(实参列表)【from表】;
特点:1.叫什么(函数名)
           2.干什么(函数功能)
分类:
			1.单行函数
			如concat length ifnull等
			2.分组函数
			功能:做统计使用,又称为统计函数、聚合函数

字符函数

#length 获取参数值的字节个数
SELECT LENGTH('join');#4
SELECT LENGTH('张三丰hahaha');#15

SHOW VARIABLES LIKE '%char%'

# CONCAT 拼接字符串
SELECT CONCAT(last_name,'_',first_name) FROM employees;

#upper、lower
SELECT UPPER('join');#大写
SELECT LOWER('JOHN');#小写

# substr substring  截取字符 索引从1开始
SELECT SUBSTR('李莫愁爱上了陆湛元',7) out_put;
#截取从指定索引出指定字符长度的字符
SELECT SUBSTR('李莫愁爱上了陆湛远'13) out_put;

# instr  返回子串第一次出现的索引,如果找不到返回0

# trim  去除前后空格
# lpad 用指定的字符实现左填充指定长度
# rpad 用指定的字符实现右填充指定长度

# replace 替换

数学函数

#round 四舍五入
SELECT ROUND(1.65);#1.7
SELECT ROUND(1.567,2);#1.57

#ceil 向上取整
SELECT CEIL(1.002);

#floor 向下取整

# truncate 截断

# mod取余  mod(a,b)  =  a-a/b*b
# rand 取随机数 返回0-1之间的小数

日期函数

#now 返回当前系统日期+时间

#curdate 返回当前系统日期,不包含时间
SELECT CURDATE();
#curtime 返回当前时间 不包含日期

#可以获取指定的部分,年月日时分秒
SELECT YEAR(NOW());
#str_to_date:将日期格式的字符转换成指定格式的日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
#data_format 将日期转换成字符
#datadiff 返回两个日期相差的天数
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') AS out_put;

在这里插入图片描述

其他函数

SELECT VERSION();
SELECT DATABASE();
SELECT USER();
password('字符串'):返回

流程控制函数

# if函数 if else的效果
SELECT IF(10 > 5,'大','小');

#case函数使用一:switch case 的效果
/*
case 要判断的字段或表达式
when 常量1 then要显示的值1或语句1;
when 常量2 then要显示的值2或语句2;
else 要显示的值n或语句n;
end
*/

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数 
分类:sum 求和、avg平均值、max最大值、min最小值 count计算个数

特点:1.sum avg一般用于处理数值型
       max、min、count可以处理任何类型
     2.以上都可以忽略null值
     3.可以和distinct搭配实现去重运算
     4.count函数的单独介绍
     一般用COUNT(*)查询行数
     	效率:
     	MYISAM存储引擎下,COUNT(*)的效率高
     	INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高
     5.和分组函数一同查询的字段要求是group by后的字段

分组查询

语法:
		select 分组函数,列(要求出现在group by的后面)
		from 表
		where 筛选条件
		group by 分组的列表
		order by 子句
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段
特点:1.分组查询中的筛选条件分为两类
	 										数据源  					位置  						关键字
	 		分组前筛选          原始表							group by子句前       where
	 		分组后筛选          分组后的结果集          	group by子句后 		having
			①分组函数筛选条件肯定是放在having子句中
			②能用分组前筛选的,就优先考虑使用分组前筛选
	 2.group by 子句支持单个字段分组,多个字段分组(多个字段用逗号隔开没有顺序要求)
	 3.也可以添加排序(排序放在整个分组查询的最后)
#分组后的筛选
SELECT COUNT(*),department_id FROM employees  GROUP BY department_id HAVING COUNT(*)>2;
按表达式或函数分组

案例:按员工姓名的长度分组;查询每一组的员工个数,筛选员工个数大于5


连接查询

连接查询:
含义:又名多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行 表2 有n行 结果 = m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类:
       按年代分类:
       sql92标准 仅仅支持内连接
                等值连接:
                		①多表等值连接的结果为多表的交集部分
                		②n表连接 至少需要n-1个连接条件
                		③多表的顺序没有要求
                		④一般需要为表起别名
                		⑤可以搭配前面介绍的所有子句使用,比如排序 分组 筛选
       sql99标准 推荐 :支持内连接+外连接+交叉连接
	   按功能分类:
	   			内连接:
	   				等值连接
	   				非等值连接
	   				自连接
	   			外连接:
	   				左外连接
	   				右外连接
	   				全外连接
			   交叉连接:
等值连接

在这里插入图片描述
为表起别名:
1.提高语句的简洁度,
2.区分多个重名的字段
注意:如果为表起了别名 则查询的字段就不能使用原来的表名去限定
3.两个表的顺序可以调换
在这里插入图片描述
查询有奖金的员工名、部门名
在这里插入图片描述
查询城市名中第二个字符为o的部门名和城市名
在这里插入图片描述
查询每个城市的部门个数
在这里插入图片描述
查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
在这里插入图片描述
查询每个工种的工种名和员工的个数,并且按员工个数降序
在这里插入图片描述
查询员工名 部门名和所在的城市
在这里插入图片描述

非等值连接

查询员工工资和工资级别
在这里插入图片描述
在这里插入图片描述

sql99语法

语法:
select 查询列表
from 表1 别名 连接类型
join 表2 别名
on 连接条件
where筛选条件
group by分组
having 筛选条件
order by 排序列表
内连接 inner
外连接
左外:left outer
右外:right outer
全外:full outer
交叉连接:cross

一:内连接
语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件

分类:
等值
非等值
自连接

等值连接:
查询员工名、部门名
在这里插入图片描述
查询名字中包含e的员工名和工种名
在这里插入图片描述
查询部门个数>3的城市名和部门个数
在这里插入图片描述
查询部门员工大于3的部门名和员工个数,并按个数降序
在这里插入图片描述
特点:
①添加排序、分组、筛选
②inner可以省略
③筛选条件放在where后面,连接条件放在on后面,便于阅读
④inner join 连接和sql92语法中的等值连接效果是一样的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值