执行顺序yscl博主的博文

mysql好文推荐:执行顺序中每一个步骤都为下一个步骤创建一个虚拟表

命令行查看所有的数据库

SHOW DATABASES

2. 选择一个名字叫database的数据库

USE database

3. 查看数据库中所有可用表

SHOW TABLES

4. 查看用户表user的字段

SHOW COLUMNS FROM user

或者

DESCRIBE user

5. SHOW 还可以直接接其他sql语句

SHOW CREATE DATABASE 创建数据库过程的状态

SHOW CREATE TABLE 创建表过程中的状态

SHOW STATUS 显示服务器状态的信息

SHOW ERRORS 显示服务器错误信息

SHOW WARNINGS 显示服务器警告信息

SHOW GRANTS 显示用户的权限

6. SELECT语句的应用

SELECT DISTINCT age , name FROM user // 检索出来的数据必须满足age不一致,一致的age会留下一条

SELECT * FROM user LIMIT 6 , 5 // 从行6开始,检索条数为5 。其中,第1行为行0

SELECT user.name FROM database.user //这情况的名字为完全限定名

SELECT * FROM user ORDER BY id DESC// 根据id进行降序排序 默认是升序ASC

ORDER BY 后面可以接 LIMIT

7. 接下来就写WHERE的用法若同时出现ORDER BY 和 WHERE 时,WHERE 位于ORDER BY之前

操作符[= 、<>、!=、=、>、=>、BETWEEN]

SELECT * FROM user WHERE name = 'cznczai' //在数据库表中,不区分大小写。字符串查询还有like

而且是单引号!!!

SELECT * FROM user WHERE age BETWEEN 1 AND 5; // 字段 BETWEEN 值 AND 值

SELECT * FROM user WHERE email IS NULL // NULL 不等于 0 和 ''

另外还需要注意 NULL 跟 不匹配返回空行是不一样的

SELECT * FROM user WHERE age = 1 AND name = 'cznczai' // sql同时有AND OR时,优先执行AND

另外,通过括号可以改变AND的执行优先级

SELECT * FROM user WHERE age IN (1,2,3) ORDER BY name // OR也可以实现 但是麻烦

NOT 可以加在 IN 的前面表示取反;NOT还支持BETWEEN 跟 EXISTS

8. 模糊查询的代表LIKE操作符跟WHERE 结合 ,使用方便但性能较低

通配符 %:任何字符任意次

通配符_ : 一个字符一次

SELECT * FROM user WHERE name LIKE 'cznczai%' //区分大小写 跟WHERE的字符串查询有区别

正则表达式REGEXP 关键字检索一个含'1000'的数据

一点.表示匹配任意一个字符

不区分大小写,若要区分大小写可以用BINARY

SELECT * FROM user WHERE name REGEXP '1000' // 类似于 LIKE '%1000%'

不同于 LIKE '1000'

SELECT * FROM user WHERE name REGEXP '.000' // 类似于LIKE '_000'

SELECT * FROM user WHERE name REGEXP BINARY 'CHENZHINAN'// 区分大小写

2. 通过OR进行匹配

SELECT * FROM user WHERE name REGEXP 'chenzhinan | cznczai' // 筛选出含两个字符串的行

3. []匹配特定字符字符其中的一个

SELECT * FROM user WHERE name REGEXP '[123] Ton' // 匹配1或2或3 跟[1|2|3] Ton 同理

其中 '[123] Ton' != '1|2|3 Ton' ,后者是1, 2, 3Ton

另外[^123]的意思是取 非1 或 2 或 3的所有字符一般都会跟 - 进行结合,就有范围定义匹配

SELECT * FROM user WHERE name REGEXP '[1-3] [a-z]'

4. 为了匹配特殊字符,必须用\\ 一个给m ysql解析,另外一个给正则表达式解析\\- —sql—> -

\\. —sql—> .

\\\ —sql—> \

\\f —sql—> 换页

\\n —sql—> 换行

\\r —sql—> 回车

\\t —sql—> 制表

\\v —sql—> 纵向制表

SELECT * FROM user WHERE name REGEXP '\\.'

另外有经过包装的字符类 [:alnum:] [:lower:] [:upper:]...

SELECT * FROM user WHERE name REGEXP '[[:digit:]]{4}' ORDER BY id //将整个[:digit:]外面还有[]

等价于

SELECT * FROM user WHERE name REGEXP '[0-9][0-9][0-9][0-9]' ORDER BY id

5. 重复元字符

下面要求它们前面的字符或者数字出现的次数。* : 0个或多个匹配

+: 1个或多个匹配 {1,}

{n} : 指定数目的匹配

{n, } : 不少于指定数目的匹配

{n, m} : 匹配数目的范围,其中m小于等于255

SELECT * FROM user WHERE name REGEXP '[4]{2}' // ≈ [4][4]

6. 可以确定匹配位置的定位元字符^ 文本的开始 【注意这个^跟之前[^1]完全不同,后者是取反】

$ 文本的结尾

[[:<:>

[[:>:]] 词的结尾

SELECT * FROM user WHERE name REGEXP '^[0-9]' name以0到9开头的数据

SELECT * FROM user WHERE name REGEXP '$[0-9]'

重要知识点计算字段:不存在表中的生成字段

SELECT Concat(name,':',age) AS attr FROM user // 拼接成较长的串 且字段名为attr

SELECT Concat(RTrim(name),':',Trim(id),'-',LTrim(age)) AS attr FROM user // 函数去掉空格

SELECT columnA+columnB*2 AS price FROM user // 算术计算

2. 文本处理函数Upper() 字符串大写 、Lower() 字符串小写

Left() 返回串左边的字符 、 Right() 返回串右边的字符

Locate() 找出串的一个子串

Soundex() 返回串的SOUNDEX的值

SubString() 返回子串

3. 时间处理函数CurDate() 返回当前日期 、 CurTime() 返回当前时间

Date() 返回日期时间的日期部分

DateDiff() 计算两个日期之差

Date_Add() 高度灵活的日期运算函数

Date_Format() 返回 一个格式化的日期或者时间串

Year、Time、Now、Hour.... 获取对应的数据

SELECT * FROM user WHERE orderDate = 2020-11-07' // 普通字符串匹配需要yyyy-mm-dd格式

SELECT * FROM user WHERE Date(orderDate) = '2020-11-07' // orderDate提取日期 舍弃秒

检索九月份的所有数据

笨方法:

SELECT * FROM user WHERE Date(orderDate) BETWEEN '2020-9-1' AND '2020-9-30'

聪明方法:

SELECT * FROM user WHERE Year(orderDate) = '2020' AND Month(orderDate)='9'

4. 数值处理函数Abs() 返回一个数的绝对值

Cos() 余弦 、Sin()正弦 、Tan() 正切、

Rand() 随机数

Sqrt() 平方

5. 聚集函数AVG() 返回某列的平均值 忽略NULL

COUNT(*) 返回某列的行数 含NULL ;COUNT(column) 忽略NULL

MAX() 返回某列的最大值 、MIN() 返回某列的最小值 ; 如果是文本数据,返回最前/后一行

SUM() 返回某列值之和

用以上的函数要结合计算字段还有DISTINCT(不重复) 的使用 ,默认是ALL(包含重复)

SELECT AVG(DISTINCT price) as avg_price FROM products //只会根据不同的价格求平均值

6. 数据分组 非常强大一个功能,能实现归类【这一点WHERE不能很好实现】

SELECT COUNT(*) FROM user GROUP BY agewhere 和having的不一样吗?对!完全不一样:分组查询以及where和having的区别 【WHERE筛选出数据再进行分组 ;HAVING从分组的结果中筛选行】

ORDER BY 跟 RUOPGURRUOUP BY 可以搭配使用分组后进行排序输出

重要知识点

子查询常用IN

SELECT name FROM user WHERE age IN (SELECT age FROM student) // 当然可以搭配 <> =

2. 嵌套SELECT语句,每个学生对应每个教室名【后面会有其他解决方法】

SELECT name ,(SELECT classRoom FROM class WHERE class.classId = user.classId) as classRoom FROM user

其中,切记请勿 classId = classId,需要加限定性语句

联结表join 外键、主键

涉及两个表最好不要用 SELECT * ,要具体一点!!! 避免冲突信息最简单的联结

user.classId = class.classId //当两个表都存在同一个字段,要详细表示出来

2. 要避免笛卡尔积,通过WHERE来避免 且输出是两个表的字段

SELECT * FROM user , class // 要避免这种写法

SELECT * FROM final_account AS p1,final_account AS p2 ; 因为*,导致final_account表的字段出现了两次

SELECT p1.id,p2.* FROM final_account AS p1,final_account AS p2 WHERE p1.id = p2.id ;

如果两个都有id

SELECT id 会报错

3. 内部联结/等值联结

两个表,首选INNER JOIN...ON (虽然可以用WHERE代替,但性能前者更优)

SELECT * FROM user INNER JOIN class ON class.classId = user.classId;

联结多个表,推荐用WHERE

SELECT * FROM user WHERE user.id = student.id AND student.classId = class.classID

相当于

SELECT * FROM user WHERE user.id IN (

SELECT id FROM student WHERE student.classId = class.classId

)

4. 因为联结涉及多个表,下面介绍为表起别名,再次提醒,涉及多个表,尽量不要用*

SELECT * FROM user AS u

5. 自联结 【用途:同张表——上级跟下级之间的关系】将自己的表当作另一张表对待

子查询 很麻烦

SELECT id.name FROM products WHERE vend_id = (SELECT vend_id FROM product WHERE prod_id ="DTNTR")

一般

SELECT id,name FROM products WHERE prod_id ="DTNTR"

自联结

SELECT p1.id,p1.name FROM products As p1,products As p2 WHERE p1.vend_id = p2.vend_id AND p2.prod_id ="DTNTR"

6. 自然联结:内部联结也是自然连接的一种

NATURAL JOIN

SELECT * FROM department AS d1 NATURAL JOIN department AS d2匹配的表中相同字段就会一一对应,结果是两个表的交集。

不存在相同的字段,就会产生笛卡尔积。

筛选后,每个列都是唯一的,不会存在相同的列

7.外部联结【第3点,内部联结INNER JOIN ON】左外联结LEFT OUTER JOIN 左必定不为空 右可为空

右外联结RIGHT OUTER JOIN 右必定不为空 左可为空

全外联结FULL OUTER JOIN 左右可为空

SELECT user.name,class.className FROM user LEFT OUTER JOIN class ON user.classId = class.classId

SELECT user.name ,class.className FROM user RIGHT OUTER JOIN class ON user.classId = class.classId

SELECT user.name ,class.className FROM user FULL OUTER JOIN class ON user.classId = class.classId联结也可以结合聚集函数,如COUNT()... 要注意联结后要求的那一列的所有数据是否不为空

SELECT COUNT(user.id) FROM user INNER JOIN class ON user.classId = class.classId

组合查询/并查询UNION 默认将两条查询合并并且去重,整理成一个数据集

SELECT * FROM user WHERE username = 'cznczai' UNION SELECT * FROM user WHERE username='chenzhinan'当然可以用WHERE来代替,但对于复杂且多个表,同时字段相同的数据来说,UNION很有优势。

2. UNION ALL 能完成WHERE做不了的事——重复的数据也保留下来

进阶知识

1.创建表

CREATE TABLE user (
id int NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
classId char(50) NULL,
PRIMARY KEY (id)
)ENGING=InnoDB主键是不允许为NULL

2.

全文本搜索全本本搜索比LIKE 跟正则表达式更加的专业

需要MyISAM引擎来支持。文本数据修改后MYSQL会自动进行调整