MySql语法

这篇博客详细介绍了MySQL的各种操作,包括创建、插入、修改和删除表数据,查询操作如分页、条件、模糊和排序查询,以及函数应用如数学、日期和流程控制函数。此外,还涵盖了连接查询、子查询和聚合函数的使用。
摘要由CSDN通过智能技术生成

创建表:

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字段,然后合并为同一张表

所以联合查询的应用场景为:
要查询的结果来自于多个表,且多个表没有直接的连接关系,查询的信息一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值