课程概述
-
需要掌握的基本操作
- 实现增删改查、汇总数据创建报告、使用子查询以编写复杂查询、基本内置函数、创建视图、存储过程及查询
-
高阶:触发器、事务、并发
-
更难:设计数据库、为了实现高效查询的索引、维护数据库
选择语句
-
关键词
- select【后加列名 】
- 可选子句关键词:FROM【后加表名】 、WHERE【筛选结果 相当于if语句】 、ORDER BY 【按照某一列进行排序】、LIMIT【限定查询返回的记录】
- 若要使用不同子句,则子句关键字相对位置不能改变
-
SELECT用法【选择语句的必选关键词】
- 选中个别列:select customer_id,name,address【所呈现的列的顺序会按照代码的顺序而非原表的相对顺序】
- 可以进行算数运算 如points+10,即在原表points列的数据基础上+10【与此同时 列名会变成points+10】
- 如果想改列名可以用AS关键词 如points * 10 + 100 AS discount_factor 【注意如果别名有空格需要将别名用单双引号抱起来 如points * 10 + 100 AS 'discount factor'】
- 如果要得到该列的去重结果,可利用关键字DISTINCT 【如SELECT DISTINCT state】
- 选中全部列:select *【对于数据量很大的数据库 不建议使用】
-
WHERE用法【筛选结果 相当于if语句】
-
单个过滤条件
- 如得到积分高于3000
- 比较运算符:> >= < <= =【注意等于不是C中的==】<>【表示不等于 也可以像C一样 用!=】
-
AND OR NOT【多个过滤条件】
- AND(& &&)OR(||) not(!)
- and的优先级高于or
- 可以用()来改变结合顺序
-
BETWEEN AND
- WHERE points >= 1000 AND points <= 3000
WHERE points BETWEEN 1000 AND 3000 效果等价 - 注意是包含临界值的
- WHERE points >= 1000 AND points <= 3000
-
IN
- WHERE state = 'VA' OR state = 'GA' OR state = 'FL'
WHERE state IN ('VA', 'GA', 'FL') 效果等价 - 用法像python中的数组 允许取非 即NOT IN
- 注意不允许WHERE state = 'VA' OR 'GA' OR 'FL'
- WHERE state = 'VA' OR state = 'GA' OR state = 'FL'
-
LIKE【模糊查找】
-
%表示任意数目的字符(0个 1 个 或多个)
-
WHERE last_name LIKE 'b%' 得到以B开头的姓氏
-
WHERE last_name LIKE '%b%' 得到含有B的姓氏
-
WHERE last_name LIKE '%b'得到以B结尾的姓氏
-
-
_表示一个单字符 如WHERE last_name LIKE '__y' 姓氏包含三个字符 且最后一个是Y
-
可以取非 即NOT LIKE
-
-
REGEX【正则表达式 也可以写作RLIKE】
- |表示不同的搜索模式
- WHERE last_name LIKE '%b%' 和WHERE last_name REGEX 'b'等价
- WHERE last_name REGEX '^b'表示必须以b开头
- WHERE last_name REGEX 'b$'表示必须以b结尾
- WHERE last_name REGEX 'b|c'表示必须包含b或者c
- WHERE last_name REGEX '^b|c$|d'表示必须以b开头或者以c结尾或者包含d
- WHERE last_name REGEX '[abd]c'表示必须包含ac或者bc或者dc 【注意ac是绝对匹配 如ahc就不能被匹配上】
- c[abd]同理 [a-h]b是允许的 等价于[abcdefgh]b 【方括号内的用-字符必须要升序 即不允许h-a】
- 正则表达式很复杂,掌握以上 在sql基本够用
-
IS NULL的用法【查找缺失了属性的记录】
- 取反是IS NOT NULL
-
日期和字符串
- 查询时涉及文本需要用单(或双)引号引起来(一般用单引号),由于mysql大小写不敏感,故'VA'和'va'是同样效果
- 查询涉及日期也要引号 如WHERE birth_date > '1990-01-01'【表示出生日期在1990-01-01之后】
- 注意第2条是mysql标准日期格式
-
-
ORDER BY
- 默认主键列排序 具体见下文 其他积累-修改列名
- 作用是用其他列(或者算数表达式)排序 默认是升序123abc 降序可以加 DESC 如ORDER BY customer_id DESC】
- 用算术表达式排序的例子:ORDER BY quantity * unit_price DESC
- 可以通过select选中表的部分列 但是用表的非选中列对表进行排序【虽然结果只会呈现表的部分选中列】
- select first_name, last_name, 10 AS points(温习了AS的取别名作用 此处是增加一类全为10且列名为points) 后面ORDDER BY可以用points列【只介绍用法 还不知道实际会有什么意义】
- ORDER BY 1, 2 表示按照select的后两列排序,以上面一条为例子,就是以first_name, last_name排序 前者更优先 后者次优先。虽然简便 但是建议减少使用 因为可能select前面会增加新的列】
-
LIMIT【限定查询返回的记录】
- LIMIT 3 【获取前3条记录】
- LIMIT 6, 3【跳过前面6条记录获取前3条记录 即7-9 此处6称为偏移量】
- 如果获取的条数大于总记录的条数,则会返回总记录的条数
其他积累
-
大小写问题
- 大小写不敏感,但是一般用大写写关键词
-
USE关键词选中数据库
- USE是关键词,将选中数据库【也可以通过鼠标双击、手动在左侧选中所需操作的数据库,数据库加粗了说明是已经选中】
- USE引导是独立语句,结束要加分号
-
查看、修改表的内容
- 左侧Schemas栏,点击所需数据库(前面的小三角)、点击Tables下拉框、鼠标悬浮到所需所需要修改的表(将会出现3个图标),点击最后一个形如闪电+表格的图标,接下来将呈现表格,双击单元格内容内容可编辑。修改后右下角有apply(修改)和revert(还原),按需选择。选择后有确认窗格
-
易错点——操作表没选或者选错
- 查询前表一定要先选对,不然就容易报错。
- 在查询之前可以先看表的内容【实际上按照上述方法查看表的内容后就会出现相关语句对所需表的所有列进行选择 如SELECT * FROM sql_store.customers;【这个表达也为数据库和表之间的引用关系提供参考】
- 可以在这个表达的基础上修改代码,但是要注意分号是否要保留,如后加where进行筛选,则分号要删除【因为select from where是同一个语句的不同子句】】,对照表的内容编写代码选取列会更加不容易出错
-
修改表的列名、增加或者减少列
- 鼠标悬浮到所想要的表,点击3个图标中的第2个形如扳手的图标 将会出现table窗格,在column列中会有黄色闪电状的一个单元,表示该列是主键列 这一列的值要能唯一识别表里面的记录 默认主键列排序
-
其他零零碎碎
- 每条语句需要分号间隔(类似于C 但是最后一条没有 不懂
- 快捷键看query
- 注释: --+空格 或者 #
- 子句换行是方便代码阅读的好习惯
- 如果一行呈现不下 可以分行用缩进【缩进是为了让结构更清晰 没有语法上的要求】
- 有报错别紧张 看报错的内容【如查找不到列 可能就是列名写错了】
- 光标变成了下划线 解决方法:按insert键即可恢复 参考网页: mysql输入代码时光标变成下划线时 变回原来的竖线_navicat光标变成下划线-CSDN博客