常用指令
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 |
|
|
|
|
/*
FLOAT(m,d)
DOUBLE(m,d)
DECIMAL
特点:
1.m:整数部位+小数部位
d:小数部位
2. m d 都可以省略
3.DECIMAL 默认为 (m,d)= (10,0)
*/