Loading... [dplayer url="https://qqclwy.com/wall/vd/mysql.mp4" pic="https://qqclwy.com/wall/vd/mysql.jpg" /] SQL其实就是用来储存数据的,软件在使用的过程中需要存储很多数据,例如有顾客在你的软件上开了一个月会员,它的会员到期时间也会存储在SQL里面,还有你微信上的余额这些都储存在SQL里面,所以SQL很重要。最初的SQL,就是将手头上复杂的数据资料变成表格,然后SQL逐渐的发展成一套规范的语言,最后在1986年的时候,被美国ANSI作为数据库的标准语言,不久后ISO将SQL采纳成国际标准。 **文章已进入停更状态** #幕一:SQL-DLL数据库操作 **[第一幕:目录]** 1.1 <a href="#1.1"> DLL-对数据库■的增删减改</a> 1.2 <a href="#1.2"> DLL-对数据库表的增删减改</a> 1.2.1 <a href="#1.2.1">DLL-创建一张■数据表</a> 1.2.2 <a href="#1.2.2">DLL-简单的数据类型介绍</a> 1.2.3 <a href="#1.2.3">DLL-强行修改字段名与数据类型</a> 1.2.4 <a href="#1.2.4">DLL-用sql命令去管理■数据库表</a> <a name="1.1"></a> **1.1 通过sql指令,对数据库进行增删减改。** |:----: | :----: | |功能|SQL| |查看大数据库里有哪些小数据库|show databases;| |创建一个数据库|create database [数据库名];| |使用这个数据库|use 数据库名;| |查看当前使用哪个数据库。|select database();| |删除数据库(提桶跑路)|drop database [数据库名]; | <a name="1.2"></a> **1.2系列学习目标:通过sql指令,管理小数据库下面的 数据表** 这系列学啥?就学对数据表的增删减改,就像你对一个txt文本增删减改一样。; **1.2.1 在小数据库下创建一张表(类似于在文件夹下创建一个txt文本)** ![DLL-数据库下建表.png][1] create table tb_user( id int(10), name varchar(5), age int(2) ) <a name="1.2.2"></a> **1.2.2 简单的数据类型介绍** ![DLL-数据类型 有符号及无符号.png][2] 如果要在数据库表里储存一个数字,那就必须要正确定义它能储存的类型。 有符号就是有负数,无符号就是无负数。 <u>其它都不用看,只需要知道int是定义整数,float浮点数是储存带小数点的数,double是双精度小数是用来储存0.0023234321这样的数就可以的</u>,别的,用的也比较少,大可不必了解。 ![Mysql数据类型.png][3] 不用全看,了解重点就好,字母、数字、中文都属于字符串,要在数据库中储存它们就得了解它们的数据类型,然后去定义它们。 char 和 varchar的区别: [哔哩哔哩][4] ,适用于对用户名的储存 TEXT的话,是长文本数据,适合将比较长的文章储存到数据库中,其它的可不必了解,遇到再回来看表格。 ![DLL-时间类型.png][5] 需要定义并储存时间数据的时候,再回来查就好啦。 ![DLL-常用类型.png][6] 这张图很好的阐述了如何用代码建表,定义字段的类型,是对近期学习的一个总结。 **蓝色的是字段名(可以自己随便取),青色的是数据类型,黄色的是注释(没什么用)。** <a name="1.2.3"></a> **1.2.3 那字段名和类型不小心写错了,能改吗?** 可以,提供了两种方法。 第一种: 只改数据类型! 语法:alter table <表名> modify <字段名> 新数据类型(长度) 第二种: 数据类型和字段名一起改! 语法:alter table <表名> change <旧字段名> <新字段名> 类型(长度) [comment 注释] [约束] 问题: 将emp表中旧的字段nickname替换成新字段username; 解决: alter table emp change nickname username varchar(30) <a name="1.2.4"></a> **1.2.4 数据表常用sql指令管理** |:----: | :----: | |功能|SQL语句| |查询当前数据库下的所有表|show tables;| |查询当前表的字段,类型,表结构|desc 表名;| |查询当前表更详细的参数 建表语句|show create table 表名;| |在表中新建字段|alter table <表名> add <字段名> 类型(长度);| |更改表的名字|alter table <旧表名> rename to <新表名>;| |删除表里的字段|alter table <表名> drop <字段名>;| |删除一张表|drop table [if exists] <表名>;| |清空表所有数据|truncate tabke <表名>;| #幕二:SQL-DML操纵表中数据 **[第二幕:目录]** 2.1 <a href="#2.1">如何给表中字段添加数据?</a> 2.2 <a href="#2.2">DML-修改数据</a> 2.3 <a href="#2.3">DML-删除数据</a> 〖第二幕学习目的〗 ![DML-学习目标.png][7] <u>前面学习了怎么建表,添加字段,给字段设定数据类型,旅途一直有在前进哦~ 现在终于到了给数据表添加数据了,我也好奇,这些数据是怎么通过sql指令导入的。</u> <a name="2.1"></a>**2.1 如何给表中字段添加数据?** 第一种:指定字段添加数据 语法:insert into <表名>(字段1,字段2..)values(值1,值2) 第二种:全部字段添加数据 语法:insert into <表名> values(值1.值2...) 第三种:批量添加数据 语法1:insert into <表名>(字段名1,字段名2...)values(值1,值2),(值1,值2),(值1,值2); 语法2:insert into <表名>(值1,值2..),(值1,值2..),(值1,值2..) |:----: | :----: |:----: | :----: |:----: | :----: | |id|name|gender|age|idcard|entrydate| ||||||| 这是一张只定义了字段的空表,下面,我们根据上面的语法给字段添加数据。 ① insert into <表名>(id,name,gender,age,idcard,entrydate) values('1','小昭','女','10','12345','2008-01-01'); ② insert into <表名> values('2','张无忌','男','18','12346','2008-01-01'); ③ insert into <表名> values('3','韦一笑','男','38','12347','2008-01-01'),('4','赵敏','女','18','12348','2008-01-01'); |:----: | :----: |:----: | :----: |:----: | :----: | |id|name|gender|age|idcard|entrydate| |1|小昭|女|10|12345|2008-01-01| |2|张无忌|男|18|12346|2008-01-01| |3|韦一笑|男|38|12347|2008-01-01| |4|赵敏|女|18|12348|2008-01-01| <a name="2.2"></a>**2.2 DML-修改数据** -- 修改上表id=1的数据,将'小昭'改成'小赵' ① update <表名> set name = '小赵' where = 1; -- 修改id=1的数据,将‘小赵’改回'小昭',并将gender修改为'男'。 ② update <表名> set name = '小昭' gender='男' where id = 1; -- 将所有员工的入职日期修改为'2008-01-01' ③ update <表名> set entrydate(字段) = '2008-01-01' <a name="2.3"></a>**2.3 DML-删除数据** 语法:delete from 表名[where 条件] 问题: 删除所有gender为‘女’的员工 解决: delect from <表名> where gender = '女'; #慕三:SQL-DQL 查询表中的数据 **[第三幕:目录]** 3.1 <a href="#3.1" target="_blank">表的基础查询</a> 3.2 <a href="https://qqclwy.com/zy/sql#3.2" target="_blank">表的条件查询</a> 3.3 <a href="#3.3" target="_blank">聚合函数</a> 3.4 <a href="#3.4" target="_blank">分组查询</a> 3.5 <a href="#3.5" target="_blank">排序查询</a> 3.6 <a href="#3.6" target="_blank">综合练习</a> 3.7 <a href="#3.7" target="_blank">执行顺序</a> **DQL全称是(Data Query Languge)数据库查询语言,用来查询数据库表中的数据。** 数据库查询的现实应用领域:在电商网站上,按品牌筛选搜索结果,实际上就是要求数据库只查询包含这个品牌的‘关键词’;或是需要用到价格升序或者降序,根据价格进行范围查询。 <a name="3.1"></a>**3.1 表的基础查询** |:----: | :----: | |功能|SQL语句| |查询表中指定字段的数据|select <字段1>,<字段2> from <表名>;| |查询所有字段的数据|select * <表名>| |查看该字段下的数据|select <字段名> [as '备注名'] from <表名>| |查看该字段下的数据(去除重复)1.1.2.2-->1.2|select distinct <字段名> ['备注名'] from <表名>| <a name="3.2"></a>**3.2条件查询** 数据库中检索符合条件的数据,并将它们整理显示出来。 |:----: | :----: | |功能|SQL语句| |查询年龄等于88的员工|select * from <表名> where (字段age) (!=><) 88;| |查询没有身份证号的员工|select * from <表名> where (字段idcard) is [not] null;| |查询年龄在15岁到20岁之间的员工 1|select * from <表名> where age>=15 and age <= 20;| |查询年龄在15岁到20岁之间的员工 2|select * from <表名> where age between 15 and 20;| |查询性别为 女 且年龄小于 25岁的员工|select * from <表名> where gender = '女' and age < 25;| |查询年龄等于18 或 35 的员工 1|select * from <表名> where age = 18 or age = 35;| |查询年龄等于18 或 35 的员工 2|select * from <表名> where age in(18,35);| |查询姓名只有两个字的员工信息|select * from <表名> where name like '__';| |查询身份证号最后一位是X的员工信息|select * from <表名> where idcard like '%X'| <a name="3.3"></a>**3.3 聚合函数** 聚合数据,快速得出表格各项数据的总值,平均值,最大值,最小值。 |:----: | :----: | |功能|SQL语句| |统计全部字段下的数据数量|select count(*) from <表名>;| |统计指定字段下的数据数量(不含null)|select count(<字段名>) from <表名>;| |统计指定字段下所有数据的平均值|select avg(<字段名>) from <表名>;| |统计指定字段下的最大值|select max(<字段名>) from <表名>;| |统计指定字段下的最小值|select min(<字段名>) from <表名>;| |统计西安地区员工的年龄之和|select sum(字段名age) from <表名> where <字段名workaddress> = ‘西安’;| <a name="3.4"></a>**3.4 分组查询** 根据某个的字段条件,将符合条件的字段进行统一分组。 |:----: | :----: | |功能|SQL语句| |语法|select <字段列表> from <表名> [where 条件] Group by 分组字段名[Having 分组后的过滤条件]| |根据性别分组,分别统计男女员工的数量|select gender, count(*) from <表名> group by gender;| |根据性别分组,分别统计男女员工的平均年龄|select avg(<age>) from <表名> group by gender;| <img src="https://qqclwy.com/usr/uploads/2023/06/1713104270.jpg" width="210"><img src="https://qqclwy.com/usr/uploads/2023/06/40207406.png" width="250"> 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址 [哔哩哔哩][8] SELECT <字段列表> FROM <表名> [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件] select workaddress, count(*) from emp where age < 45 group by workaddress [having] count(*) >= 3; where是对**分组之前**进行**过滤**,不满足where条件,则不参与分组;having是对**分组之后**的结果进行过滤。 where不能用作聚合函数,但having可以。执行顺序:where> 聚合函数 >having。 <a name="3.5"></a>**3.5 排序查询** 相当于浏览器的下一页,上一页这个功能,不过有趣的是,它能够设置一页显示多少条记录。 ![DQL-排序查询.png][9] 万能的语法小助手:select 字段列表 表名 limit 起始引索,查询记录数; 查询第一页的员工数据,每页展示10条记录 select * from <表名> limit 0,10 select * from <表名> limit 10; 上面这两种本质上功能相同,只是表达方式不同。 -- 2.查询第二页的员工数量,每页展示10条记录 ------> (页码-1)*页展示记录数 select * from emp limit 10,10; <a name="3.6"></a>**3.6 综合综合练习!!** 1,查询年龄为20,21,22,23岁的女性员工信息。 select * from emp where gender = '女' and age in(20,21,22,23); 2, 查询性别为 男,并且年龄在20-40岁(含)以内的姓名为三个字的员工 select * from emp where gender = '男' and between 15 and 20 and name like '___'; 3, 统计员工表中,年龄小于60岁的,男性和女性员工的人数。 select gender,count(*) from emp where age < 60 group by gender; (看不懂,回看分组查询) 4, 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄进行排序,如果年龄相同按入职时间降序。 select name,age from emp where age<= 35 order by age asc(升序),entrydate desc(降序); 5,查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序 select name,gender,age from emp where age between 20 and 40 and gender = '男' order by age asc,entrydate desc limit 0,5; <a name="3.7"></a>**3.7 DQL-执行顺序** [哔哩哔哩][10] -- 查询年龄大于15的员工的姓名、年龄、并根据年龄进行升序排序 正常:select name,age from emp where age > 15 order by age asc; 别名: select e.name ename,e.age eage from emp e where e.age > 15 order by eage asc; 好吧,上面的好像并不重要,它其实想用起别名的方式,去告诉我们sql其实是有语法顺序的,乱搭配是要出错的。 它们分别是先 Select(选择字段)...from(到哪张表)...where0(条件限制)...group by+having(分组查询)...order by(升序或降序)...limit(页数查询)... #幕四:SQL-DCL 管理用户 这一章挺少的,DCL简称数据库控制语言,可以用来管理数据库用户,控制数据库的权限。不用怀疑,这就是教科书的解释。其实数据库里有很多表,学了这章之后,我们就可以让那些表的数据是可以共享出去的,哪些表的数据又是私密不给人看的或者指定给某个用户看,这跟朋友圈发说说的功能有些类似。 **4.1 DCL-管理用户** ![DCL-管理用户user表.png][11] 创建用户 itcast 只能够在当前主机名locahost访问,密码是123456; create user 'itcast'@'localhost' identified by '123456'; 创建用户 heima,可以在其它电脑上访问这个数据库,初始密码是123456 create user 'itcast'@'%' identified by '123456'; 修改用户 heima 的访问密码为 1234; alter user 'heima'@'%' identified with mysql_native_password by '123'; 删除itcast@localhost用户 drop user 'itcast'@'localhost'; **4.2 DCL-给用户添加/删除访问指定数据库的权限** 查询权限(查询某用户名,账户下都持有哪些权限) 语法:show grants for '用户名'@'主机名'; 实操: show grants for 'heima'@'%'; 授予权限(授予某用户名,数据库某权限) 语法:grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; - 授予用户名heima,数据库test的所有权限 实操:grant all on test.* to 'heima'@'%'; 删除权限(撤销某用户名,数据库某权限) 语法:revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; - 删除用户名heima,数据库test的所有权限 实操: revoke all on itcast.* from 'heima'@'%'; #幕五:SQL-函数 [目录] 1.字符串函数 2.数值函数 3.日期函数 4.流程函数 函数,我的理解就是自定义指令,自己写代码,自己去给这串代码自定义一个指令去触发它。 如果所有代码都自己写的话,那肯定很麻烦,官方为了提升我们的使用效率,也内置了一些函数(自定义指令)。 **5.1字符串函数** |:----: | :----: | :----: | :----: | |功能|语法|实例|运行结果| |字符串拼接|select concat(S1,S2,..Sn)|select concat('你好','世界')|你好世界| |字符串转成小写|select lower(str)|select lower('HELLO')|hello| |字符串转成大写|select upper(str)|select upper('hello')|HELLO| |左填充|select lpad(str,n,pad)|lpad('01',5,'-');|---01| |右填充|select rpad(str,n,pad)|rpad('01',5,'-');|01---| |删除首尾空格|select trim(str)|select trim(' Hello MySQL ')|'Hello MySQL'| |从左取字段|select substring('str',number,number)|select substring('Hello MySQL',1,5);|Hello| 字符串函数的应用 -- 原本workno是两位数的,现在统一改成五位数,例如12对应的工号就是00012 update emp set workno = lpad(workno,5,'0'); **5.2数值函数** |:----: | :----: | :----: | :----: | |功能|语法|实例|运行结果| |向上取整,如果是小数会取小数|ceil(x)|select ceil(1.4);|2| |向下取整|floor(x)|select floor(1.9);|1| |返回x/y的模(x÷y的余数)|mod(x,y)|select mod(7,4);|3| |返回0~5内的随机数|rand()|select rand();|0-1之间的随机数| |求参数x的四舍五入的值,保留y位小数|round(x,y)|select round(2.344,2);|2.34| 数值函数对验证码的应用 -- 案例:通过数据库的函数,生成一个六位数的验证码 select round(rand()*1000000,0); 这个有些套娃啊,哈哈。先用rand()*1000000生成一个随机值662332.982772 然后用round套rand,把小数点去掉后,就彻底变成了六位数的整数662332了 方法二:select lpad(round(rand()*1000000,0),6,'0'); 方法一其实有个bug,就是很有可能会生成五位数的验证码,如果是五位数的 代码,我们再套个填充代码ipad,遇到五位数会多加一个0,就变成六位数了。 **5.3 日期函数** |:----: | :----: | :----: | |功能|实例|运行结果| |获取当前日期|select curdata()|2021-10-11| |获取当前时间|select curtime()|23:48:23| |当前年月日时分秒|select now()|2021-10-11 23:48:34| |查看当前时间对应的年份|select year(now());|2021| |查看当前时间对应的月份|select month(now());|10| |查看当前时间对应的日子|select day(now());|11| |将当前时间推迟70天后|select data_add(now(),INTERVAL 70 DAY)|2021-12-20 23:51:11| |求取两日期之间的差值|select datadiff('2021-12-01','2021-10-1')|61| 查询所有员工的入职天数,并根据入职天数倒序排列 select name,datediff(curdate(),entrydate) from emp; **5.4 流程函数** 举高高,我爱这个。 |:----: | :----: | |函数|功能| |IF(value,t,f)|如果value为true,则返回t,否则返回f| |IFNULL(value1,value2)|如果value1不为空,返回value1,否则返回value2| |CASE WHEN[val1] THEN[res1]...ELSE[default]END|如果val1为true,返回res1,..否则返回default默认值| |CASE[expr] WHEN [val1] THEN [res1]...ELSE[default] END|如果expr的值等于val1,返回res1,...否则返回default默认值| 需求:查询emp表中的员工姓名和工作地址(北京/上海 ----> 一线城市,其他 ----> 二线城市) select name,(case workaddress when'北京' then '一线城市' when'上海' then'一线城市' else '二线城市' end) as ‘工作地址’ from emp; 需求:统计各班学员成绩,规则如下 · >=85,展示优秀 · >= 60,展示及格,否则通通不及格。 select id, name, (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end)'数学', (case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end)'数学', (case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end)'数学' from score; #慕六:SQL - 约束 [目录] 1. 约束概述 2. 约束演示 慕慕,终于到六幕了,一点点小开心。 **6.1 约束-概述** 约束就是给字符串的写入添加一系列的规则,例如你在创建密码的时候,肯定对密码强度是有要求的,这个时候就需要通过约束去要求密码是否包含大小写,数字长度,特殊符号,是否含中文符号等等。 |:----: | :----: | :----: | |约束|描述|关键词| |非空约束|限制该字段的数据不能为null|NOT NULL| |唯一约束|保证该字段的所有数据都是唯一的,不重复的|UNIQUE| |主键约束|主键是一行数据的唯一标识,要求并空且唯一|PRIMARY KEY| |默认约束|保存数据时,如果未指定该字段的值,则采用默认值|DEFAULT| |检查约束|保证字段值满足某一条件|CHECK| |外键约束|用来让两张表的数据之间建立连接,保证数据的一致性和完整性|FOREIGN KEY| **6.2 约束演示** |:----: | :----: | :----: | :----: | |字段名|字段类型|约束条件|约束关键字| |id|int|主键,且自动增长|PRIMARY KEY,AUTO_INCREMENT| |name|varchar(10)|不为空,并与表中的数据不可重复|NOT NULL, UNIQUE| |age|int|大于0,并且小于等于120|CHECK| |status|char(1)|如果没有指定该值,默认为1|DEFAULT| |gender|char(1)|无|| **约束演示的应用** -- 建表并设立字符串约束 create table user1( id int primary key auto_increment comment'主键', name varchar(18) not null unique comment'姓名', age int check(age > 0 && age <= 120) comment'年龄', status char(1) default '1' comment'状态', gender char(1) comment'性别' )comment'用户表' -- 插入表格 insert into user1(name,age,status,gender) values ('Tom1',19,'1','男'); insert into user1(name,age,status,gender) values ('Tom2',20,'1','男'); insert into user1(name,age,status,gender) values ('Tom3',21,'1','男'); **6.3 外键约束** **外键就是让两张表建立连接(父表与子表之间),从而保证数据的一致性和完整性**。 添加外键 alter table emp(添加外键的表) add constraint fk_emp_dept_id(外键_添加外键的表_被添加外键的表_被添加外键表字段) foreign key (dept_id)【外键关联字段】 references dept(id);【被关联表的主键id】 删除外键 alter table 表名 drop foreign key 外键名称; alter table emp drop foreign key fk_emp_dept_id; (Typecho)(http://typecho.org/) ew [1]: https://qqclwy.com/usr/uploads/2023/06/1960830251.png [2]: https://qqclwy.com/usr/uploads/2023/06/2645341281.png [3]: https://qqclwy.com/usr/uploads/2023/06/2185252078.png [4]: https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=8&t=520 [5]: https://qqclwy.com/usr/uploads/2023/06/2939739737.png [6]: https://qqclwy.com/usr/uploads/2023/06/3240290332.png [7]: https://qqclwy.com/usr/uploads/2023/06/2733110816.png [8]: https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=18&t=292 [9]: https://qqclwy.com/usr/uploads/2023/06/1965558577.png [10]: https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=22&t=137 [11]: https://qqclwy.com/usr/uploads/2023/06/1224264975.png 最后修改:2023 年 10 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏