快速复习mysql
快速复习mysqlSQL的分类mysql常用命令登录退出查看mysql中有哪些数据库创建数据库使用数据库创建数据库后查看该数据库基本信息删除数据库MySQL命令查看某个数据库下有哪些表导入sql文件查看当前使用的数据库数据表数据表的创建查看数据表查表的基本信息查看表的字段信息修改表名修改字段名修改字段数据类型增加字段删除字段删除数据表insert插数据更新数据删除数据约束主键外键创建外键删除外键关于外键约束需要注意的细节查询查询所有字段查询指定字段也可以查常数在SELECT查询语句中还可以使用加减乘除运算符。查询结果中过滤重复数据聚合函数条件查询关系运算符使用IN关键字查询BETWEEN AND使用空值查询使用AND关键字查询使用OR关键字查询使用LIKE关键字查询使用LIMIT限制查询结果的数量分页OFFSET 跳过查询结果的前 N 行union合并查询结果集使用GROUP BY进行分组查询ORDER BYHAVING子查询带EXISTS关键字的子查询带ANY关键字的子查询带ALL关键字的子查询删除内连接查询外连接update基本语法delete基本语法日期的varchar与date类型的转换varchar转datedate转字符串书写顺序S-F-W-G-H-O-L执行顺序F-W-G-H-S-D-O-L执行顺序理解事务transaction什么是事务事务的特点提交事务commit关闭自动提交回滚事务roolback事务的四个特性事务的隔离性索引索引的创建与删除索引的失效视图表复制视图的创建与删除视图的作用SQL的分类1、DDL(Data Definition Language) 数据定义语言用来操作数据库、表、列等 常用语句CREATE、 ALTER、DROP2、DML(Data Manipulation Language) 数据操作语言用来操作数据库中表里的数据常用语句INSERT、 UPDATE、 DELETE3、DCL(Data Control Language) 数据控制语言用来操作访问权限和安全级别 常用语句GRANT、DENY4、DQL(Data Query Language) 数据查询语言用来查询数据 常用语句SELECTmysql常用命令登录mysql -u root -p 随后输入密码退出exit查看mysql中有哪些数据库show databases;创建数据库create database 数据库名称;使用数据库use 数据库名;创建数据库后查看该数据库基本信息show create database db1;删除数据库MySQL命令drop database db1;查看某个数据库下有哪些表show tables;导入sql文件source 文件路径; 注意不要有中文路径查看当前使用的数据库select database();数据表数据表的创建create table 表名( 字段1 字段类型, 字段2 字段类型, … 字段n 字段类型 );查看数据表show tables;查表的基本信息show create table 表名;查看表的字段信息desc 表名;修改表名alter table 原表名 rename to 表名;修改字段名alter table 表名 change 原字段名 字段名 数据类型;修改字段数据类型alter table 表名 modify 字段名 数据类型;增加字段alter table 表名 add 字段名 字段数据类型;删除字段alter table 表名 drop 字段名;删除数据表drop table 表名;insert插数据INSERT INTO 表名字段名1,字段名2,...) VALUES (值 1,值 2,...);更新数据UPDATE 表名 SET 字段名1值1[,字段名2 值2,…] [WHERE 条件表达式];删除数据DELETE FROM 表名 [WHERE 条件表达式];约束约束条件 说明PRIMARY KEY 主键约束用于唯一标识对应的记录被标识为主键的数据在表中是唯一的且其值不能为空。FOREIGN KEY 外键约束常用于多张表之间的约束NOT NULL 非空约束字段的值不能为空UNIQUE 唯一性约束表中字段的值不能重复出现DEFAULT 默认值约束用于设置字段的默认值主键每张表都必须有主键被设为主键的字段为主键字段主键字段的值叫主键值主键值唯一且不能为空。外键添加外键约束的字段称为外键字段外键字段的值叫外键值当两张表有联系时通常会有一个相同的字段作为联系为了确保这个字段值不会出错就可以给这个字段加外键约束增强两个表的联系添加外键约束的表是子表(从表)另一个表则是父表(主表)创建外键在创建数据表时语法如下CONSTRAINT 外键名 FOREIGN KEY (子表外键字段) REFERENCES 父表 (对应字段)或者直接FOREIGN KEY (子表外键字段) REFERENCES 父表 (对应字段)如果没有指定外键名称MySQL 会自动生成一个将创建数据表创好后添加外键约束语法如下ALTER TABLE 子表名 ADD CONSTRAINT 外键名 FOREIGN KEY (子表外键字段) REFERENCES 父表 (对应字段);删除外键alter table 从表名 drop foreign key 外键名删除表及数据的顺序先子后父没有父哪来的子(数据一致性)创建表及插入数据的顺序先父后子关于外键约束需要注意的细节1、从表里的外键通常为主表的主键2、从表里外键的数据类型必须与主表中主键的数据类型一致3、主表发生变化时应注意主表与从表的数据一致性问题查询查询所有字段select * from 表名;查询指定字段也可以查常数在SELECT查询语句中还可以使用加减乘除运算符。select 字段1,字段2,常数 from 表名;查询结果中过滤重复数据在使用DISTINCT 时需要注意在SELECT查询语句中DISTINCT关键字只能用在第一个所查列名之前。select distinct 字段 from 表名;聚合函数count()max()min()sum()avg()条件查询在查询语句中通过WHERE子句指定查询条件对查询结果进行过滤。关系运算符select * from student where age17;使用IN关键字查询IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中则将字段所在的记录将査询出来。select * from student where sid in (‘S_1002’,‘S_1003’);查询sid为S_1001以外的学生的信息 MySQL命令select * from student where sid not in (‘S_1001’);BETWEEN AND用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内则将所在的记录将查询出来查询16到18岁的学生信息 MySQL命令select * from student where age between 16 and 18;查询不是16到18岁的学生信息 MySQL命令select * from student where age not between 16 and 18;使用空值查询is null is not null使用AND关键字查询在MySQL中可使用AND关键字可以连接两个或者多个查询条件。where 条件1 and 条件2;使用OR关键字查询只要记录满足其中任意一个条件就会被查询出来where 条件1 or 条件2;使用LIKE关键字查询LIKE关键字可以判断两个字符串是否相匹配可以用来精准查询也可以使用通配符进行模糊查询含有%通配的字符串用于匹配任意长度的字符串。例如字符串“a%”匹配以字符a开始任意长度的字符串含有_通配的字符串只匹配单个字符如果要匹配多个字符需要连续使用多个下划线通配符。例如字符串“ab_”匹配以字符串“ab”开始长度为3的字符串如abc、abp等等字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串如abcd、atud等等。使用LIMIT限制查询结果的数量完整用法limit startIndex,length 起始下标从0开始缺省用法limit n; 取前n位查询学生表中年纪最小的3位同学select * from student order by age asc limit 3;分页每页显示pageSize条数据第pageNo页limit (pageNo-1)*pageSize , pageSizeOFFSET 跳过查询结果的前 N 行完整语法offset n rows简化offset n(注意mysql中没有rows用法且offset不能单独使用需要和limit结合使用)通常与 LIMIT 或 FETCH 结合使用实现分页。LIMIT 10 OFFSET 20;相当于LIMIT 20, 10;union合并查询结果集在两个查询语句中间使用可以合并结果优点是效率高select语句 union select语句;使用GROUP BY进行分组查询GROUP BY 子句可像切蛋糕一样将表中的数据进行分组再进行查询等操作统计各班级学生数 select count(*)as stunum(as后自己临时对查询项目取名也可以不用) from stu group by classno;ORDER BY对查询结果排序从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此我们可以使用ORDER BY对查询结果进行排序SELECT 字段名1,字段名2,…FROM 表名ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC];参数 ASC表示按照升序排序DESC表示按照降序排序默认情况下按照ASC方式排序。多字段排序的时候先排的优先HAVINGHAVING 必须与 GROUP BY 一起使用除非 SELECT 中只有聚合函数支持在 HAVING 中使用聚合函数尽量先用 WHERE 过滤减少分组的数据量可以同时使用 WHERE 和 HAVINGWHERE 过滤原始数据HAVING 过滤分组结果子查询一个查询语句的所需的信息可以嵌套另一个查询语句被嵌套的语句称为子查询被嵌套的语句查询出来的结果可以作为这个查询所需的信息/条件子查询可以嵌套在select后也可以嵌套在from后也可以嵌套在where后select ...(select语句) from ...(select语句) where ...(select语句);带EXISTS关键字的子查询EXISTS关键字后面的参数可以是任意一个子查询 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行带ANY关键字的子查询ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。带ALL关键字的子查询ALL关键字与ANY有点类似只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。删除delete from student where classid(select cid from class where cnameJava);内连接查询SELECT 查询字段1,查询字段2, … FROM 表1 [INNER] JOIN 表2 ON (表1.关系字段和表2.关系字段的关系)或者select 表1.查询字段1,表2.查询字段2, … FROM 表1,表2,… where (表1.关系字段和表2.关系字段的关系)内连接的特点就是两个表不分主次地位相当只会显示出两个表符合条件的那一部分信息外连接SELECT 查询字段1,查询字段2, … FROM 表1 [left/right] JOIN 表2 ON (表1.关系字段和表2.关系字段的关系)其中left和right用来区分谁是主表left表示join左边的表是主表right同理外连接的特点就是不管符不符合条件都会将主表的要查询的字段值信息全部显示出来符合条件的会一一对应不符合的在从表那里会对应为nullupdate基本语法UPDATE 表名 SET 字段名1值1[,字段名2 值2,…] [WHERE 条件表达式];delete基本语法DELETE FROM 表名 [WHERE 条件表达式];日期的varchar与date类型的转换varchar转datestr_to_date(‘字符串日期’,‘日期格式’) 一般用于insert将字符串转换为date插入日期格式%Y 年%m 月%d 日%h 时%i 分%s 秒insert into stu(no,birth) values(1,str_to_date(‘10-01-2005’,‘%m-%d-%Y’));但是当你的字符串日期格式为%Y-%m-%d时不使用这个函数就能自动转换insert into stu(no,birth) values(2,‘2005-10-02’);date转字符串date_format(日期类型字段名,‘所需日期格式’) 一般用于select将date转换成特定格式的字符串展示select no,date_format(‘birth’,‘%Y/%m/%d’)from stu就能将日期输出为2005/10/01书写顺序S-F-W-G-H-O-LSELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT执行顺序F-W-G-H-S-D-O-LFROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT执行顺序理解SELECT department, AVG(salary) – 5. 选择显示的列FROM employees – 1. 从表获取数据WHERE hire_date ‘2020-01-01’ – 2. 筛选行GROUP BY department – 3. 分组HAVING AVG(salary) 5000 – 4. 筛选分组ORDER BY AVG(salary) DESC; – 6. 排序事务transaction什么是事务一个事务是一个完整的业务逻辑和事务相关的是DML语句也就是insertupdatedelete事务就是多条DML语句同时成功或同时失败事务的特点事务怎么做到多条语句同时成功和失败的事务执行过程中每一条DML语句操作都会提交到事务活动的日志文件事务执行过程中可以提交事务也可以回滚事务提交事务标志事务的成功结束回滚事务标志事务的失败结束提交事务commitmysql默认会自动提交事务每执行一条语句提交一下关闭自动提交start transaction;回滚事务roolback回滚只能回滚到上一次提交的节点事务的四个特性A原子性C一致性I隔离性T持久性事务的隔离性事物的四个隔离级别读未提交 read uncommited 最低事务A能读取到事务B未提交的数据可能导致脏读大多数数据库都会从第二档开始读已提交 read commited事务A只能读到事务B已提交的数据解决了脏读但是会出现不可重复读重复读到的数据可能不一样可重复读 repeatable read事务A开启之后不管多久每次在事务A中读取到的数据都是一样的即使事务B已经修改数据事务A读到的还是之前读到的数据解决了不可重复读会出现幻影读读到的数据不真实mysql默认的隔离级别序列化/串行化 serializable 最高效率最低事务排队不能并发每一次读到的数据都是真实的索引索引在字段上添加可以提高查询效率添加索引后索引对象会自动排序(表不会变)数据库中主键和unique约束的字段会自动添加索引对象不建议随便添加索引添加太多会导致系统性能降低索引的创建与删除create index 索引名 on 表名(字段名); drop index 索引名 on 表名;索引的失效索引是从开头进行查询的所以如果查的数据是%开始的模糊查询索引就无从下手索引列使用函数会导致索引的失效视图站在不同角度去看同一份数据表复制create table 新表名 as select* from 表名;视图的创建与删除create view 视图名 as DQL语句;drop view 视图名;视图的作用对视图对象的操作会影响原表当一个DQL语句需要重复使用的时候就可以使用视图将这段语句“复制”下来到时候要用这段DQL语句的时候直接使用视图即可可以大大提升效率
