mysql语法集合

常用指令

show tables from mysql;//显示表
select database();//查看当前在那个表

#创建表
CREATE TABLE boys (
  bid INT, #男人ID
  name VARCHAR(100), #男人名称
	sex VARCHAR(2) ,#性别
	age INT,#年龄
	cp_id INT #对象id
	
);

insert into sort (id,name) values(2,'丁辉龙');//单条插入数据
-- 插入数据
INSERT INTO students (id,name,age,sex,salary,first_name,last_name) VALUES (6,'迪丽热巴',25,'女',100000000,'迪丽','热巴')


alter table sort add (age int ,serc varchar(255));//多条插入字段

/*添加多个列方法一*/
ALTER TABLE student
ADD address VARCHAR(200) NOT NULL,
ADD home_tel CHAR(11) NOT NULL;
/*add语句之间用逗号分隔,最后用分号结束*/
 
/*添加多个列方法二*/
ALTER TABLE student
ADD (address VARCHAR(200) NOT NULL,home_tel CHAR(11) NOT NULL);

一、查询

Select [字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句] [limit 子句];

SELECT sex FROM students 

1.起别名

SELECT name as 姓名,age as 年龄 FROM students;


SELECT name  姓名,age  年龄 FROM students;

2.去重

SELECT DISTINCT sex FROM students;

3.+号的作用

/*
java中的+号:
1.运算符
2.连接符:其中一个是字符串

mysql 中的+号只有一个功能:运算符
*/

SELECT first_name+last_name as 姓名 from students;//错误

SELECT CONCAT(first_name,last_name) as 姓名
FROM students;

-- IFNULL(expr1,expr2)
SELECT 
IFNULL(serc,'很好') as 描述 ,serc 
FROM students

4.条件查询

-- 条件查询

SELECT * FROM students where name = 'zy'

-- 分类
/*
1.按条件表达式
		条件运算符:< > = ...
2.按逻辑运算符:&& || !  and  or not
3.模糊查询: like BETWEEN and ,is null;
*/

-- 案例
SELECT name,age FROM students where age>=18; 
SELECT name,age FROM students where age  BETWEEN 3 AND 19; 

--and 
SELECT *  FROM students WHERE first_name = '丁' and age = 4;


-- 模糊查询  
-- 查询描述包含帅气的所有学生
SELECT *  FROM students WHERE serc LIKE '%帅气%';


-- 查询名字第二个字是龙的所有学生
-- LIKE
SELECT * FROM students where last_name LIKE '_龙%'

-- IN
SELECT * FROM students WHERE  age IN (4,18)

-- not IN
SELECT * FROM students WHERE not age IN (4,18)

-- is NULL

SELECT * FROM students WHERE  age IS NULL

-- 安全等于 <=>
SELECT * FROM students WHERE  age <=> NULL



-- 排序查询  ORDER BY
-- 				DESC 升序  ASC 降序

#案例 1:查询学生年龄 按升序排序
SELECT * FROM students ORDER BY age ASC

SELECT * FROM students ORDER BY  salary DESC

-- 案例2 年龄大于等于18的薪资按
SELECT * FROM students 
WHERE age >= 18 ORDER BY salary DESC

#案例3 安装年薪排名【根据表达式】
SELECT *,12*salary 年薪
from 	students 
ORDER BY 12*salary

#案例4 安装年薪排名【根据别名】
SELECT *,12*salary 年薪
from 	students 
ORDER BY 年薪

#案例5 安装姓名长度【根据函数】
SELECT *,LENGTH(name) 姓名长度
from 	students 
ORDER BY LENGTH(name) ASC

#案例5 按年龄升序,薪资降序排列
SELECT *
from 	students 
ORDER BY age DESC ,salary ASC


4.1 查询函数

字符函数

-- 一、字符函数
#LENGTH(str) 获取字节

#CONCAT(str1,str2,...) 拼接

#UPPER(str)  LOWER(str) 转换大小写

# SUBSTR(str FROM pos FOR len)  SUBSTRING(str FROM pos FOR len) 截取指定位置后面的所有字符串 索引从1开始

SELECT SUBSTR('迪丽热巴和朱一龙',1,4) 偶像

#INSTR(str,substr) 返回字符串第一次出现的索引,如果没有返回0
SELECT INSTR('112233445566','55') 数字

#TRIM([remstr FROM] str)
SELECT TRIM('6' FROM '66677  hhhhh   666')


#LPAD(str,len,padstr) 用指的字符实现左边填充指定的长度

SELECT  LPAD('给前面填充几个东西',6,'6') as 填充

#RPAD(str,len,padstr) 用指的字符实现右边填充指定的长度
SELECT  RPAD('给前面填充几个东西',6,'6') as 填充


#REPLACE(str,from_str,to_str)
SELECT REPLACE('迪丽热巴和媛媛','迪丽热巴','龙龙') as 替换

数字函数

#二、数学函数

#ROUND() 四舍五入 
-- 保留两位小数
SELECT ROUND(1.666,2) as 四舍五入 

#CEIL(X) 向上取整 返回>=该数的最小整数
SELECT CEIL(1.66) as 向上 

#FLOOR(X) 向下取整
SELECT FLOOR(1.66) as 向下

#TRUNCATE(X,D)截取
SELECT TRUNCATE(1.66666,3) as 截取

#MOD(N,M)   取余
/*

SELECT MOD(a,b) 取余 ==    a -a/b*b
														整数/整数 结果也取整

*/
SELECT MOD(10,3) 取余

日期函数

# 三、日期函数

#NOW()  返回当前的时间
SELECT NOW() #2022-03-05 15:25:52

#CURDATE() 返回当前系统日期,不包含时间
SELECT CURDATE() #2022-03-05

#CURTIME() 返回当前时间,不包含日期
SELECT CURTIME() #15:28:49

# 获取指定的  年 月 日 等等
SELECT YEAR(NOW()) as 时间

SELECT YEAR(time) from students 


#STR_TO_DATE(str,format) 转换为指定的时间格式
SELECT STR_TO_DATE(time,'%Y-%c-%d')
FROM students #2022-03-05


#DATE_FORMAT(date,format) 日期转换为字符串
SELECT DATE_FORMAT(time,'%m 月 %d 日  %Y  年') as 时间
FROM students  #03 月 05 日  2022  年

其他函数

-- 其他函数

#if  类似于三元表达式
SELECT name,age ,IF(age >=18,'恭喜你成年啦','未成年人') 备注
FROM students 

#case 函数   :类似于  switch  case 
SELECT salary ,age,name,
CASE age
	WHEN 18 THEN
		salary*2
	ELSE
		salary*0
END as  薪资 
FROM students;

分组函数

/*
sum 求和  avg 平均数  max最大 min 最小值 count 计算个数
*/

-- 1.简单使用
SELECT SUM(age) FROM students
SELECT max(salary) FROM students

SELECT min(age) 最小年龄,max(salary) 最高薪资 FROM students

-- 2、参数支持的类型
sum avg  一般用于数值类型
max,min,count 可以处理任何类型

-- 3.和distinct搭配使用 去重
SELECT COUNT(DISTINCT age)froM students

4.2 分组查询

分组后筛选

/*
语法:select 分组函数,列(要求出现在group  by 的后面)
			 from 表
			 【where 筛选条件】
			 group by 分组的列表
			 【order by 子句子】
*/
#查询男生、女生的人数
SELECT count(*),sex FROM students GROUP BY sex 

#1.统计年龄大于18 的人数
SELECT COUNT(*) ,age
FROM students 
WHERE age>18 
GROUP BY age


#根据1的结果进行筛选,查询那个年龄的人数大于2  
-- HAVING

SELECT COUNT(*) ,age
FROM students 
WHERE age>18 
GROUP BY age
HAVING COUNT(*)>2


SELECT COUNT(*) ,age
FROM students 
WHERE age>18 
GROUP BY age
HAVING max(salary)

按函数分组

#函数分组
#案例 1:筛选名字长度,查询每一组长度大于1 的有哪些

SELECT COUNT(*),LENGTH(name) 
FROM students
GROUP BY LENGTH(name)

#案例 2:根据1查询大于1 的

SELECT COUNT(*),LENGTH(name) 名字长度
FROM students
GROUP BY LENGTH(name)
HAVING count(*) >1
-- 支持别名
SELECT COUNT(*),LENGTH(name) 名字长度
FROM students
GROUP BY 名字长度
HAVING count(*) >1

多个字段分组

#按多个字段分组

SELECT AVG(salary),age,salary
FROM students
GROUP BY  age,salary
HAVING AVG(salary)>1000

#添加排序
SELECT AVG(salary),age,salary
FROM students
GROUP BY  age,salary
HAVING AVG(salary)>1000
ORDER BY AVG(salary) DESC

#使用别名
SELECT AVG(salary) s,age,salary
FROM students
GROUP BY  age,salary
HAVING s
ORDER BY s DESC

4.3 连接查询

#连接查询  多表查询
/*
含义:字段来自多个表的时候使用

分类: 按年代分类:
				sq192 【只支持内连接】
				sq199【推荐】
				
				按功能分类:
							内连接:
										等值连接
										非等值连接
										自连接 
										
							外连接:
										 左外连接
										 右外连接
										 全外连接
							交叉连接:
							


*/

等值查询

#一、等值查询
/*
1.多表等值连接的结果是多表的交集
2.n个表至少要n-1个连接条件
3。多表对顺序木有要求
4.可以添加排序,分组等
5.可以取别名
*/



#案例1-- 查询用户的所用评论
SELECT uid,name,vid,ctext,ctime  FROM students,comment
where comment.uid = students.id

#案例2-- 查询用户对应的所有收藏
SELECT id,name,tid,ttime  FROM students,treasure
where treasure.uid = students.id


#2.为表起别名:当字段冲突时好用
/*
提高语句简洁度
区分多个重名字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
*/
SELECT comment.uid,cid,ctext FROM comment,treasure
WHERE comment.uid = treasure.uid

#使用别名
SELECT c.uid,cid,ctext FROM comment c,treasure t
WHERE c.uid = t.uid

#3. 加筛选
SELECT c.uid,cid,ctext FROM comment c,treasure t
WHERE c.uid = t.uid
and c.uid = 1

#4.添加分组
SELECT COUNT(*), cid FROM comment c,treasure t
WHERE c.uid = t.uid
GROUP BY c.cid

#5 添加排序
SELECT COUNT(*), cid FROM comment c,treasure t
WHERE c.uid = t.uid
GROUP BY c.cid
ORDER BY c.cid DESC

非等值连接

#非等值连接
#跟等值连接基本上一样,就是where语句不一样
SELECT COUNT(*), cid FROM comment c,treasure t
WHERE c.uid > t.uid
GROUP BY c.cid 
ORDER BY c.cid DESC

自连接

#自连接
/*

自己连接查询自己,同一张表内查询
*/

#案例1 :查询students表中对应的偶像
SELECT s.id,s.name,s.idol_id,idol.name 偶像
FROM students s,students idol
WHERE s.idol_id = idol.id

sql 199语法

 #sql199语法
 /*
 语法:
			SELECT:查询列表
			from 表1  别名【连接类型】
			join 表2  别名
			on  连接条件
			【where 筛选条件】
			【GROUP BY 分组条件】
			【HAVING 筛选条件】
			【ORDER BY 排序列表】
			
			
	分类:
	
	内连接:inner
	外连接:
					左外:lift 【OUTER】
					右外:right 【OUTER】
					全外:full 【OUTER】
					
	 交叉连接:aross				
 */
 
 #二外连接
 
 /*
应用场景:用于查询一个表中有,另一个表中没有 的记录

特点:
1.外连接查询的记录为主表中的所有记录
		如果从表中有和他匹配的值, 则显示匹配的值
如果从表中没有匹配的值,则显示nu
	
2.左外连接:left JOIN 左边是主表
							---
3.全外连接 = 内连接的结果 + 表1 中有但表2 没有的 + 表2 有但表1没有的


 
 */


#案例1;

SELECT uid,name,vid,ctext,ctime  FROM students,comment
where comment.uid = students.id

#s99语法
SELECT uid,name,vid,ctext,ctime 
FROM students JOIN `comment`
on `comment`.uid = students.id


#案例2:左外:lift 【OUTER】
#说明:left 会查询主表有而从表没有的数据
#两个表交换位置可以达到右外连接一样的效果

SELECT uid,name,vid,ctext,ctime
FROM students s LEFT JOIN `comment` c
ON `c`.uid = s.id
WHERE c.ctime is NULL


#右外连接
SELECT uid,name,vid,ctext,ctime
FROM students s right JOIN `comment` c
ON `c`.uid = s.id
WHERE c.ctime is NULL



#交叉连接  笛卡尔乘积
SELECT * FROM students s
CROSS JOIN `comment` c

4.4 子查询

简单介绍

#进阶7:子查询
/*
含义:
		出现在其他语句中的select语句,称为子查询或者内查询,外部的查询语句称为主查询或者外查询


分类:
		按子查询出现的位置:
								SELECT后面;仅仅支持标量子查询
								FROM后面:支持表子查询
								WHERE 或者having后面:
																	标量子查询(重点)
																	列子查询 (重点)
																	行子查询(重点)
																	
								EXISTS后面:(相关子查询):表子查询
								
		按结果集的行列数不同:
								标量子查询:结果集只有一行一列
								列子查询:结果集只有一列多行
								行子查询:结果集只有一行多列
								表子查询:结果集一般多行多列
		
		


*/



where 或者 having 后面

一、WHERE 或者 HAVING 后面
/*
1.标量子查询:单行子查询
2.列子查询: 多行子查询
3.行子查询: 多列多行

特点:
1.子查询放在小括号内
2.子查询结果一般放在条件右侧
3.标量子查询,一般搭配着单行操作符使用
<> = 

列子查询:一般搭配着多行操作符使用 in any/some all 

4.子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果

*/


-- 1.标量子查询:单行子查询
#案例1:谁的工资比dhl高?

#步骤1:先查询dhl的工资

SELECT salary FROM students 
WHERE name = 'dhl'

#步骤2:根据1查询的信息,查找高于该结果的数据
SELECT * FROM students
WHERE salary >(
     SELECT salary FROM students 
     WHERE name = 'dhl'
)


#案例2:工资要比dhl高,同时性别要和朱一龙的一样

SELECT sex FROM students
WHERE `name` = '朱一龙'


SELECT * FROM students
WHERE salary >(
     SELECT salary FROM students 
     WHERE name = 'dhl'
) AND sex = (
		SELECT sex FROM students
		WHERE `name` = '朱一龙'
)



#2.列子查询----------------------


#案例1:查询dhl收藏的视频
#步骤一:查询出uid为1,2的用户所收藏的视频vid
SELECT vid FROM treasure 
WHERE uid in (1,2)

#步骤二:根据一 查询出的vid查询视频的全部信息
SELECT * FROM video 
WHERE vid IN (
		SELECT vid FROM treasure 
		WHERE uid in (1,2)
)



#3.行子查询(结果单行多列或者多行多列)----------------------
#案例1:查询学生中年纪最小同时薪资最高的

#常规方法
SELECT MIN(age) FROM students

SELECT MAX(salary) FROM students

SELECT * FROM students
WHERE age = (
	SELECT MIN(age) FROM students
) and salary = (
	SELECT MAX(salary) FROM students
)

#用行子查询
SELECT * FROM students
WHERE (age,salary) = (
	SELECT MIN(age),MAX(salary) FROM students
)

select后面

#案例1:查询用户评论的条数
SELECT * , (
		SELECT COUNT(*)
		FROM `comment` c
		WHERE s.id = c.uid
) 评论总数
FROM students s;

from后面

#三、from后面
#案例1:查询students中男女平均工资等级

#首先查询男女的平均工资
SELECT AVG(salary) ag,sex
FROM students
GROUP BY sex


#根据1 查询男女平均工资等级
SELECT sex_avg.*,l.lev
FROM (
		SELECT AVG(salary) ag,sex
		FROM students 
		GROUP BY sex
) sex_avg 
 JOIN `level` l
ON sex_avg.ag BETWEEN low_sal and hight_sal


exists 后面

#exists 后面(相关子查询)
/*
语法:
exists(完整的查询语句)
结果为:0/1  类似于布尔值
*/

#查询所有对视频评论过的学生
#查询过程:先查询学生表,再根据exists后面的条件进行过滤
SELECT name,s.id 
FROM students s
WHERE EXISTS(
			SELECT *
			FROM `comment` c
			WHERE s.id = `c`.uid
)

#查询所有对视频没有评论过的学生
SELECT name,s.id 
FROM students s
WHERE NOT EXISTS(
			SELECT *
			FROM `comment` c
			WHERE s.id = `c`.uid
)

4.5 分页查询

-- 4.5 分页查询
/*
应用场景:当要显示的数据条目过多,需要分页

语法:  (字母为执行顺序)
				7 SELECT 查询列表
				1FROM 表  1
				2【JOIN type 表2】 2
				3 ON    连接条件
			 	4 WHERE 筛选条件
				5 GROUP BY 分组
				6 HAVING 分组后的筛选
				8 ORDER BY 排序
				9 LIMIT OFFSET  size
				
				
				offset:要显示的条目开始索引(从1开始)
				size:单页要显示的条目个数
				
*/

#案例1:查询用户前五条
SELECT * FROM students LIMIT 0,5;
SELECT * FROM students LIMIT 5;#0可以省略
#查询5-6
SELECT * FROM students LIMIT 5,2;

#案例2:工资从高到低的前五条
SELECT * FROM students 
ORDER BY salary DESC 
LIMIT 5;

4.6 联合查询

# 进阶9:联合查询
/*
union联合  合并:将多条查询的语句结果合并成一个结果

语法:
		查询语句1
		UNION 
		查询语句2
		UNION 
		查询语句3
		...
		
应用场景:
					当我们要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时。
					
特点:
1.要求多条查询语句中,每条查询的字段(列数)的相同的

2.要求的多条查询的中每一列的类型和顺序的一致的
3.使用union会自动去重,使用union all 可以不去重



*/

#案例1:查询所有年龄>18 或者工资大于50000的所有信息

#方法一:用or 
select * FROM students 
WHERE age >18 OR salary >50000

#方法二:UNION(默认去重)
SELECT * FROM students WHERE age >18
UNION 
SELECT * FROM students WHERE salary > 50000

#不去重
SELECT * FROM students WHERE age >18
UNION ALL

二、DML语言

#DML语言
/*
DML:数据操作语言
插入:INSERT
修改:UPDATE
删除:DELETE

*?

1.插入

#一、插入语句
/*
语法:
		方式一:	INSERT INTO 表名 ( 列名..,) VALUES(值1...)
			
		方式二: INSERT INTO 表名 SET 列名= 值1...

*/

#1.插入值的类型要与列的类型一致或者兼容
INSERT into boys (bid,name,sex,cp_id) 
VALUES (2,'吴京','男',1)

INSERT into girls (gid,name,sex,age ,cp_id) 
VALUES (1,'楠楠','女',25,2)

2.不可以为null的列必须插入值,可以为null的如何插入值?
#方式一:值写null
INSERT into boys (bid,name,sex,age,cp_id) 
VALUES (1,'周星驰','男',50,null)

#方式二: 不写字段
INSERT into boys (bid,name,sex,age) 
VALUES (3,'张学友','男',51)


#3.列数和值的个数必须一致

#4.可以省略列名,默认所有列,而且列的顺序和表中的顺序一致
INSERT INTO boys VALUES(5,'至尊宝','男',500,6)



#方式二: INSERT INTO 表名 SET 列名= 值1...
INSERT INTO boys SET bid = 7,name='杨过',sex='男',age = 30,cp_id=2

SELECT * FROM girls


#两种方式的比较
#1.方式一支持多行插入,方式二不支持
INSERT INTO girls VALUES(6,'紫霞','女',499,5),(2,'小龙女','女',31,7)

#2.方式一支持子查询 ,方式二不支持
INSERT INTO girls 
SELECT * FROM boys

2.修改

#修改语句

/*
语法:
			1.修改单表的数据【重点】
			UPDATE 表名
			set 列=新值,列=新值
			WHERE 刷选的条件
			
			2.修改多表{补充}
			
			sql192语法:
			UPDATE 表1 别名,表2 别名
			set 列 = 值...
			WHERE 连接条件
			and 筛选条件
			
			
			sql199 语法:
			UPDATE 表1 别名
			INNER | left | right JOIN
			on 连接条件
			set 列=值1...
			WHERE 筛选条件
			
			
			

*/


#1.修改单表的数据
UPDATE students SET salary = 99999999,age = 21
WHERE name = '丁辉龙'


#2.修改多表数据
UPDATE boys b  LEFT JOIN girls g
ON b.cp_id = g.gid
SET b.cp_id = 99
WHERE b.cp_id is NULL


3.删除

/*
删除语句:
方式一:DELETE

语法:
1、单表的删除【重点】
DELETE FROM 表名 WHERE 筛选条件

2.多表的删除【补充】

sql192语法:
DELETE 表1的别名,表2 的别名(要删谁就加哪个)
FROM 表1 别名,表2 别名
WHERE 连接条件
AND 筛选条件


sql199语法:
DELETE 表1的别名,表2 的别名(要删谁就加哪个)
FROM 表1 别名
INNER | left | right JOIN  表2 
ON 连接条件
WHERE 筛选条件



方式二:TRUNCATE(X,D)
语法:truncate table 表名;(用于删除一个表)


3.delete 和 truncate 的比较
	1.delete可以添加筛选添加,truncate不可以
	2.truncate删除的效率高一点点
	3.如果要删除的表中有自增长,
		用delete后,再插入数据,自增长列的值从断电开始
		用truncate删除后,再插入数据,自增长列的值从0 开始
	4.deletes删除后可以回滚,truncate不可以
	5.delete删除有返回值(返回删除的行数),truncate没有
		
*/

#方式一:deete
#1、单表的删除
#案例1: 删除girls表中名字为张学友的信息
DELETE FROM girls WHERE name='张学友'


#2.多表删除
#案例:删除girls中没有对象的人员信息
DELETE g
FROM boys b
LEFT JOIN girls g 
ON b.cp_id = g.gid
WHERE g.cp_id is NULL

#方式二:TRUNCATE(X,D)

#案例:删除整个girls表
TRUNCATE TABLE girls

三、数据类型

1.浮点型

浮点数类型 字节 范围
float 4 很大
double 8
定点数类型 字节 范围
decimal m+2
/*

FLOAT(m,d)
DOUBLE(m,d)
DECIMAL


特点:
1.m:整数部位+小数部位
   d:小数部位
   
2.	m  d 都可以省略
3.DECIMAL 默认为 (m,d)= (10,0)
*/

你可能感兴趣的:(mysql,数据库,mysql,sql)