mysql基础(DQL语言、DML语言、DDL语言)详解

DQL语言:数据库查询语言

分组查询:Group by
和分组函数搭配使用:
案例:通过部门编号筛选每个部门的平均工资

Select department_id,avg(salary) where 表名 group by department_id

分组后筛选:
案例:查询每个部门人数>2的部门

Select count(*),department_id from employees group by department_id 
<font color=red>Having count(*)>2

排序查询:order by
Select * from 表名 order by 字段名 desc;
DESC:从大到小
ASC:默认从小到大

连接查询:内连接(等值连接、非等值连接、自连接)、外连接(左外连接、右外连接、全外连接(mysql不支持,orcle支持)、交叉连接)

sql92支持:内连接
sql99支持:内连接、外连接、交叉连接

内连接:等值连接、非等值连接、自连接
等值连接(sql99语法):内连接的结果等于两表的交集
select 【查询列表】
from 表A 别名1 (inner) join
表B 别名2
on 1.key=2.key(取交集部分)

在这里插入图片描述

外连接:左外连接、右外连接、全外连接(mysql不支持,orcle支持)、交叉连接
左外连接:查询的结果为主表(左表)中所有的行,如果从表(右表)和它匹配则显示匹配行,不匹配则显示null值。
语法:
select 【查询列表】
from 表A 别名1 left join
表B 别名2
on 1.key=2.key
在这里插入图片描述
案例:查询哪个学生的成绩为空
涉及到两张表,学生表和成绩表,其中学生表的stu_id和成绩表的stu_id作为连接条件,一般“哪个”后面的字段所在的表为主表,该案例为学生表,所以学生表为主表,左查询实放在左边,右查询时放在右边

select s.*,r.score
from student s LEFT JOIN result r
on s.stu_id = r.stu_id
where r.id = null

右外连接:查询主表(右表)中所有的值,从表(左表)中有的显示表值,没有的显示null值
语法:
select 【查询列表】
from 表A 别名1 right join
表B 别名2
on 1.key=2.key
在这里插入图片描述
若要去掉交集部分,添加筛选即可
在这里插入图片描述
全外连接:取得两个表所有的值+交集部分
在这里插入图片描述
若要去掉交集部分,
在这里插入图片描述
交叉连接:查询结果为两张表的笛卡尔乘积
语法:
select 【查询列表】
from 表1 cross join 表2

子查询:出现在其他语句中的select语句,称为子查询

分类:

  • 按出现的位置分类:

select后面:仅仅支持标量子查询
from后面:支持表子查询
where和having后面:支持标量子查询(单行)或列子查询(多行),行子查询较少
exists后面:支持表子查询

  • 按结果集的行列数分类:

标量子查询:结果集只有一行一列
列子查询:结果级只有一列多行
行子查询:结果集只有一行多列
表子查询:结果集是多行多列

①where后面的标量子查询:一般搭配 > < = <>使用
案例:查询谁的工资比Able高?

select last_name,salary
from employees
where salary>(select salary from employees where last_name='Able')

案例:查询哪个部门的最低工资大于50号部门的最低工资?(分组查询+子查询)
第一步:查出50号部门的最低工资

SELECT MIN(salary) FROM employees WHERE department_id=50;

第二部查询每个部门的最低工资(按部门分组查询最低工资)

SELECT MIN(salary),department_id FROM employees GROUP BY department_id;

第三步:查询是那个部门大于50的最低工资

SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>
(SELECT MIN(salary) FROM employees
WHERE department_id=50)

②where后面的列子查询:把子查询的结果充当筛选条件
一般搭配in、any、all使用

③select后面的子查询:把子查询的结果充当查询列表
案例:查询每个部门的员工个数

SELECT department_id,(
SELECT COUNT(*) FROM employees 
WHERE employees.`department_id`=departments.`department_id`) 
FROM departments

④from后面的子查询:把子查询的结果集充当一张表(必须起别名)
案例:查询每个部门平均工资的工资等级
第一步:查询每个部门的部门编号和平均工资

SELECT AVG(salary),department_id FROM employees GROUP BY department_id

第二步:把第一步的结果集当成一张表连接工资登记表进行非等值连接

SELECT av.*,g.grade_level
FROM (SELECT AVG(salary) avs,department_id FROM employees GROUP BY department_id) av
INNER JOIN job_grades g ON
av.avs BETWEEN g.lowest_sal AND g.highest_sal

⑤exists后面的子查询(相关子查询):一般子查询都是一个连接查询
案例:查询没有女朋友的男生的信息
方式一:使用外连接查询

SELECT bo.*FROM boys bo LEFT JOIN beauty b ON bo.`id`=b.`boyfriend_id` WHERE b.`boyfriend_id` IS NULL

方式二:使用子查询where+in(select)

 SELECT bo.*,FROM boys bo WHERE bo.`id` NOT IN (SELECT beauty.`boyfriend_id` FROM beauty);

方式三:使用exists

 SELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT b.`boyfriend_id` FROM beauty b WHERE b.`boyfriend_id`=bo.`id`)

DML语言:数据的增删改

添加语句: insert into(字段1,字段2,字段3,…字段n) 表名 values(值1,值2,值3,…值n),(值1,值2,值3,…值n)

修改语句: update 表名 set 字段1=值1,字段2=值2 where【 筛选条件】

删除语句:
方式一:delete from 表名 where 【筛选条件】
方式二:truncate table 表名(将表的数据全部删除)

【面试题】使用删除语句中,delete和truncate的区别:

  • ①delete可以加筛选条件where,truncate不能加
  • ②truncate对比delete进行整表删除时效率较高
  • ③delete删除数据后,再进行添加操作该表的自增id从断点处开始;而truncate删除表后,在进行添加操作后该表的自增加id从1开始。
  • ④在处理事务时,delete删除后可以回滚,truncate不能回滚。

DDL语言:数据定义语言(主要涉及库和表的创建、修改、删除)

创建:create
语法:create table 表名(字段名 数据类型 【约束】,字段名2 数据类型2 【约束】)
修改:alter
语法:alter table 表名 add|drop|modify|change column 字段名 【字段类型 约束】
删除:drop
语法:drop table 表名

表的复制:
①只复制表的结构:create table 复制的表名 like 被复制的表名;
②复制表的结构和数据:create table 复制的表名 select * from 被复制的表名

表的创建时涉及到的6大约束:

NOT NULL:该字段不能为空
DEFAULT:设定该字段的默认值
CHECK(字段名 = ?):检查该字段是否由?组成
PRIMARY KEY:主键
FOREIGN KEY:外键
UNIQUE:唯一建
#其中主键、外键、唯一键都会自动生成索引

#语法:
#CREATE TABLE 表名(
#	字段名 字段类型 【约束】,
#	字段名2 字段类型2 【约束2】,
#	....
#	字段n 字段类型n 【约束n】
#);

CREATE TABLE stuInfo(
	id INT,
	stuName VARCHAR(15) NOT NULL,#设置非空
	age INT DEFAULT 18,#设置默认
	seat INT,
	majorId INT,
	
	#以下为表级约束
	PRIMARY KEY(id),#设置主键
	UNIQUE (seat),#设置唯一键
	FOREIGN KEY (majorId) REFERENCES major(id)#设置外键

)
CREATE TABLE major(
	id INT PRIMARY KEY,
	majorNAme VARCHAR(12)
)

【面试题】主键和唯一键的区别:

  • 两者都能保证唯一性
  • 两者都可以进行字段组合(但不推荐)
  • 主键不能为null,唯一键可以为null,但只能有一个值为null
  • 主键一个表中只能有一个,唯一键可以有多个

【面试题】外键的特点:

  • 要求外键在从表中设置
  • 外键的类型和关联列的类型要求一致或兼容
  • 外键关联的列必须为主键或唯一键

【面试题】自增长列的特点:

  • 必须和主键和唯一键搭配使用
  • 一张表至多一个自增长列
  • 自增长列的类型只能是数值型
  • 可以通过set auto_increment_increment=?设置步长

MySQL 函数分类:

字符函数:

去重:distinct
Select distinct 字段名 from 表名

+:
只做加法运算,不做连接

Concat函数:连接符
Select concat(str1,str2) from 表名

Length函数:获取参数值的字段个数
Select length(email) from 表名

Upper/lower函数:改变大小写

Trim函数:去掉字段前后的多余字符

ifnull函数:判断字段是否为null,如果为null,返回指定值,不为null,返回原始值

isnull函数:判断字段是否为null,是返回1否返回0

数学函数:

Round函数:四舍五入

Ceil函数:向上取整

Floor函数:向下取整

Truncate函数:保留几位小数点
Select truncate(1.69999,1)———>1.6

Mod函数:取模

日期函数:

Now函数:返回当前日期和时间
Curdate:返回当前日期
Curtime:返回当前时间
Year(),month(),day(),hour()

Str_to_date(str,str):将日期格式的字符串转成指定日期
Select str_to_date(‘9-13-1999’,’%m-%d-%Y’)

Date_format(date,str):将日期转成字符
Select date_format(now(),’%y年%m月%d日’)

DateDiff(date1,date2):比较两个日期的大小,第一个大,返回正数;第二个大返回负数;相等返回0

条件判断函数:

If(,):类似java三元运算符

Case salary 工资
When 常量1 then 表达式1
When 常量2 then 表达式2
Else 表达式3
end

分组函数:

Sum
Avg
Max
Min
Conut

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值