创建表:
CREATE TABLE `user`(
`username` VARCHAR(20) NOT NULL PRIMARY KEY,
`password` VARCHAR(20) NOT NULL
);
插入表内数据
insert into`user`(`username`,`password`)VALUES('123','123')
也可以用set方式进行插入,但这种方式不支持子查询,也不能插入多行:
insert into`user` set username=123,password=123
修改表内数据
UPDATE `user` SET username=132,PASSWORD=132 WHERE username=12345
删除表内数据
delete from user where username=132
还有一种删除方式是truncate,它是直接把表内数据全部删除,而且它的删除不能回滚,delete可以回滚,这是面试可能会出现的问题。具体可以查百度
truncate table user
查询
分页查询:
select* from `user` limit 0,2
意思时:查找user表,每次搜索2条数据,从下标0开始,所有结果为下标为0和1的数据
查询表内数据
select * from user where username=${id}
查询某个字段
查询user表内的username字段
查询user表内的username和password字段
select username from user;
select username,password from user;
起别名
关键词:as (可以省略不写)
将user表里的 username列 查询显示为name列。
好处:提高可读性
select username as name from user
当为表起了别名后,则查询字段就不能按照原来的表明去限定:
#这是对的
select u.username as name from user as u
#这是错的
select user.username as name from user as u
查询去除重复
在select后面加入关键字DISTINCT(distinct)。
SELECT DISTINCT username FROM USER
将列进行拼接
比如说,表里有两列,一列是姓,一列是名,然后查询是想组成一列
关键字:CONCAT (concat)
SELECT CONCAT (username,PASSWORD) FROM USER
条件查询
查询user表内 username等于Tom的字段
关键字:where
select * from user where username='Tom'
条件判断符:!=,>,<…
也可以添加点逻辑预算关键词:and,or, not
select * from user where username='Tom' and age>15
模糊查询
关键词:like,between…
like关键字:
- %:表示多个字符
- _ :单个字符
查询user表中,username列包含 ‘1’ 的数据
SELECT * FROM user WHERE username LIKE '%1%'
%的意思:表示可能1前面有字符,后面也可能有字符。比如1%:表示开头是1的。
SELECT * FROM user WHERE username LIKE '1_'
注意点:
比如我们的username的值就是1_,所以我们这个下划线并不是充当通配符,而是普通的符号,所以我们可以用一个转义符 “\”
between关键字:
select * from user where age between 10 and 20
相当于
select *from user where age=>10 and age<=20
in关键字:
select *from user where age in(10,20,30);
相当于:
select *from user where age=10 or age=20 or age=30
is关键词
mysql里面的 “=” 是字符串比较,但是并不能判空
如果要判空则需要用is关键字,当然也有:is not null。
select *from user where age is NULL
排序查询
关键词:order by
一般都会放在语句的最后,limit语句除外
asc:升序 (不写默认是升序)
desc:降序
意思是通过username字段及那个徐进行排序查询
SELECT *FROM USER ORDER BY username DESC
排序查询嵌套:
意思是:先通过password字段升序排序,然后再将password字段相同的通过username降序排序,
SELECT *FROM USER ORDER BY PASSWORD ,username DESC
常见函数
字符拼接函数
关键词::concat
SELECT CONCAT('123','456')
转换大小写
关键词:UPPER,LOWER
SELECT UPPER('qwe')
SELECT LOWER('QWE')
字符串的截取
关键词:SUBSTR
从第二位开始截取后面的内容
注意点:这里的下标是从1开始。
SELECT SUBSTR('123456789',2)
查看子串第一次出现的索引
关键词:instr
SELECT INSTR(123456789,456)
除空格函数
关键词:TRIM(只是出去先后的字符,要是中间夹着要出去的字符就无能为力了)
结果只出现’123’
SELECT TRIM(' 123 ')
除去前后是‘a’的字符,结果打印‘123’
SELECT TRIM('a' FROM 'aaaaaaaaa123aaaaaaa')
填充字符
关键词:rpad(右填充),lpad(左填充)
意思是:字符串123,设定字符串长度是10,不够长度10的话,用0进行填充
SELECT LPAD(123,10,'0')
SELECT RPAD(123,10,'0')
替换字符(串)
关键词:replace
将字符串123456789里面的123换成000
SELECT REPLACE ('123456123','123','000')
数学函数
四舍五入
关键词:round
select round(1.555)
保留两位小数
select round(1.555,2)
向上/下取整
关键词:ceil,floor
结果返回2(返回>=参数的最小整数)
select ceil(1.35)
结果返回1(返回<=参数的最小整数)
select floor(1.35)
截断
关键词:truncate
直接保留1位小数,不进行四舍五入
SELECT TRUNCATE (1.555,1)
求模
关键词:mod
select mod(10,3)
select 10%3
日期函数
返回当前系统日期+时间
关键词:now
select now()
返回当前系统日期,不包含时间
关键词:curdate
select curdate()
返回时间,不包含日期
select curtime()
将字符通过指定格式转换成日期
select str_to_date('1998-2-14','%Y-%m-%d')
将日期转换成字符
select date_format(now(),'%Y年%m月%d日')
日期的相减,返回天数
关键词:datediff
SELECT DATEDIFF(NOW(),'1998-12-12')
流程控制函数
关键词:if
第一个参数:判断参数
第二个参数:当结果为true时的取值
第三个参数:当结果为false时的取值
结果返回1
select if(10>5,'1','2')
分组函数,分组查询
功能:用作统计使用,又称聚合函数或统计函数或组函数
分组前筛选:where(group by前 )
分组后筛选:having(group by后)
求和
关键词:sum
select sum(age) from user
求平均
关键词:avg
select avg(age) from user
求最大,最小
关键词:max,min
select max(age) from user
求总数
select count(age) from user
查询每个部门的平均年龄
关键词:group by
select avg(age),department from user
group department
查询超过n个人数的部门
这里涉及到一个关键词:having
having其实是跟where的作用是差不多的,但是where跟在from后面,优先级比分组group by高,但是这里需要分组后再进行筛选,所以用到having,它的优先级比group by低。
SELECT COUNT(*),num FROM USER
GROUP BY num
HAVING COUNT(*)>2
查询工资超过10有2个以上的部门人数
SELECT COUNT(*),salary,department FROM USER
WHERE salary>=10
GROUP BY PASSWORD
HAVING COUNT(*)>2
连接查询(多表查询)
当查询的字段来自多个表时,就会用到多表查询
创建数据环境:
CREATE TABLE parent(
NAME VARCHAR(20) NOT NULL,
child INT(10) DEFAULT NULL
);
INSERT INTO parent VALUE('Tom',1);
INSERT INTO parent VALUE('Sale',2);
INSERT INTO parent VALUE('Jack',3);
INSERT INTO parent VALUE('Moli',4)
CREATE TABLE friend(
id INT(10) NOT NULL,
NAME VARCHAR(20) DEFAULT NULL,
lovefriend INT(10) DEFAULT NULL
)
INSERT INTO friend VALUES(1,'tom',2)
INSERT INTO friend VALUES(2,'sale',1)
INSERT INTO friend VALUES(3,'jack',4)
INSERT INTO friend VALUES(4,'moli',3)
自连接
自连接:也就是一张表里面可以找出对应关系,显示出对应关系
SELECT a.id,a.name,b.id,b.name
FROM friend a,friend b
WHERE a.lovefriend=b.id
ORDER BY a.id ASC
内连接
关键词:inner join,on
意思是拿parent表和friend表进行匹配,如果满足条件(on)则显示出来。
在数学角度上来讲就是取两张表的交集
SELECT p.name,child
FROM parent p
INNER JOIN friend f
ON p.child=f.id
左/右(外)连接 (外连接)
关键词:left outer join,right outer join
以下面的左(外)连接为例,它以parent为主表。然后将parent的表内容全部显示,而friend表只显示和parent有关联的。
从数学的角度来讲,取得两表的交集和主表。
SELECT p.name,f.*
FROM parent p
LEFT OUTER JOIN friend f
ON p.child=f.id
SELECT p.name,f.*
FROM friend f
RIGHT OUTER JOIN parent p
ON p.child=f.id
全外连接(外连接)
也就是两张表的全部内容都会显示(由于不常用到就不写了)。
子查询
该数据库数据环境用的是上面连接查询的数据库环境。
语法:
用小括号括起来
按结果集的行列数不同进行分类:
- 标量子查询(一行一列):一般搭配<,>,=…操作符使用
- 列子查询(一列多行):一般搭配in,any/some,all进行使用
- 行子查询(一行多列)
- 表子查询(一般为多行多列)
出现位置:
- select后面:
标量子查询(一行一列)
- from后面:
表子查询(一般为多行多列)
- where或having后面(重点):
标量子查询(一行一列)(重点)
列子查询(一列多行)(重点)
行子查询(一行多列)
- exists后面(相关子查询):
表子查询(一般为多行多列)
查询表中的某列最大值字段(标量子查询)
注意,这是查询查询某值最大值的字段,而非是某一列的最大值是多少。
思路:先查询某列的最大值,再通过该最大值进行查询。
因为以下代码子查询的结果是一列一行的,所以是标量子查询
SELECT * FROM friend
WHERE lovefriend=(
SELECT MAX(lovefriend)
FROM friend
)
查询 1到3 号id的孩子的全信息(列子查询)
因为以下代码子查询的结果是一列多行的,所以是列子查询
SELECT *
FROM friend
WHERE id IN(
SELECT child
FROM parent
WHERE child BETWEEN 1 AND 3
)
联合查询
关键词:union
将多条查询语句的结果合并。注意,联合查询的列数要一样
SELECT * FROM parent
WHERE child>3
UNION
SELECT * FROM parent
WHERE child<=1
相当于:
SELECT * FROM parent WHERE child>3 OR child<=1
上面的例子看上去好像并没有去使用联合查询的必要,但是有时候又不得不使用联合查询,比如:查询不同两种表中的name字段,然后合并为同一张表
所以联合查询的应用场景为:
要查询的结果来自于多个表,且多个表没有直接的连接关系,查询的信息一致。