0
点赞
收藏
分享

微信扫一扫

mysql -笔记

624c95384278 2022-03-11 阅读 49

常用指令

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
举报

相关推荐

Mysql 笔记

mysql笔记

MYSQL笔记

Mysql笔记

MySql笔记-3

mysql配置笔记

mysql笔记-事务

0 条评论