2023年6月21日发(作者:)
SQL语⾔基础详解SQL语⾔概述与作⽤**概述:**结构化查询语⾔(Structured Query Language)简称SQL,SQL语句就是对数据库进⾏操作的⼀种语⾔。**作⽤:**通过Sql语⾔可以对数据库管理系统中的数据库,表,表中的数据进⾏增删改查。
sql分类和语法分类:1. DDL(Data Definition Language)数据定义语⾔⽤来操作数据库和表关键字:create,drop,alter等2. DML(Data Manipulation Language)数据操作语⾔⽤来对数据库中表的数据进⾏增删改关键字:insert,delete, update等3. DQL(Data Query Language)数据查询语⾔⽤来对数据库中表的数据进⾏查询关键字:select,from,where等4. DCL(Data Control Language)数据控制语⾔(了解)⽤来定义数据库的访问权限和安全级别,及创建⽤户。关键字:grant, revoke等5. TCL(Transaction Control Language) 事务控制语⾔⽤于控制数据库的事务操作关键字: commit,rollback等
sql语法:SQL语句可以单⾏或多⾏书写,以分号结尾可使⽤空格和缩进来增强语句的可读性QL关键字本⾝不区分⼤⼩写。表,列等的名称具有与数据库相关的区分⼤⼩写可以使⽤ – 或 # 或 /**/ 的⽅式完成注释
DDL(数据定义语⾔)操作数据库1-创建数据库--
创建数据库。默认:utf-8
create database 数据库名;--
判断是否存在并创建数据库。存在:不创建;不存在:创建。默认:utf-8create database if not exists 数据库名;--
创建数据库指定字符集。⼀般不⽤create database 数据库名 character set 字符集(gbk);2-查询数据库--
查询所有数据库show databases;--
查看某个数据库的定义信息show create database 数据库名称;3-删除数据库--
删除数据库drop database 数据库名;4-数据库的其他操作--
查看当前使⽤的数据库select database();--
切换数据库。注意:如果想要操作哪个库(创建表),就得先进⼊到该数据库中use 数据库名;
操作表注意:如果想要操作哪个库(创建表),就得先进⼊到该数据库中:use 数据库名;1-创建表(重要)--
如果表存在就删除该表drop table IF EXISTS 表名;--
创建数据库表,同时定义表列属性。 -- ps:表名会有关键字
解决:换名。
create table 表名( 字段名1 字段类型1(长度), -- ps:只有字符串类型需要⼿动加长度,其它类型都不需要加长度(默认有) 字段名2 字段类型2(长度)
.....)--
创建空表create table 表名;--
⽰例:
创建⼀个学⽣表(id name sex)create table stu( id int, name varchar(10), sex varchar(2), price double, time date
)
--
数据类型java的数据类型 mysql数据库的数据类型 int int float float double double char/string varchar date datetime YYYY-MM-DD HH:MM:SS
date yyyy-MM-dd time HH:MM:SS2-查看表--
查看某个数据库中的所有表show tables;--
查看表结构desc 表名称;--
查询建表语句show create table 表名;--
快速创建表结构。特点:2张表的结构⼀样create table 新表名 like 旧表名;3-修改表结构--
添加表列alter table 表名 add 列名 类型;--
删除表列alter table 表名 drop 列名;--
修改列名alter table 表名 change 旧名称 新名称 类型;--
修改列类型alter table 表名 modify 列名 新类型--
修改表名称rename table 表名 to 新表名;4-删除表--
直接删除表drop table 表名;--
当指定表名存在时删除该表。常⽤在初始化数据库建表前drop table if exists 表名;
DML(数据操作语⾔)1-插⼊记录--
添加部分字段insert into 表名 (字段名1, 字段名2, ...) values(值1, 值2, ...);--
按列定义顺序添加全部字段insert into 表名 values (值1, 值2, 值3);
注意事项:1. 值与字段必须对应,个数相同,类型相同2. 值的数据⼤⼩必须在字段的长度范围内3. 除了数值类型外,其它的字段类型的值必须使⽤引号引起。4. 如果要插⼊空值,可以不写字段,或者⼿动插⼊null2-蠕⾍复制--
将表2中数据复制插⼊到表1中。前提:表结构得⼀致insert into 表名1 select * from 表名2;3-修改记录--
根据条件修改数据。特点:按条件改update 表名 set 字段名1 = 值1, 字段名2 = 值2 where 字段名=值 ;--
不带条件修改数据。特点:表中相应字段全改update 表名 set 字段名1 = 值1, 字段名2 = 值2 ;4-删除记录--
根据条件删除数据。特点:按条件删delete from 表名 where 字段名=值;
--
不带条件删除数据。
特点:全删delete from 表名;
-- truncate删除表记录。truncate table 表名;
truncate和delete的区别:delete是将表中的数据⼀条⼀条删除。truncate是将整个表摧毁,重新创建⼀个新的表,新的表结构和原来表结构⼀模⼀样delete删除的数据能够找回。truncate删除的数据找不回来了
DQL(数据查询语⾔)查询顺序、条件查询、运算查询limit a,b 简单查询--
查询所有列select * from 表名;--
查询指定列select 字段名1,字段名2... from 表名;
--
别名查询select 字段名1 as 别名, 字段名2 as 别名... from 表名 as 表别名;
--
清除重复值select distinct 字段名 from 表名;--
查询结果参与运算。参数运算的字段必须为数值型select 列名1 + 固定值 from 表名;条件查询:select * from 表名 where 条件(各种运算符);
运算查询:> ⼤于
< ⼩于
<= ⼩于等于
>= ⼤于等于
= 等于
<> 、 != 不等于and(&&) 多个条件同时满⾜
or(||) 多个条件其中⼀个满⾜
not(!) 不满⾜
范围查询、模糊查询、排序查询范围查询:between 值1 and 值2in(值1, 值2, 值3, ...)模糊查询 likelike % : 模糊多位 通配符 _ : 模糊⼀位 通配符is nullis not null排序查询 order by 字段order by 字段名 [desc | asc] , 字段名 [desc | asc] ; -- asc(默认):
升序,desc:
降序
聚合函数查询count() : 计数sum(字段) : 求和max(字段) : 求最⼤值min(字段) : 求最⼩值avg(字段) : 求平均值ifnull(字段, 备⽤值) : 第⼀个参数若不为NULL,则返回该值;若为NULL,则返回备⽤值,
count(1)、count(*)与count(列名)的区别执⾏效果:1. count(*) 包括了所有的列,相当于⾏数,在统计结果的时候,不会忽略列值为NULL2. count(1) 包括了忽略所有列,⽤1代表代码⾏,在统计结果的时候,不会忽略列值为NULL3. count(列名) 只包括列名那⼀列,在统计结果的时候,会忽略列值为空(这⾥的空不是只空字符串或者0,⽽是表⽰null)的计数,即某个字段值为NULL时,不统计。执⾏效率:1. 如果有主键,则 count(主键) 的执⾏效率是最优的2. 列名为主键,count(列名) 会⽐ count(1) 快3. 列名不为主键,count(1) 会⽐ count(列名) 快4. 如果表多个列并且有主键或索引,则 count(*) 系统会⾃动优化⾛主键或者索引5. 如果表多个列并且没有主键,则 count(1) 的执⾏效率优于 count(* )
分组查询、分页查询分组查询group by 分组字段 [having 条件]--
⽰例:查询年龄⼤于25岁的⼈,按性别分组,统计每组的⼈数,并只显⽰总⼈数⼤于2的数据select sex, COUNT(*) from student where age>25 group by sex having COUNT(*)>2;having与where的区别having是在分组后对数据进⾏过滤;where是在分组前对数据进⾏过滤having后⾯可以使⽤聚合函数;where后⾯不可以使⽤聚合函数
分页查询limit 跳过条数,查询条数;
DCL(数据控制语⾔)--
创建⽤户--
命令格式:CREATE USER '⽤户名'@'主机地址' IDENTIFIED BY '密码'; -- 默认没有任何权限 什么都做不了-- ⽰例:CREATE USER 'tom'@'localhost' IDENTIFIED BY '123';-- 给⽤户分配权限-- 命令格式:GRANT 权限1, 权限2... ON 数据库名.表名 TO '⽤户名'@'主机名';-- ⽰例:GRANT ALL ON db3.* TO 'tom'@'localhost';-- 查看权限-- 命令格式:SHOW GRANTS FOR '⽤户名'@'主机名';-- ⽰例:SHOW GRANTS FOR 'tom'@'localhost'-- 撤销权限-- 命令格式:REVOKE 权限1, 权限2... ON 数据库.表名 FROM '⽤户名'@'主机名';-- ⽰例:REVOKE ALL ON db3.* FROM 'tom'@'localhost';-- 删除⽤户-- 命令格式:DROP USER '⽤户名'@'主机名';-- ⽰例:DROP USER 'tom'@'localhost';-- 给root⽤户修改密码-- 特点:不需要登录 直接操作命令即可-- 格式:mysqladmin -uroot -p password 新密码-- 给普通⽤户修改密码-- 特点:需要root⽤户先登录 再使⽤命令去修改普通⽤户的密码-- 格式:set password for '⽤户名'@'主机名' = password('新密码');-- ⽰例:set password for 'aaa'@'localhost' = password('root');
数据库约束约束:对表中的数据可以进⾏进⼀步的限制,来保证数据的唯⼀性,正确性和完整性约束种类:PRIMARY KEY :主键约束。代表该字段的数据不能为空且不可重复NOT NULL :⾮空。代表该字段的数据不能为空UNIQUE :唯⼀。代表该字段的数据不能重复
主键约束:primary key⼀个表中都得需要主键约束,⽤来标注⼀条记录的唯⼀性特征:主键字段值唯⼀不可重复主键字段值不能包含NULL值⼀个表中只能有⼀个主键,但主键可以是多个字段 (联合主键)MySQL实现⽅式添加主键⽅式⼀:在创建表时,添加约束格式:create table 表名 (
字段名称1 字段类型 primary key,
字段名称2 字段类型 约束
);⽅式⼆:在创建表时,结尾内添加约束格式1:单⼀主键create table 表名 ( 字段名称1 字段类型,
字段名称2 字段类型,
primary key(字段名称1)
);格式2:联合主键create table 表名 ( 字段名称1 字段类型,
字段名称2 字段类型,
primary key(字段名称1,字段名称2)
);删除主键alter table 表名 drop PRIMARY KEY;主键⾃增auto_increment --
默认地AUTO_INCREMENT
的开始值是1--
修改起始值ALTER TABLE 表名 AUTO_INCREMENT=起始值;
唯⼀约束:unique**特征:**被修饰的字段唯⼀,不可重复注意:⼀个表中可以有多个被unique修饰的字段,但对null不起作⽤实现⽅式--
创建表时在字段后添加
create table 表名 (
字段名称1 字段类型 unique,
字段名称2 字段类型 约束
);
⾮空约束:not null**特征:**被修饰的字段不可为空**实现⽅式:**直接在字段后⾯添加即可create table 表名 (
字段名称1 字段类型 not null default '默认值', -- default:默认值 字段名称2 字段类型 unique not null default '默认值', --
⼀个字段上可以同时出现唯⼀约束和⾮空约束的 字段名称3 字段类型 约束
);
多表多表的设计与实现有三种:⼀对⼀实现:1、让双⽅的主键作为外键⼀⼀对应2 、在任意⼀⽅创建⼀个字段当成是外键指向另⼀⽅的主键,但是这个外键必须唯⼀⼀对多称⼀的⼀⽅为主表,称多的⼀⽅为从表建⽴原则:只要是⼀对多,就在从表中(多的⼀⽅)创建⼀个字段为外键,然后让这个外键指向主表的(⼀的⼀⽅)主键多对多建⽴原则:需要在外部创建⼀张中间表。这个中间表⾄少需要2个字段,然后让这2个字段分别作为外键只向各⾃表的主键
多表约束(外键约束)外键约束的作⽤:能够保证数据的完整性和有效性特征:从表中如果关联了主表的数据则强制主表的数据不能删除,保证数据的完整性和有效性
外键的性能问题:数据库需要维护外键的内部管理;外键等于把数据的⼀致性事务实现,全部交给数据库服务器完成;有了外键,当做⼀些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,⽽不得不消耗资源;外键还会因为需要请求对其他表内部加锁⽽容易出现死锁情况;
外键的使⽤策略:在⼤型系统中(性能要求不⾼,安全要求⾼),使⽤外键;在⼤型系统中(性能要求⾼,安全⾃⼰控制),不⽤外键;⼩系统随便,⼀般不⽤外键。⽤外键要适当,不能过分追求不⽤外键⽽⽤程序控制数据⼀致性和完整性时,应该写⼀层来保证,然后每个应⽤通过这个层来访问数据库。
添加外键约束⽅式1:在已有表上添加外键约束给从表的外键字段添加外键约束alter table 从表 add constraint [外键别名] foreign key(外键字段) references 主表名称(主键字段)⽅式2:可视化图形⽅式在架构设计器中,直接指定外键拖向主键即可,简单⽅便快捷删除外键⽅式⼀:ALTER TABLE 从表 drop foreign key 外键名称;
⽅式⼆:在架构设计器中,选中指向关系右键删除即可
多表查询多表查询:从多张表中获取到有关系的数据。⽐如:查询分类信息以及分类下的所有商品多表查询的语法分类:内连接查询:只查询多张表之间有关系的数据外连接查询⼦查询交叉查询:查询的是2张表的乘积(笛卡尔积),有关系的数据和没关系的数据都查出来了
内连接查询特点:可以使⽤内连接去查询2张表之间有关系的数据隐式内连接:--
语法格式:select * from 表1 表1别名,表2 where 关联条件 and 筛选条件; -- ps:可以使⽤表别名简化书写显⽰内连接--
语法格式:select * from 表1 [inner] join 表2 on 关联条件 where 筛选条件 and 筛选条件;
-- on:
后跟的是关联条件 -- where:
后跟的是对结果的筛选条件
外连接查询左外连接:以 join 左边的表为主,查询出来的是2张表之间有关系的数据以及左边表所有的数据。如果右表中没有满⾜条件的对应数据,则填充 null--
语法格式:select * from 表1 left [outer] join 表2 on 关联条件 where 筛选条件;右外连接:以 join 右边的表为主,查询出来的是2张表之间有关系的数据以及右边表所有的数据如果左表中没有满⾜条件的对应数据,则填充null--
语法格式:select * from 表1 rigth [outer] join 表2 on 关联条件 where 筛选条件;
⼦查询语法格式:--
⼦查询作为where条件。适⽤于单列单值或者单列多值select * from 表名 where (⼦查询结果);--
⼦查询作为临时表。适⽤于多列多值select * from ⼦查询结果 where 条件;--
⼦查询作为结果集字段select *,(⼦查询结果) from 表名 where 条件;⽰例:⼦查询作为where条件 ⽰例:查询⼯资最⾼的员⼯是谁(结果是单列单值)--
先查询最⾼的⼯资select MAX(salary) from emp;--
再查询最⾼⼯资的员⼯select name from emp where salary=(select MAX(salary) from emp);⼦查询作为where条件 ⽰例:查询⼯资⼤于5000的员⼯部门ID,来⾃于哪些部门(结果是单列多值)--
先查询⼯资⼤于5000的员⼯部门IDselect dept_id from emp where salary>5000;--
根据部门id获取部门名称select name from dept where id in (select dept_id from emp where salary>5000);⼦查询作为临时表 ⽰例:查询出2011-01-01以后⼊职的员⼯信息,包括部门名称(结果是多列多值)select l.*, from dept d,(select * from emp where join_date>'2011-01-01') lwhere =_id;
交叉连接select * from 表1,表2;会产⽣2张表的乘积数据,简称笛卡尔积数据,有关系的数据和没关系的数据都查出来了
数据备份与还原mysqldump:MySQL数据库备份mysqldump命令是MySQL数据库中备份⼯具,⽤于将MySQL服务器中的数据库以标准的sql语⾔的⽅式导出,并保存到⽂件中。语法格式:mysqldump [选项] 数据库名 [表名] > 脚本名mysqldump [选项] --数据库名 [选项 表名] > 脚本名mysqldump [选项] --all-databases [选项] > 脚本名#
常⽤参数: -h, --host 服务器IP地址 -P. --port 服务器端⼝号 -u, --user MySQL ⽤户名 -p, --pasword MySQL 密码 --databases 指定要备份的数据库 --all-databases 备份mysql服务器上的所有数据库 --compact 压缩模式,产⽣更少的输出 --comments 添加注释信息 --complete-insert 输出完成的插⼊语句 --lock-tables 备份前,锁定所有数据库表 --no-create-db/--no-create-info 禁⽌⽣成创建数据库语句 --force 当出现错误时仍然继续备份操作 --default-character-set 指定默认字符集 --add-locks 备份数据库表时锁定数据库表 --ignore-table 备份数据时库排除某表参考实例:#
导出整个数据库:mysqldump -u linuxcool -p smgp_apps_linuxcool > #
导出指定的数据库:mysqldump -u linuxcool -p smgp_apps_linuxcool users > linuxcool_#
备份指定数据库指定表(多个表以空格间隔)mysqldump -uroot -p mysql db event > /backup/mysqldump/#
导出⼀个数据库结构:mysqldump -u linuxcool -p -d --add-drop-table smgp_apps_linuxcool > linuxcool_#
备份指定数据库排除某些表mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/备份还原命令:mysqladmin -uroot -p create db_name
mysql -u root -p password db_name < /backup/mysqldump/db_#
注:在导⼊备份数据库前,db_name如果没有,是需要创建的;
⽽且与db_中数据库名是⼀样的才可以导⼊。k8s部署 定时备份mysql数据库及还原命令:#
创建定时任务crontab -e#
定时任务(每天0点执⾏):0 0 * * * /usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysqldump -u user -p password db_name > /root/mysql-bak/`date + %d`.sql 2>&1#
注:2>&1
的意思就是将标准错误重定向到标准输出。这⾥标准输出已经重定向到了~.sql。那么标准错误也会输出到~.sql⽂件⾥#
还原命令:/usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysql -u user -p password db_name < /root/mysql-bak/`date + %d`.sql
2023年6月21日发(作者:)
SQL语⾔基础详解SQL语⾔概述与作⽤**概述:**结构化查询语⾔(Structured Query Language)简称SQL,SQL语句就是对数据库进⾏操作的⼀种语⾔。**作⽤:**通过Sql语⾔可以对数据库管理系统中的数据库,表,表中的数据进⾏增删改查。
sql分类和语法分类:1. DDL(Data Definition Language)数据定义语⾔⽤来操作数据库和表关键字:create,drop,alter等2. DML(Data Manipulation Language)数据操作语⾔⽤来对数据库中表的数据进⾏增删改关键字:insert,delete, update等3. DQL(Data Query Language)数据查询语⾔⽤来对数据库中表的数据进⾏查询关键字:select,from,where等4. DCL(Data Control Language)数据控制语⾔(了解)⽤来定义数据库的访问权限和安全级别,及创建⽤户。关键字:grant, revoke等5. TCL(Transaction Control Language) 事务控制语⾔⽤于控制数据库的事务操作关键字: commit,rollback等
sql语法:SQL语句可以单⾏或多⾏书写,以分号结尾可使⽤空格和缩进来增强语句的可读性QL关键字本⾝不区分⼤⼩写。表,列等的名称具有与数据库相关的区分⼤⼩写可以使⽤ – 或 # 或 /**/ 的⽅式完成注释
DDL(数据定义语⾔)操作数据库1-创建数据库--
创建数据库。默认:utf-8
create database 数据库名;--
判断是否存在并创建数据库。存在:不创建;不存在:创建。默认:utf-8create database if not exists 数据库名;--
创建数据库指定字符集。⼀般不⽤create database 数据库名 character set 字符集(gbk);2-查询数据库--
查询所有数据库show databases;--
查看某个数据库的定义信息show create database 数据库名称;3-删除数据库--
删除数据库drop database 数据库名;4-数据库的其他操作--
查看当前使⽤的数据库select database();--
切换数据库。注意:如果想要操作哪个库(创建表),就得先进⼊到该数据库中use 数据库名;
操作表注意:如果想要操作哪个库(创建表),就得先进⼊到该数据库中:use 数据库名;1-创建表(重要)--
如果表存在就删除该表drop table IF EXISTS 表名;--
创建数据库表,同时定义表列属性。 -- ps:表名会有关键字
解决:换名。
create table 表名( 字段名1 字段类型1(长度), -- ps:只有字符串类型需要⼿动加长度,其它类型都不需要加长度(默认有) 字段名2 字段类型2(长度)
.....)--
创建空表create table 表名;--
⽰例:
创建⼀个学⽣表(id name sex)create table stu( id int, name varchar(10), sex varchar(2), price double, time date
)
--
数据类型java的数据类型 mysql数据库的数据类型 int int float float double double char/string varchar date datetime YYYY-MM-DD HH:MM:SS
date yyyy-MM-dd time HH:MM:SS2-查看表--
查看某个数据库中的所有表show tables;--
查看表结构desc 表名称;--
查询建表语句show create table 表名;--
快速创建表结构。特点:2张表的结构⼀样create table 新表名 like 旧表名;3-修改表结构--
添加表列alter table 表名 add 列名 类型;--
删除表列alter table 表名 drop 列名;--
修改列名alter table 表名 change 旧名称 新名称 类型;--
修改列类型alter table 表名 modify 列名 新类型--
修改表名称rename table 表名 to 新表名;4-删除表--
直接删除表drop table 表名;--
当指定表名存在时删除该表。常⽤在初始化数据库建表前drop table if exists 表名;
DML(数据操作语⾔)1-插⼊记录--
添加部分字段insert into 表名 (字段名1, 字段名2, ...) values(值1, 值2, ...);--
按列定义顺序添加全部字段insert into 表名 values (值1, 值2, 值3);
注意事项:1. 值与字段必须对应,个数相同,类型相同2. 值的数据⼤⼩必须在字段的长度范围内3. 除了数值类型外,其它的字段类型的值必须使⽤引号引起。4. 如果要插⼊空值,可以不写字段,或者⼿动插⼊null2-蠕⾍复制--
将表2中数据复制插⼊到表1中。前提:表结构得⼀致insert into 表名1 select * from 表名2;3-修改记录--
根据条件修改数据。特点:按条件改update 表名 set 字段名1 = 值1, 字段名2 = 值2 where 字段名=值 ;--
不带条件修改数据。特点:表中相应字段全改update 表名 set 字段名1 = 值1, 字段名2 = 值2 ;4-删除记录--
根据条件删除数据。特点:按条件删delete from 表名 where 字段名=值;
--
不带条件删除数据。
特点:全删delete from 表名;
-- truncate删除表记录。truncate table 表名;
truncate和delete的区别:delete是将表中的数据⼀条⼀条删除。truncate是将整个表摧毁,重新创建⼀个新的表,新的表结构和原来表结构⼀模⼀样delete删除的数据能够找回。truncate删除的数据找不回来了
DQL(数据查询语⾔)查询顺序、条件查询、运算查询limit a,b 简单查询--
查询所有列select * from 表名;--
查询指定列select 字段名1,字段名2... from 表名;
--
别名查询select 字段名1 as 别名, 字段名2 as 别名... from 表名 as 表别名;
--
清除重复值select distinct 字段名 from 表名;--
查询结果参与运算。参数运算的字段必须为数值型select 列名1 + 固定值 from 表名;条件查询:select * from 表名 where 条件(各种运算符);
运算查询:> ⼤于
< ⼩于
<= ⼩于等于
>= ⼤于等于
= 等于
<> 、 != 不等于and(&&) 多个条件同时满⾜
or(||) 多个条件其中⼀个满⾜
not(!) 不满⾜
范围查询、模糊查询、排序查询范围查询:between 值1 and 值2in(值1, 值2, 值3, ...)模糊查询 likelike % : 模糊多位 通配符 _ : 模糊⼀位 通配符is nullis not null排序查询 order by 字段order by 字段名 [desc | asc] , 字段名 [desc | asc] ; -- asc(默认):
升序,desc:
降序
聚合函数查询count() : 计数sum(字段) : 求和max(字段) : 求最⼤值min(字段) : 求最⼩值avg(字段) : 求平均值ifnull(字段, 备⽤值) : 第⼀个参数若不为NULL,则返回该值;若为NULL,则返回备⽤值,
count(1)、count(*)与count(列名)的区别执⾏效果:1. count(*) 包括了所有的列,相当于⾏数,在统计结果的时候,不会忽略列值为NULL2. count(1) 包括了忽略所有列,⽤1代表代码⾏,在统计结果的时候,不会忽略列值为NULL3. count(列名) 只包括列名那⼀列,在统计结果的时候,会忽略列值为空(这⾥的空不是只空字符串或者0,⽽是表⽰null)的计数,即某个字段值为NULL时,不统计。执⾏效率:1. 如果有主键,则 count(主键) 的执⾏效率是最优的2. 列名为主键,count(列名) 会⽐ count(1) 快3. 列名不为主键,count(1) 会⽐ count(列名) 快4. 如果表多个列并且有主键或索引,则 count(*) 系统会⾃动优化⾛主键或者索引5. 如果表多个列并且没有主键,则 count(1) 的执⾏效率优于 count(* )
分组查询、分页查询分组查询group by 分组字段 [having 条件]--
⽰例:查询年龄⼤于25岁的⼈,按性别分组,统计每组的⼈数,并只显⽰总⼈数⼤于2的数据select sex, COUNT(*) from student where age>25 group by sex having COUNT(*)>2;having与where的区别having是在分组后对数据进⾏过滤;where是在分组前对数据进⾏过滤having后⾯可以使⽤聚合函数;where后⾯不可以使⽤聚合函数
分页查询limit 跳过条数,查询条数;
DCL(数据控制语⾔)--
创建⽤户--
命令格式:CREATE USER '⽤户名'@'主机地址' IDENTIFIED BY '密码'; -- 默认没有任何权限 什么都做不了-- ⽰例:CREATE USER 'tom'@'localhost' IDENTIFIED BY '123';-- 给⽤户分配权限-- 命令格式:GRANT 权限1, 权限2... ON 数据库名.表名 TO '⽤户名'@'主机名';-- ⽰例:GRANT ALL ON db3.* TO 'tom'@'localhost';-- 查看权限-- 命令格式:SHOW GRANTS FOR '⽤户名'@'主机名';-- ⽰例:SHOW GRANTS FOR 'tom'@'localhost'-- 撤销权限-- 命令格式:REVOKE 权限1, 权限2... ON 数据库.表名 FROM '⽤户名'@'主机名';-- ⽰例:REVOKE ALL ON db3.* FROM 'tom'@'localhost';-- 删除⽤户-- 命令格式:DROP USER '⽤户名'@'主机名';-- ⽰例:DROP USER 'tom'@'localhost';-- 给root⽤户修改密码-- 特点:不需要登录 直接操作命令即可-- 格式:mysqladmin -uroot -p password 新密码-- 给普通⽤户修改密码-- 特点:需要root⽤户先登录 再使⽤命令去修改普通⽤户的密码-- 格式:set password for '⽤户名'@'主机名' = password('新密码');-- ⽰例:set password for 'aaa'@'localhost' = password('root');
数据库约束约束:对表中的数据可以进⾏进⼀步的限制,来保证数据的唯⼀性,正确性和完整性约束种类:PRIMARY KEY :主键约束。代表该字段的数据不能为空且不可重复NOT NULL :⾮空。代表该字段的数据不能为空UNIQUE :唯⼀。代表该字段的数据不能重复
主键约束:primary key⼀个表中都得需要主键约束,⽤来标注⼀条记录的唯⼀性特征:主键字段值唯⼀不可重复主键字段值不能包含NULL值⼀个表中只能有⼀个主键,但主键可以是多个字段 (联合主键)MySQL实现⽅式添加主键⽅式⼀:在创建表时,添加约束格式:create table 表名 (
字段名称1 字段类型 primary key,
字段名称2 字段类型 约束
);⽅式⼆:在创建表时,结尾内添加约束格式1:单⼀主键create table 表名 ( 字段名称1 字段类型,
字段名称2 字段类型,
primary key(字段名称1)
);格式2:联合主键create table 表名 ( 字段名称1 字段类型,
字段名称2 字段类型,
primary key(字段名称1,字段名称2)
);删除主键alter table 表名 drop PRIMARY KEY;主键⾃增auto_increment --
默认地AUTO_INCREMENT
的开始值是1--
修改起始值ALTER TABLE 表名 AUTO_INCREMENT=起始值;
唯⼀约束:unique**特征:**被修饰的字段唯⼀,不可重复注意:⼀个表中可以有多个被unique修饰的字段,但对null不起作⽤实现⽅式--
创建表时在字段后添加
create table 表名 (
字段名称1 字段类型 unique,
字段名称2 字段类型 约束
);
⾮空约束:not null**特征:**被修饰的字段不可为空**实现⽅式:**直接在字段后⾯添加即可create table 表名 (
字段名称1 字段类型 not null default '默认值', -- default:默认值 字段名称2 字段类型 unique not null default '默认值', --
⼀个字段上可以同时出现唯⼀约束和⾮空约束的 字段名称3 字段类型 约束
);
多表多表的设计与实现有三种:⼀对⼀实现:1、让双⽅的主键作为外键⼀⼀对应2 、在任意⼀⽅创建⼀个字段当成是外键指向另⼀⽅的主键,但是这个外键必须唯⼀⼀对多称⼀的⼀⽅为主表,称多的⼀⽅为从表建⽴原则:只要是⼀对多,就在从表中(多的⼀⽅)创建⼀个字段为外键,然后让这个外键指向主表的(⼀的⼀⽅)主键多对多建⽴原则:需要在外部创建⼀张中间表。这个中间表⾄少需要2个字段,然后让这2个字段分别作为外键只向各⾃表的主键
多表约束(外键约束)外键约束的作⽤:能够保证数据的完整性和有效性特征:从表中如果关联了主表的数据则强制主表的数据不能删除,保证数据的完整性和有效性
外键的性能问题:数据库需要维护外键的内部管理;外键等于把数据的⼀致性事务实现,全部交给数据库服务器完成;有了外键,当做⼀些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,⽽不得不消耗资源;外键还会因为需要请求对其他表内部加锁⽽容易出现死锁情况;
外键的使⽤策略:在⼤型系统中(性能要求不⾼,安全要求⾼),使⽤外键;在⼤型系统中(性能要求⾼,安全⾃⼰控制),不⽤外键;⼩系统随便,⼀般不⽤外键。⽤外键要适当,不能过分追求不⽤外键⽽⽤程序控制数据⼀致性和完整性时,应该写⼀层来保证,然后每个应⽤通过这个层来访问数据库。
添加外键约束⽅式1:在已有表上添加外键约束给从表的外键字段添加外键约束alter table 从表 add constraint [外键别名] foreign key(外键字段) references 主表名称(主键字段)⽅式2:可视化图形⽅式在架构设计器中,直接指定外键拖向主键即可,简单⽅便快捷删除外键⽅式⼀:ALTER TABLE 从表 drop foreign key 外键名称;
⽅式⼆:在架构设计器中,选中指向关系右键删除即可
多表查询多表查询:从多张表中获取到有关系的数据。⽐如:查询分类信息以及分类下的所有商品多表查询的语法分类:内连接查询:只查询多张表之间有关系的数据外连接查询⼦查询交叉查询:查询的是2张表的乘积(笛卡尔积),有关系的数据和没关系的数据都查出来了
内连接查询特点:可以使⽤内连接去查询2张表之间有关系的数据隐式内连接:--
语法格式:select * from 表1 表1别名,表2 where 关联条件 and 筛选条件; -- ps:可以使⽤表别名简化书写显⽰内连接--
语法格式:select * from 表1 [inner] join 表2 on 关联条件 where 筛选条件 and 筛选条件;
-- on:
后跟的是关联条件 -- where:
后跟的是对结果的筛选条件
外连接查询左外连接:以 join 左边的表为主,查询出来的是2张表之间有关系的数据以及左边表所有的数据。如果右表中没有满⾜条件的对应数据,则填充 null--
语法格式:select * from 表1 left [outer] join 表2 on 关联条件 where 筛选条件;右外连接:以 join 右边的表为主,查询出来的是2张表之间有关系的数据以及右边表所有的数据如果左表中没有满⾜条件的对应数据,则填充null--
语法格式:select * from 表1 rigth [outer] join 表2 on 关联条件 where 筛选条件;
⼦查询语法格式:--
⼦查询作为where条件。适⽤于单列单值或者单列多值select * from 表名 where (⼦查询结果);--
⼦查询作为临时表。适⽤于多列多值select * from ⼦查询结果 where 条件;--
⼦查询作为结果集字段select *,(⼦查询结果) from 表名 where 条件;⽰例:⼦查询作为where条件 ⽰例:查询⼯资最⾼的员⼯是谁(结果是单列单值)--
先查询最⾼的⼯资select MAX(salary) from emp;--
再查询最⾼⼯资的员⼯select name from emp where salary=(select MAX(salary) from emp);⼦查询作为where条件 ⽰例:查询⼯资⼤于5000的员⼯部门ID,来⾃于哪些部门(结果是单列多值)--
先查询⼯资⼤于5000的员⼯部门IDselect dept_id from emp where salary>5000;--
根据部门id获取部门名称select name from dept where id in (select dept_id from emp where salary>5000);⼦查询作为临时表 ⽰例:查询出2011-01-01以后⼊职的员⼯信息,包括部门名称(结果是多列多值)select l.*, from dept d,(select * from emp where join_date>'2011-01-01') lwhere =_id;
交叉连接select * from 表1,表2;会产⽣2张表的乘积数据,简称笛卡尔积数据,有关系的数据和没关系的数据都查出来了
数据备份与还原mysqldump:MySQL数据库备份mysqldump命令是MySQL数据库中备份⼯具,⽤于将MySQL服务器中的数据库以标准的sql语⾔的⽅式导出,并保存到⽂件中。语法格式:mysqldump [选项] 数据库名 [表名] > 脚本名mysqldump [选项] --数据库名 [选项 表名] > 脚本名mysqldump [选项] --all-databases [选项] > 脚本名#
常⽤参数: -h, --host 服务器IP地址 -P. --port 服务器端⼝号 -u, --user MySQL ⽤户名 -p, --pasword MySQL 密码 --databases 指定要备份的数据库 --all-databases 备份mysql服务器上的所有数据库 --compact 压缩模式,产⽣更少的输出 --comments 添加注释信息 --complete-insert 输出完成的插⼊语句 --lock-tables 备份前,锁定所有数据库表 --no-create-db/--no-create-info 禁⽌⽣成创建数据库语句 --force 当出现错误时仍然继续备份操作 --default-character-set 指定默认字符集 --add-locks 备份数据库表时锁定数据库表 --ignore-table 备份数据时库排除某表参考实例:#
导出整个数据库:mysqldump -u linuxcool -p smgp_apps_linuxcool > #
导出指定的数据库:mysqldump -u linuxcool -p smgp_apps_linuxcool users > linuxcool_#
备份指定数据库指定表(多个表以空格间隔)mysqldump -uroot -p mysql db event > /backup/mysqldump/#
导出⼀个数据库结构:mysqldump -u linuxcool -p -d --add-drop-table smgp_apps_linuxcool > linuxcool_#
备份指定数据库排除某些表mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/备份还原命令:mysqladmin -uroot -p create db_name
mysql -u root -p password db_name < /backup/mysqldump/db_#
注:在导⼊备份数据库前,db_name如果没有,是需要创建的;
⽽且与db_中数据库名是⼀样的才可以导⼊。k8s部署 定时备份mysql数据库及还原命令:#
创建定时任务crontab -e#
定时任务(每天0点执⾏):0 0 * * * /usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysqldump -u user -p password db_name > /root/mysql-bak/`date + %d`.sql 2>&1#
注:2>&1
的意思就是将标准错误重定向到标准输出。这⾥标准输出已经重定向到了~.sql。那么标准错误也会输出到~.sql⽂件⾥#
还原命令:/usr/local/bin/kubectl exec `/usr/local/bin/kubectl get po | grep mysql | awk '{print $1}'` -- mysql -u user -p password db_name < /root/mysql-bak/`date + %d`.sql
发布评论