Day04_C语言网络编程20250716_sql语言大全
linux中sql语法大全:
MYSQL 数据库
什么是数据库:关系型数据管理系统
数据库的结构层次:数据库文件(后缀名 .db) -> 表单 -> 字段 -> 存储的数据
数据库里面针对数据的所有操作,都需要使用指令去实现
MYSQL数据库特点:特别适合web的环境,和PHP结合非常好
低版本的MYSQL依旧是开源软件,适合用来做二次开发
先安装一下mysql
安装前,检测是否安装了mysql:
rpm –qa | grep mysql
安装 mysql:
yum -y install mysql 安装mysql数据库
yum -y install mysql-server 安装mysql数据库服务器端
yum -y install mysql-devel 安装数据库开发包
如果mysql出了重大问题,可以考虑卸载后重装
普通卸载: rpm -e mysql,只会卸载mysql本身
强力卸载: rpm -e --nodeps mysql 会把 mysql以及mysql依赖的所有的相关文件全都删除
使用yum卸载(使用yum卸载的话,必须保证mysql是使用yum安装的):
yum remove mysql(会把 mysql-server 和 mysql-devel同时删除)
安装完成mysql之后,需要启动一下mysql服务器(每次开机都要执行)
service mysqld start
mysqladmin工具(管理工具)
mysqladmin --version 检测mysql版本
其实很多软件都是使用 --version来确认版本的
第一次安装好mysql之后,注意一定要设置一下 管理员账号的密码
mysqladmin –u root password “想要设置的密码” (假设当前设置的密码为abc)
进入mysql数据库
mysql –uroot –pabc 这种登录形式不太安全,一般我们采用下面的登录方式
mysql –uroot –p 回车后再去输入密码
注意,进入mysql之后,仅仅处于mysql的操作界面
上面说过的mysql的具体结构体 (数据库文件-表单-字段-数据),我们都没有进入
退出 mysql
quit 或者 exit
数据库的语句分类
① DDL (database definition language) 数据库定义语句
其实就是用来:创建、编辑、删除 数据库文件.db 的指令
② DML(database manipulation language) 数据库操作语句
其实就是用来: 操作 表单的 指令
③ DCL(database control languge) 数据库控制语句
注意:数据库语句,绝大部分要求以 “;” 结尾,如果没有 “;” 直接按了回,数据库会认为是一条语句,只不过中间带了换行符
创建数据库
create database 数据库名字; (这种形式是进入到mysql操作界面中去创建数据库的)
mysqladmin –uroot –p create; 数据库名字(这种形式是出于终端界面只能时候创建数据库的)
在 mysql 里面 创建名字叫 test1的数据库
在终端里面,创建名字叫 test2的数据库
查看有哪些数据库
Show databases
注意:所有在外部操作数据库的语句,必定会在最前面带上 mysqladmin ,如果没有这个mysqladmin,说明都是需要进入到数据库内执行的语句
删除数据库
drop database 数据库名 (数据库内语句)
mysqladmin –uroot –p drop 数据库名 (数据库外语句)
选择数据库
在针对任意表单操作之前,先要确定我们之后要操作的是哪个数据库中的表单
Use 数据库名
创建表单
create table if not exists 表单名(
字段名1 数据类型 约束类型,
字段名2 数据类型 约束类型,
……,
字段名n 数据类型 约束类型
);
注意:每一行字段最后,用 “,” 隔开,但是最后一行字段的最没有 “,”上面语句表示:如果不存在 “表单名” 这个表单的话,则按照以下格式创建表单
字段名:准备存储的数据的标签
数据类型:存储的数据的类型,mysql的数据类型有以下几种常用类型
Integer或者int 整形
Varchar(字符串的最大长度) 字符串类型
Float 浮点型
Double 双精度浮点型
约束类型:专门约束字段,作用是限制这个字段代表的数据他的取值范围或者行为模式
约束有以下几种情况
Primary key —— 主键约束:将被 primary key 所约束的字段,设置成主键
什么叫主键:主键字段中的数,不能修改,不能重复
像身份证号码这种数据,就可以设置成主键字段
Auto_increment —— 数值自增 这个只能用在主键约束上。并且主键的数据类型如果是字符串类型,则不能使用 auto_increment
在添加新的一条记录的时候,其实是可以选择性的让某些数据为空
如果这些为空的数据,被 auto_increment 所约束的,则会根据上一条记录值,自动自增1之后,作为本条记录的值使用
Not null —— 非空约束
在添加新的一条记录的时候,如果被 not null 所约束的字段,数据为空的话,则此记录添加失败
Default val —— 默认约束
在添加新记录的时候,如果被 default 所约束的字段,数据为空的时候,则直接选用默认值 val
Check(检查条件) —— 检查约束
在添加新记录的时候,判断一下新记录里面,被检查约束的字段 对应的 数据,是否满足检查条件,如果满足,则添加成功。反之添加失败
例如有一个字段为: score int check(score>=0 and score<=150)
在添加新数据的时候,添加给score字段的数据,必须在 0~150分之内,否则添加失败
又例如 : score int check(score<0 or score>150)
在添加新数据的时候,添加给score字段的数据,必须 <0分 或者 >150分
我们也看出来了:mysql里面 and 表示并且,or表示或者
又例如 name varchar(20) check(length(name)>=2 and length(name)<=6)
在添加姓名的时候,要求姓名的长度 在 2~6 之间
创建表单,要求如下
姓名 字符串类型 检查约束(姓名的长度在 2~6 之间)
学号 整型数 主键约束 自增约束
年龄 整型数 非空约束
性别 字符串类型 默认约束,默认为”男性”
成绩 整型数 检查约束(成绩的范围为 0~150分)
显示当前数据库中的所有表单
Show tables
显示当前数据库中指定表单的结构,就是显示一个这个表单的创建语句
Desc 表单名
删除表单
Drop table 表单名
针对数据库表单本身的操作:编辑表单功能 alter
修改表单的名字:现在的表单的名字叫做tb1,我想要把它改名成table1
Alter table 原先的表单名(注:此处就是tb1) rename to 新的表单名(注:此处就是table1)
为指定的表单,添加新的字段(以及字段对应的数据类型和约束类型)
Alter table 等待编辑的表单的名字(注:此处就是table1) add column 准备添加的字段的名字 字段的数据类型 字段的约束
为指定表单删除字段
Alter table 表单名 drop column 字段名
更改默认约束的字段的默认值
Alter table 表单名 alter column 字段名 set default “新的默认值”
更改数据的引擎
Alter table 表单名 engine=InnoDB
我们要修改的引擎其实最主要就是改成 InnoDB,只有这个引擎支持事务性存储
修改指定表单中指定字段的数据类型Alter table 表单名 modify column字段名 目标数据类型
修改指定表单中指定字段的字段名以及数据类型
Alter table 表单名 change column 字段名 新的字段名 新的数据类型 新的约束类型
如果新的字段的数据类型,与原先字段的默认值不匹配的话,原先字段的默认约束将会被删除
数据的增删改查排遍历:
向表单中添加新数据:
Insert into 表单名(字段1,字段2,…,字段n) values(字段1对应的数据,字段2对应的数据,…,字段n对应的数据)
添加新记录的时候,如果 有某个字段没有写的话,那么表单中该字段的数据就是空的,如果这个空的字段是非空约束的,则会因为违反约束而添加失败。如果是默认约束的话,则会直接选用默认值。如果是主键约束,并且有 auto_increment修饰的话,则会自动选取上一条记录这个字段的值,自增后选用
例如 tb1 里面 name(not null),id(primary key auto_increment),age(default 20)
Insert into tb1(name,id,age) values(“张三”,220701,20)
此时,添加第二条记录 insert into tb1(name) values(“李四”)
理论上来说,id 和 name 在 “李四” 这条记录里面是空的
但是,id由于 auto_increment 的原因,”李四”的id会自动的根据”张三”的id,自增后选用,也就是 “李四”的id最终就是 220702
同理 age 由于 default 20 的原因,”李四”的年龄也会默认的选用 20
此时,添加第三条记录 insert into tb1(id) values(220703)
由于 name被非空约束,不能为空,所以这条记录会添加失败(5.1的mysql会给出一个warning,但是依旧添加成功,我们测试从5.7开始,not null 约束,会正确的导致添加失败)
查询表单中的所有数据
Select 字段1,字段2,…,字段n from 表单名
会在 指定的表单中,选择并显示给出的字段所对应的数据
其实,如果我们想要查看一张表单中的所有字段的话,没有必要把所有字段都给打上,只需要使用 * 去替换所有字段就好了
Select * from 表单名 表示显示指定表单中的所有字段对应的数据
如果想要查看指定的数据的话,千万不要 select 指定数据 from 表单名
应该要使用一个叫做 where 字句的东西
所谓的 “字句” 表示允许跟在绝大部分语句后面,不会有语法问题
Where 字句的语法: where 后面直接跟查询条件
例如:显示张三的信息:
Select * from tb1 where name=”张三”;
例如:显示年龄大于25岁的所有人
Select * from tb1 where age>25
例如:显示年龄大于25岁,且考试分数大于80分的人
Select * from tb1 where age>25 and score>=80
例如:显示考试分数在 80~100 分之间
Select * from tb1 where score>=80 and score<=100
Select * from tb1 where score between 80 and 100
例如:显示考试分数为90分或者100分的人
Select * from tb1 where score=90 or score==100
例如:显示考试分数为 80分,90分,100分,110分的人
当然可以 把以上4个分数用 三个or连接起来
Select * from tb1 where score=80 or score=90 or score=100 or score=110
Select * from tb1 where score in (80,90,100,110);
关于浮点数的查询
假设现在 tb2 里面有一条记录 “zhangsan” 80.2
通过分数查询: select * from tb2 where score=80.2;
发现结果为空,查不到数据
因为浮点数在做 == 比较的时候,是需要明确精度的
在 mysql 里面 查询浮点数的正确的做法应该是
Select * from tb2 where -0.01<(score-80.2) and (score-80.2)<0.01
此处的-0.01 和 0.01 表示查询浮点数的时候,精确到小数点后2位
还有一种简化的写法
Select * from tb2 where ABS(score-80.2)<0.01; ABS()这个函数是取绝对值
关于显示数据的时候,做数据排序 :order by 字句
Order by 字段名,表示根据该字段进行排序
Order by的最后,还可以写 asc(升序,默认选项) 和 desc(降序)
刚才说过了,字句是可以添加在任何语句后面的,包括其他字句 所以order by是可以配合where字句使用的
例如 根据分数降序查看 zs,ls,ww,zl,zq的所有数据
Select * from tb2 where name in (“zs”,”ls”,”ww”,”zl”,”zq”) order by score desc
注意:where字句一定在前面。放到order by 字句后面去写是有问题的
关于模糊查找:like
在like语句里面:
使用 _ 表示 1个数据的占位使用 % 表示0~n个数据的占位
例如: select * from tb2 where name like “徐_ _”
显示所有姓”徐”的,并且名字是2个字的人
例如:select * from tb2 where name like “徐%”
显示所有 “徐” 开头的名字的信息,甚至只有 “徐” 后面都没有也会显示
例如: select * from tb2 where name like “%徐%”;
由于%表示 不定量数据的占位,”%徐%” 代表”徐”允许出现在任意位置
表示显示所有 名字中带 “徐” 的人
例如:select * from tb2 where name like “徐_%”
显示 所有姓 “徐”的,且名字最少是1个字的人的姓名
关于查找数据的时候,限制显示数量 limit
语法结构是 limit … offset… 其中offset可以省略
Limit n offset m,offset 不写的话,默认offset后面的m=0
从第m行开始 显示n行内容
简单理解就是:排除最开始的m行内容后,显示n行内容
Select * from tb2 limit 2
显示 tb2 表单里面,最前面的2条数据(第0条和第1条)
Select * from tb2 order by score desc limit 5
显示 tb2 表单里面,成绩最高的5个学生
先将成绩降序排序,再显示前5个,显示的就是分数最高的5个
Select * from tb2 order by score asc limit 3 offset 5;
显示分数最低的5个人以外的,分数最低的3个人
Limit n offset m 还有一种简化写法: limit m,n
功能一样的,排除掉最前面的m个,再显示排出后的最前面的n个
关于删除数据
Delete from 表单名 :会删除这张表单中的所有的数据
Delete from 表单名 where 查询条件: 会删除表单中符合条件的那条数据
例如:delete from tb2 where name =”张三”
删除姓名为张三的
例如:delete from tb2 where score <= 90
删除分数 <= 90 的所有记录
例如:delete from tb2 where name like “%徐%”
删除所有姓名中带有 “徐”字的记录
再次强调,delete 后面如果不跟 where查询的话,会将整张表单全都删除
关于修改数据
Update 表单名 set 字段=新数据 where 查询
例如:update tb2 set score=150 where name=”张三”
将tb2表单中,名字叫张三的这个人的分数,修改成150分
Update tb2 set score=score+20 where name like “%徐%”
将tb2表单中,所有名字中带有 “徐” 的人的分数,加上20分
注意:同样的,如果update语句后面,不带where的话,则会整张表单全都修改
关于多表联查:使用关键字 union
可以从2张不同的表单中,查询信息
Select 字段名 from tb1
union
select 字段名 from tb2 ;
当所查询的字段,在2个表单中都存在的时候,查询语法成立
针对相同字段,在2张表单中查询到的数据,如果数据相同则合并,数据不同,则逐一列出
但是,当union后面追加单词 all的时候,那么此时,联合查询的时候,无论是否数据一样,都不会合并
联合查询的时候,是允许查询不同字段的,但是查询不同字段数据时候,必须使用where字句保证查询的依据是一样
Select id,class from tb1 where name=”zs”
Union
Select name,score from tb2 where name=”zs”
总结:当联合查询,查询的字段不一样的时候,一定保证 查询的条件是一样的
其实条件不一样也就是造成了没有必要联合查询的结果
当联合查询,查询不同字段的时候,显示出来的字段名称取决于联合查询的第一个select所使用的字段。这就造成一个结果,显示出来的表格的表头不太合适
所以,我们要为显示出来的表格里面的表头重新命名 使用 as语法
Select name,class as class_score from tb1 where name = “zs”
Union
Select name,score from tb2 where name=”zs”;
As 功能,取别名
在select 语句中,字段后面 + as + 该字段的别名,以字段的别名代替字段进行显示
关于多表交叉查询:
有一个指令叫做 join,会把2个以及2个以上的表单,组合成一张新的虚拟表单,多表交叉查询其实就是指对这张虚拟表单进行查询
Join有以下几种方式
Cross join:建立新的虚拟表单的规则为:假设 tb1 有2条记录,tb2有3条记录
那么 cross join 之后的虚拟表单,总共有 2*3 条记录
Select * from tb1 cross join tb2 where tb1.name=”zhangsan”
交叉连接 tb1 和 tb2 ,然后显示虚拟表单当中,表单1中的姓名为”zhangsan”的所有记录
Inner join 内连接2张表单:目前来说和cross join 没啥区别
Left join:左连接
连接后,查询内容,只显示tb1中的内容,tb2中的内容显示为空
注意,left join的时候一定要使用 on 去明确查询条件
也就是说,只拿on后面的数据去做交叉连接,显示的时候,显示on提示的数据
Right join :右连接,和左连接相反
依旧只做 on 后面的数据的交叉连接
没连接的数据,只显示tb2的
关于group by字句:专门用来做分类的
会将所有的分组条件一样的数组,全都合并到第一条数据里面去
数据库中的函数
计算和:
Select name,price*inventory as asset from tb3;
查询所有的水果的库存价值(库存*单价):查看所有的水果姓名以及库存*单价(重命名为asset)
当然数据库中还有很多封装好的函数:
Length(str):计算传入的字符串的长度
Count():计算数量
Select count(*) from tb:统计表单 tb中有多少条数据
Select count(*) from tb where score>90:统计表单tb中,成绩>90分的记录的数量
Sum(字段名):统计函数 指定表单当中所有该字段的数据的和
Select sum(salary) from tb:统计tb表单当中,所有工资的和
Max(字段名):求最大值 指定表单中 指定字段的最大值
Select name,max(score) from tb:查询tb表中分数最高的人的姓名和他分数
Min(字段名):求最小值
Avg(字段名):求平局值
Select avg(score) from tb:显示tb表中成绩的平均值
Select * from tb where score <(select avg(score) from tb);
()中的内容会计算出 表单tb中的分数的平均值,然后以这个平均值去和score比较
结果就是:显示tb表单中,所有分数小于平均值的人的信息
ABS(x):返回x的绝对值
CEIL(x):返回 >= x 的最小值整数
CEIL(1.6) 返回2
CEIL(2.1) 返回3
FLOOR(x): 返回 <= x的 最大值整数
FLOOR(1.6) 返回1
FLOOR(2.1) 返回2
RAND():返回0-1的随机数
RAND(x):依旧是返回 0-1的随机数,只不过随机种子为 x
只要随机种子不变,产生的随机值永远不变
也就是说 ,无论执行几次 RAND(10),产生的随机值都是样的,因为随机种子没变,一直是10
SIGN(x):返回x的符号,负数返回-1,0返回0,正数返回1
SIGN(-1),SIGL(-2),SIGL(-3),都会返回-1
SIGN(0) 返回0
SIGN(1),SIGL(2),SIGL(3) 返回的是1
PI():返回圆周率
TRUNCATE(x,y):返回x保留小数点后y位的值,不会四舍五入
TRUNCATE(1.23456,3) 结果就是1.234
ROUND(x,y) :返回x保留小数点后y为的值,会四舍五入
ROUND(1.23456,4) 结果就是 1.2346
ROUND(x):返回距离 x 最近的整数
ROUND(1.234) 返回1
ROUND(1.567) 返回2
POW(x,y),POWER(x,y):都是返回 x的y次方
POW(2,3) 返回 8
SQRT(x) ,返回x的平方根
SQRT(25) 返回5
MOD(x,y):返回 x 除以 y 之后的余数
MOD(5,3) 返回 2 5 /3 = 1…2
MOD(5,2) 返回 1 5/2 = 2…1
LENGTH(str): 返回str的字节数量
Mysql里面,一个简体中文字占2个字节,繁体中文占3个字节
Length(“你好123”) 返回的是7
CHAR_LENGTH(str):返回str的字符数量
Length(“你好123”) 返回 5
CONCAT(s1,s2,….) 将s1,s2….等多个字符串合并成一个字符串
CONCAT(“你好”,”中国”) 返回 “你好中国”
CONCAT_WS(x,s1,s2,…):依旧是合并字符串,但是每个字符串之间,都以x作为连接符号
CONCAT(“-”,”你好”,”世界”,”中国”) 返回值就是 “你好-世界-中国”
INSERT(s1,x,len,s2):将字符串s2替换字符串s1中x位置开始的len个长度字符串
INSERT(“12345678”,2,3,”abc”):使用 abc 去替换 12345678中第2个数字开始的3个长度字符串,也就是使用abc去替换234,最终结果就是 1abc5678
UPPER(s) :将s字符串中的所有小写字母改成大写
LOWER(s):将s字符换中的所有大写字母改成小写
LEFT(s,n):返回字符串s当中前n个字符组成的字符串
LEFT(“123456”,3) 返回值就是 “123”
RIGHT(s,n):返回字符串s当中后n个数据
REPEAT(s,n):将字符串 s 重复n次
REPEAT(“123”,3), 结果就是 123123123
RELPACE(s,x,y):将字符串s中的字符x,全都替换成字符y
REPLACE(“123123111”,”1”,”x”),结果就是 “x23x34xxx”
STRCMP(s1,s2) 比较2个字符串是否相等
SUBSTRING(s,n,len):获取从字符串s中的第n个位置开始,总长度为len的字符串
SUBSTRING(“123456”,2,3),结果就是 234
INSTR(s,s1) ,从字符串s当中,获取s1的开始位置
INSTR(“hello world”,”ell”) 返回2
如果s1在s中不存在,则返回0
REVERSE(s):将字符串 s 逆序
REVERSE(“abcde”) 返回 “edcba”
条件判断函数IF(表达式,v1,v2):判断表达式是否成立,成立的话返回v1,不成立返回v2
有点像c语言中的三目运算符
IFNULL(v1,v2):如果v1的值为NULL,则返回v2,
如果v1的值不为NULL,则返回v1
Ifnull(“123”,”abc”): v1 不为空,所以返回 “123”
Ifnull(NULL,”abc”):v1 为空,所以返回”abc”
系统函数
VERSION() 返回数据库的版本号
DATABASE() ,SCHEMA() 返回当前选择的数据库
如果当前没选择数据库的话,则返回NULL
USER(),SYSTEM_USER():返回当前用户账号,超级管理员账号为 root
LAST_INSERT_ID() 返回下一次准备使用的 auto_increment 的值
例如第一次加数据 id = 220701,id拥有 auto_increment属性
第二次添加数据id不管,那么id的值是 220702
此时调用 last_insert_id() 他的返回值就是 220703