重拾MySQL

关系型数据库系统(RDBMS):是指使用了关系模型的数据库系统(MySQL、Oracle、DB2、SQL Server)
NoSQL数据库:指的是数据分类存放,但是数据之间没有
关联关系的数据库系统(Redis、MongoDB、Neo4J、MemCache)

MySQL登录
  在Linux中
  方式1:mysql -u用户名 -p 回车 在输入密码
  方式2:mysql --host=ip地址 --user=用户名 --password 回车 在输入密码 (可登录别人主机)
DDL:数据定义语言。用来操作数据库、表、列等
  查询所有数据库:SHOW DATABASES;
  查询数据库的创建语句:SHOW CREATE DATABASE 数据库名称;
  创建数据库:CREATE DATABASE 数据库名称;
    CREATE DATABASE IF NOT EXISTS 数据库名;(加了是否存在校验)
    CREATE DATABASE 数据库名 CHARACTER SET 字符集名称;
  修改数据库(修改字符集):ALTER DATABASE 数据库名 CHARACTER SET 字符集名称;
  删除数据库:DROP DATABASE 数据库名;
    DROP DATABASE IF NOT EXISTS 数据库名;(添加删除校验)
  使用数据库:USE 数据库名称;
  查看当前使用的数据库:SELECT DATABASE();
  查询所有数据表:SHOW TABLES;
  查询表结构:DESC 表名;
  查询表字符集:SHOW TABLE STATUS FROM 库名 LIKE '表名';
  创建数据表:CREATE TABLE 表(列名 数据类型 约束类型,...列明 数据类型 约束类型);
     添加主键自增约束:CREATE TABLE 表(列名 数据类型 PRIMARY KEY AUTO_INCREMENT,...)
  数据类型:int double data datatime varchar
  修改表名:ALTER TABLE 表名 RENAME TO 新表名;
  修改表的字符集:ALTER TABLE 表名 CHARACTER SET 字符集名称;
  单独加一列:ALTER TABLE 表名 ADD 列名 数据类型;
  修改某列的数据类型:ALTER TABLE 表名 MODIFY 列名 新数据类型;
  建表后单独添加主键约束:ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY
    删除主键
自增约束:ALTER TABLE 表名 MODIFY 列名 数据类型
  建表后单独添加主键自增约束:ALTER TABLE 表名 MODIFY 列名 数据类型 PRIMARY KEY AUTO_INCREMENT

  修改列名和数据类型:ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
  删除某一列:ALTER TABLE 表名 DROP 列名;
  删除主键约束:ALTER TABLE 表名 DROP PRIMARY KEY
  删除数据表:DROP TABLE 表名;
    DROP TABLE IF EXISTS 表名;
DML:数据操作语言。用来对数据库中表的数据进行增删改
  给指定列添加一条数据:INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2...);
  给全部列添加数据:INSERT INTO 表名 VALUES(值1,值2...);
  批量添加:INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2...),(值1,值2...),...;
    INSERT INTO 表名 VALUES(值1,值2...),(值1,值2...),...;
  修改表中数据:UPDATE 表名 SET 列名1=值1,列名2=值2,... WHERE 条件;
  删除表中数据:DELETE FROM 表名 WHERE 条件;
DCL:数据查询语言。用来查询数据库中表的记录(数据)
DQL:数据控制语言。用来定义数据库的访问权限和安全级别,及创建用户
MySQL数据库(使用Navicat工具)
SQL语句的注释:
    -- 注释信息(Navicat工具中)
    # 这是一段注释文字
    /* 这是另一段注释文字 */
数据类型:数字
类型        大小       说明
TINYINT    1字节     小整数
SMALLINT   2字节     普通整数
MEDIUMINT  3字节     普通整数
INT        4字节     较大整数
BIGINT     8字节     大整数
FLOAT      4字节     单精度浮点数
DOUBLE     8字节     双精度浮点数
DECIMAL   -------   DECIMAL(10,2)

不精确的浮点数
十进制的浮点数无法在计算机中用二进制精确表达

数据类型:字符串
类型            大小                说明
CHAR        1-255字符         固定长度字符串
VARCHAR     1-65535字符       不固定长度字符串
TEXT        1-65535字符       不确定长度字符串
MEDIUMTEXT  1-1千6百万字符     不确定长度字符串
LONGTEXT    1-42亿字符        不确定长度字符串

数据类型:日期类型
类型           大小      说明
DATE          3字节     日期
TIME          3字节     时间
YEAR          1字节     年份
DATETIME      8字节     日期时间
TIMESTAMP     4字节     时间戳

数据库的范式
第一范式:原子性
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
第二范式:唯一性
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列
第三范式:关联性
每列都与主键有直接关系,不存在传递依赖;依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联      

字段约束
MySQL中的字段约束共有四种:
约束名称 关键字                描述
主键约束 PRIMARY KEY   字段值唯一,且不能为NULL  表时添加主键自增约束:PRIMARY KEY AUTO_INCREMENT
非空约束 NOT NULL 字段值不能为NULL 唯一约束 UNIQUE 字段值唯一,且可以为NULL 外键约束 FOREIGN KEY 保持关联数据的逻辑性
建表时添加外键约束
  CREATE TABLE 表名(列名 数据类型 约束,... CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名));
  外键名是自己定义 删除外键约束:ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
建表后添加外键约束:ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(本表外键列名) REFERENCES 主表名(主表主键列名); 数据分页:使用LIMIT关键字 SELECT …… FROM …… LIMIT 起始位置 , 偏移量 ; 结果集排序:ORDER BY SELECT …… FROM …… ORDER BY 列名 [ ASC
| DESC ] ; 去除重复记录:使用DISTINCT关键字 SELECT DISTINCT 字段 FROM …… ; 备注:使用DISTINCT的SELECT子句中只能查询一列数据,如果查询多列,去除重复记录就会失效 条件查询:四类运算符(数学运算符、比较运算符、逻辑运算符、按位运算符) 数学运算符:+ 加法、- 减法、* 乘法、/ 除法、% 求模 比较运算符:>、>=、<、<=、=、!=、IN(包含:deptno IN(10,30,40)) 逻辑运算符:AND、OR、NOT(非关系)、XOR(异或关系:age > 18 XOR sex = "") 按位运算符:& 位与关系、| 位或关系、~ 位取反、^ 位异或、<< 左移、>> 右移 条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧 聚合函数 1、SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
  SUM函数求和会排除NULL值
select sum(comm) from emp; 2、MAX函数用于获得非空值的最大值 select max(empno) from emp; 3、MIN函数用于获得非空值的最小值 select min(empno) from emp; 4、AVG函数用于获得非空值的平均值,非数字数据统计结果为0 select avg(sal+IFNULL(comm,0)) from emp; 5、COUNT(*)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数。 select count(*) from emp; select count(comm) from emp; 分组查询:Group By GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理 select deptno,avg(sal) from emp group by deptno; 逐级分组:数据库支持多列分组条件,执行的时候逐级分组 select deptno,job,count(*),avg(sal) from emp group by deptno,job order by deptno; 查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须要遵守规定:SELECT子句中可以包括聚合函数,
或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中 with rollup: group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计 GROUP_CONCAT函数:可以把分组查询中的某个字段拼接成一个字符串
select deptno,GROUP_CONCAT(name),count(*) from emp where sal>2000 group by deptno 查询结果会将符合条件的name,拼接起来 执行顺序: FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY-> LIMIT
select sum(price) * from 表名 where ... group by ... having ... order by ... limit HAVING子句: 缘由:WHERE子句先于GROUP BY执行,一旦WHERE子句中出现了汇总函数,数据库根本不知道按照什么范围计算汇总值,
此时就可以将汇总函数放在having中 注:HAVING子句中能够使用三种要素:常数,聚合函数,GROUP BY子句中指定的列名(聚合建) 用having就一定要和group by连用, 用group by不一有having(它只是一个筛选条件用的) 相对于HAVING子句,更适合写再Where子句中的条件: where子句
= 指定行所对应的条件 having子句 = 指定组所对应的条件 聚合建所对应的条件不应该书写在HAVING子句中,而应书写在WHERE子句当中。虽执行结果一样,
但将条件写在where子句中比写在having子句中的处理速度更快,返回结果时间更短。 原因:聚合操作时,DBMS内部会进行排序处理,where在排序之前就对数据进行过滤,having是在排序之后在对数据进行分组。 表连接 表连接分为两种:内连接和外连接 内连接是结果集中只保留符合连接条件的记录(显示内连接、隐示内连接) 外连接是不管符不符合连接条件,记录都要保留在结果集中 内连接的多种语法形式(inner可省略) 显示内连接:SELECT …… FROM 表1 Inner JOIN 表2 ON 连接条件 ;       SELECT …… FROM 表1 JOIN 表2 WHERE 连接条件 ;
隐示内连接:SELECT …… FROM 表1 , 表2 WHERE 连接条件 ; 外连接与内连接的区别在于,除了符合条件的记录之外,结果集中;分为左外连接和右外连接;
左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。
如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。 UNION关键字可以将多个查询语句的结果集进行合并 注:内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。
但是外连接里,条件写在WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。 子查询是一种查询中嵌套查询的语句 子查询可以写在三个地方:WHERE子句、FROM子句、SELECT子句,但是只有FROM子句子查询是最可取的 WHERE子查询:这种子查询最简单,最容易理解,但是却是效率很低的子查询(用表连接替代WHERE子查询) FROM子查询:这种子查询只会执行一次,所以查询效率很高 SELECT子查询:这种子查询每输出一条记录的时候都要执行一次,查询效率很低 相关子查询:查询语句执行的时候要多次的依赖于子查询的结果,这类子查询被称作相关子查询
1、WHERE子查询和SELECT子查询都属于相关子查询 2、因为相关子查询要反复多次执行,所以应该避免使用 单行子查询和多行子查询 单行子查询的结果集只有一条记录,多行子查询结果集有多行记录 多行子查询只能出现在WHERE子句和FROM子句中 WHERE子句中的多行子查询 WHERE子句中,可以使用IN、ALL、ANY、EXISTS关键字来处理多行表达式结果集的条件判断 select name from emp where age>ALL(select age from emp where name IN("LILEI","FORD")) //查询年级大于LILEI FORD的员工姓名
all关键字
与子查询返回的所有值比较 为TRUE 则返回TRUE
exists关键字 在sql语句中出现exists关键字的时候,它先会对外表进行循环查询并且查询都会查看exists条件语句是否符合条件。
当exists里的条件语句能够返回记录行时,条件就为真,就会返回当前数据。反之如果exists里的条件语句不能返回记录行,
则当前循环到的这条数据就会被丢弃。
exists的条件就是一个过滤条件,当能返回结果集则为true,不能返回结果集则为false;
select * from tab where exists(查询语句)
eg:select * form emp a where exists(select * from emp b where a.age > 60);//查询是否有大于60的员工,有则输出
  select * from emp a where exists(select * from dept d where a.dept_id = b.dept_no);//查询有所属部门的员工信息 exists与in的区别: 1、in引导的子句只能返回一个字段,exists子句可以有多个字段; 2、通常情况下采用exists要比in效率高,因为in不走索引,但要但要具体情况具体分析:in适合于外表大而内表小的情况;exists适合于外表小而内表大的情况
group_concat()实现行的合并
格式:group_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator '分隔符'])
说明:
  1.使用distinct可以排除重复值
  2.如果需要对结果中的值进行排序,可以使用order by子句;
  3.separator是一个字符串值,默认为逗号

视图 视图是从一个或几个基本表(或视图)中导出的虚拟的表视图看上去非常像数据库的物理表,对它的操作同任何其它的表一样。
当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会自动反映在由基表产生的视图中。由于逻辑上的原因,有些视图可以修改对应的基表,而有些则不能 数据库备份、恢复 备份:登录数据库所在服务器,输入 mysqldump -u root -p 数据库名称 > 文件保存路径 eg:mysqldump -u root -p test > /root/test.sql 回车; 输入密码 恢复:1.登录mysql数据库 mysql -uroot -p 回车 输入密码
  2.删除已经备份的数据库 drop database test;
  3.重新创建名称相同的数据库 create database test;
  4.使用该数据库 use test;
  5.导入文件执行命令:source 备份文件全路径 source /root/test.sql
存储过程 -- 创建存储过程companyInfo   CREATE PROCEDURE companyInfo()   BEGIN     SELECT company_id comId,SUM(company_id) comSum FROM `sys_user` GROUP BY company_id;   END;  -- 调用存储过程   CALL companyInfo(); -- 查看jeesite中所有的存储过程   SELECT * from mysql.proc where db='jeesite'; -- 删除存储过程   DROP PROCEDURE if EXISTS companyInfo;
posted @ 2021-04-21 22:11  景、  阅读(42)  评论(0编辑  收藏  举报