MySQL基础(DQL语言)

一、MySQL

优点:成本低,性能高,简单

服务的启动与停止:启动:net start 服务名 停止:net stop 服务名

登录与退出:

命令提示符登录:mysql 【-h (主机名) -P(端口)】 -u (用户名) -p(密码)

退出:exit / ctrl+ c

常见命令:

查看当前所有数据库

show databases;
打开指定库use 库名;
查看当前库的所有表show tables;
查看其他库的所有表show tables from 库名;
创建表create table 表名(列名 列类型,列名 列类型,...)
查看表结构desc 表名;

语法规范:

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

数据库存储数据特点:

1.将数据放到表中,表在放到库中
2.一个数据库中可以有多个表,每个表具有唯一的表名
3.表具有一些特性,这些特性定义了数据在表中如何存储,类似 java 中“类”的设计
4.表有列组成,也称为字段,所有表都是由一个或多个列组成,每列类似 java 中 的“属性”
5.表中的数据是按行存储的,每一列类似 java 中的”对象“

二、DQL语言

1、基础查询

1.1 查询单个字段

SELECT last_name FROM employees;

1.2 查询多个字段

SELECT last_name,salary,email FROM employees;

1.3 查询表中的所有字段

#方式一:
SELECT 
  `employee_id`,
  `first_name`,
  `last_name`,
  `email`,
  `phone_number`,
  `job_id`,
  `salary`,
  `commission_pct`,
  `manager_id`,
  `department_id`,
  `hiredate` 
FROM
  employees;
#方式二:
SELECT * FROM employees;

1.4 查询常量值

SELECT 100;
SELECT 'john';

1.5 查询表达式

SELECT 100*98;

1.6 查询函数

SELECT VERSION();

1.7 起别名,AS关键字

#方式一:
SELECT 100*98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;

#方式二:
SELECT last_name 姓,first_name 名 
FROM employees;

1.8 去重,DISTINCT关键字

SELECT DISTINCT department_id FROM employees;

1.9 显示表结构,DESC关键字

DESC departments;

2、条件查询

2.1 条件运算符

        <,>,=,<>(同!=),<=,>=

2.2 逻辑运算符

        关键字:and,or,not

2.3 模糊查询

        关键字:like,between...and...,in,is null ,is not null

like
'%a%':包含a的字符,%为通配符
通配符:
% 任意多个字符,包含0个字符
_ 任意当个字符
例:...WHERE last_name LIKE  '%a%';

可通过\进行转义,或者使用ESCAPE关键字,标记指定字符为转义字符
例:'$_' ESCAPE '$'

between and(包含临界值)
例:...WHERE employee_id BETWEEN 100 AND 120;

in(判断某字段是否属于 in 列表中的一项,in 列表值必须一致或兼容,且不支持通配符)
例:...WHERE job_id IN('IT_PROT','AD_VP','AD_PRES');

is null(=或<>不能用于判断 null 值,is null 仅可以判断 null 值)
例:...WHERE commission_pct IS NULL;

安全等于<=>(判断是否等于)
例:...WHERE commission_pct <=> NULL;

3、排序查询

/*语法:
	select	 查询列表
	from	 表名
	[where  筛选条件]
	order by 排序列表 [asc|desc]

asc 升序,desc 降序 */

SELECT * FROM employees ORDER BY salary DESC;

4、常见函数

4.1 单行函数

字符函数说明
length(str)获取参数值的字节个数
concat(str1,str2,...)拼接字符串
upper(str)转大写
lower(str)转小写
substr(str,pos)返回 pos 索引(索引从1开始)后所有字符
substr(str,pos,len)返回 pos 索引(索引从1开始)开始的 len 个字符
instr(str,substr)返回 substr 第一次在 str 出现的索引,若没有则返回0
trim(str)清除 str 前后的空格
lpad(str,len,padstr)用指定 padstr 在str 左边填充到 len 长度
rpad(str,len,padstr)用指定 padstr 在str 右边填充到 len 长度
replace(str,from_str,to_str)替换
数学函数说明
round(X)、round(X,D)

四舍五入

四舍五入,保留D位小数

ceil(X)向上取整,返回>=该参数的最小整数
floor(X)向下取整
truncate(X,D)截断,保留X小数点后D位
mod(n,m)取余,运算方式:n-n/m*m
rand()、rand(X)

获取随机数,返回0~1之间小数,不可重复的

指定随机数生产的种子X,产生的随机数是可重复的

日期函数说明

now()

返回当前系统日期+时间
curdate()返回当前系统日期,不包含时间
curtime()返回当前时间,不包含日期

year(date)、month(date)、day(date)、hour(date)、minute(date)、second(date)

获取指定的年、月、日、时、分、秒
monthname(date)返回英文的月份名
datediff(date1,date2)返回两个日期相差的天数
str_to_date(str,format)将日期格式字符转换为指定格式的日期
date_format(date,format)将日期转换为字符

流程控制函数

if(条件表达,表达式1,表达式2)
例:if(10<5,'大','小')

case():
使用一,类似 switch case
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值 n 或语句 n
end

使用二,类似于多重 if
case
when 条件1 then 要显示的值1或语句1
when 条件1 then 要显示的值1或语句1
...
else 要显示的值 n 或语句 n
end

其他函数 

version():版本
database():当前打开的数据库
user():当前用户
password('字符'):返回该字符的密码形式
MD5('字符'):返回该字符MD5加密形式

4.2 分组函数

sum(expr):求和        avg(expr):平均值        max(expr):最大值        min(expr):最小值
count(expr):计算个数

特点:
1.sum、avg 处理数值型
max、min、count 可处理任何类型
2.分组函数都忽略null值
3.可以和distinct搭配使用
例:sum(distinct ex)
4.count(*) 统计所有非空个数
count(1) 
count(字段)
MYISAM存储引擎下,count(*)效率高
INNODB下,count(*)>count(1)>count(字段)
5.和分组函数一同查询的字段要求是 group by 后的字段

5、分组查询

语法:
分组前筛选:
	select	 分组函数,列(要求出现在 group by 后面)
	from	 表名
	[where  筛选条件]
	group by 分组列表
	[order by 排序列表];
注意:
查询列表必须特殊,要求是分组函数和 group by 后出现的字段

分组后的筛选:
	select	 分组函数,列
	from	 表名
	group by 分组列表
	having 筛选条件
	[order by 排序列表];
数据源位置关键字
分组前筛选原始表group by前where
分组后筛选分组后结果集group by后having

6、连接查询

使用sql99语法

6.1 内连接

#等值连接
#例:
SELECT last_name,department_name
FROM employees e
INNER JOIN departments d
ON e.'department_id'= d.'department_id';

#非等值连接
#例:
SELECT salary,grade_level
FROM employees e
JOIN job_grades g
ON e,'salary' BETWEEN g.'lowest_sal' AND g.'highest_sal';

#自连接
#例:
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.'manager_id'=m.'employee_id';

6.2 外连接

#左外连接
#得到表A中所有部分和表A与表B的交集部分
SELECT <select_list>
FROM A
LEFT JOIN B
ON A.key=B.key;
#得到表A中去掉表A与表B的交集部分的剩余部分
SELECT <select_list>
FROM A
LEFT JOIN B
ON A.key=B.key;
WHERE B.key IS NULL;

#右外连接
#得到表B中所有部分和表B与表A的交集部分
SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.key=B.key;
#得到表B中去掉表A与表B的交集部分的剩余部分
SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.key=B.key;
WHERE A.key IS NULL;

#全外连接(MySQL不支持)
#得到表A、表B、表A与表B的交集
SELECT <select_list>
FROM A
FULL JOIN B
ON A.key=B.key;
#得到表A和表B去除掉表A与表B的交集的部分
SELECT <select_list>
FROM A
FULL JOIN B
ON A.key=B.key;
WHERE A.key IS NULL OR B.key IS NULL;

6.3 交叉连接

#例:
SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

 交叉连接结果是笛卡尔乘积,m*n 行数据

7、子查询

含义:出现在其他语句中的 select 语句,称为子查询或内查询,外面的语句可以是 insert、update、delete、select 等,一般 select 用得多
外部的查询语句,称为主查询或外查询

分类
按子查询出现的位置:
    select 后面:
        仅支持标量子查询
    from 后面:
        支持表子查询
    where 或 having 后面:
        支持标量子查询(单行)、列子查询(多行)、行子查询
    exists 后面(相关子查询):
        支持表子查询

按结果集的行列数不同:
    标量子查询(结果集只有一行一列)
    列子查询(结果只有一列多行)
    行子查询(结果集有一行多列或多行多列)
    表子查询(结果集一般为多行多列)

特点:放在小括号内,一般放在条件右侧

标量子查询一般搭配单行操作符使用
单行操作符:<,>,>=,<=,=,<>
列子查询一般搭配多行操作符使用
多行操作符:in,any/some,all
子查询的执行优先于主查询的执行

#select 后面(标量子查询)
SELECT d.*,(
	SELECT COUNT(*)
	FROM employees e
	WHERE e.'department_id'= d.'department_id'
)
FROM departments d;

#from 后面(表子查询)将子查询结果充当一张表,要求必须取别名
SELECT ag_dep.*,g.'grade_level'
FROM (
	SELECT AVG(salary),department_id
	FROM employees
	GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

#where 或 having 后面
#标量子查询(单行子查询)
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
	SELECT job_id
	FROM employees
	WHERE employee_id = 141
) AND salary>(
	SELECT salary
	FROM employees
	WHERE employee_id = 143
);
#列子查询(多行子查询)
SELECT last_name
FROM employees
WHERE department_id IN(
	SELECT DISTINCT department_id
	FROM departments
	WHERE location_id IN(1400,1700)
);
#行子查询
SELECT *
FROM employees
WHERE (employee_id,salary)=(
	SELECT MIN(employ_id), MAX(salary)
	FROM employees
);

#exists 后面,结果:1或0
SELECT department_name
FROM ddepartments
WHERE EXISTS(
	SELECT *
	FROM employees e
	WHERE d.'department_id'= e.'department_id'
);

8、分页查询

应用场景:当显示的数据,一页显示不全,需要分页提交 sql 请求

语法:
SELECT 查询列表
FROM 表
[连接类型 JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后筛选
ORDER BY 排序字段]
LIMIT offset,size;

offset 可省略,省略则从0开始

offset:要显示条目的起始索引(从0开始)
size:要显示的条目个数

特点:
limit 语句放在查询语句最后
公式:
若要显示的页数 page,每页条目数 size
SELECT 查询列表
FROM 表
LIMIT (page-1)*size, size;

9、联合查询

将多条查询语句的结果合并成一个结果

应用:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

语法:
查询语句1
UNION
查询语句2
UNION
......

特点:
1、要求多条查询语句的列数一致
2、要求多条查询语句的每一列的类型和顺序最好一致
3、union 关键字默认去重,使用 union all 可以包含重复项

#例:
SELECT *
FROM employees
WHERE email LIKE '%a%'
UNION
SELECT *
FROM employees
WHERE department_id>90;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值