首页 > 数据库技术 > 详细

《MySql必知必会》笔记整理

时间:2020-01-21 19:48:06      阅读:85      评论:0      收藏:0      [点我收藏+]

数据库基础

关键词:
数据库
(表名唯一,取决多个因素,如不同数据库的表可以同名)
模式(关于数据库和表的布局及特性的信息)
(表中的字段)
[行(raw)和记录(record)很大程度可以等同,但行才是正确的术语]
数据类型(限制数据种类,帮助正确排序,磁盘优化方面的作用)
主键(primary key): 一列,其值可以唯一区分表中的行。
SQL [(Structured Query Language):结构化查询语言。]

主键条件:

  1. 每行都应有一个主键,所以其值不为null。
  2. 任意两行间的主键值不同。

主键通常是一列,但也可多列共同构成主键。

主键设置建议:

  1. 不更新主键列中的值;
  2. 不重用主键列的值;
  3. 不在主键列中使用可能会更改的值。

SQL命令执行:

  1. 命令在mysql>之后输入;
  2. 命令用 \g结束,仅按Enter不执行命令;
  3. 输入help\h获取帮助;
  4. 输入quitexit退出程序。

基本语句:

myslq -u root -p;
use Database;

#SHOW相关
SHOW databases;
SHOW tables;
SHOW columns FROM tables;? ? -- 等于? ? describe "tables";
SHOW CREATE DATABASE db_name;?显示完整的建库语句
SHOW CREATE TABLE tbl_name;
SHOW [STORAGE] ENGINES

#SELECT相关
SELECT column_name1,column_name2 FROM table;
SELECT *FROM tables;
--  Distinct
-- 不能部分使用DISTINCT,其应用于所有列而不是其前置列
SELECT DISTINCT column_namw FROM table; 
-- Limit? ?从第零个开始后的5个? ? 取的时候排列顺序是从零开始的。
SELECT column_name FROM table_name LIMIT 5;
-- 从第二个开始后的5个
SELECT column_name FROM table_name LIMIT 2,5;
-- OFFSET 限制两个,从第三为开始取
SELECT column_name FROM table_name  LIMIT 2 OFFSET 3;?
-- 使用全限定的表名? ? 库:manxc? ? 表:tags
SELECT tags.tid FROM manxc.tags;

排序检索数据

关键字:ORDER BY

SELECT column_name FROM table_name ORDER BY column_name;

默认升序,字母按A-Z排,数字从小到大;
注:排序中文时出现问题。
解决:https://www.jianshu.com/p/8a9135f9cd47?utm_campaign
升序(默认):ASC? ? 降序:DESC

过滤数据

关键字:WHERE(同时可与其它关键字组合)

SELECT * FROM manxc.tags WHERE tags.tid BETWEEN 2 AND 9 ORDER BY tid DESC,tagname;
操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间

eg:

mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1;
?? ?-> 1, 0?
mysql> SELECT 1 BETWEEN 2 AND 3;?
?? ?-> 0?
mysql> SELECT 'b' BETWEEN 'a' AND 'c';?
?? ?-> 1?
mysql> SELECT 2 BETWEEN 2 AND '3';?
?? ?-> 1?
mysql> SELECT 2 BETWEEN 2 AND 'x-3';?
?? ?-> 0

WHERE 匹配字符加‘’;且其在执行匹配时默认不区分大小写;

mysql> SELECT uid,username,state FROM manxc.user WHERE username='FLY';
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
|???3 | fly??????|?????0 |
+-----+----------+-------+

空值检查:IS NULL (空值是无值和0和空格不同)

mysql> SELECT uid,username,state FROM user WHERE password IS NULL LIMIT 3;
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
|???8 | dfdg?????|??NULL |
|???9 | dgdg?????|??NULL |
|??10 | gdg??????|??NULL |
+-----+----------+-------+

数据过滤

关键词
操作符(operator) :用来联结或改变where子句的关键字。
AND 操作符

mysql> SELECT uid,username,state FROM USER WHERE state IS NULL AND uid <= 13;
+-----+-----------+-------+
| uid | username??| state |
+-----+-----------+-------+
|???8 | dfdg??????|??NULL |
|???9 | dgdg??????|??NULL |
|??10 | gdg???????|??NULL |
|??11 | dgdgh?????|??NULL |
|??12 | dgklds????|??NULL |
|??13 | dgkljdlkg |??NULL |
+-----+-----------+-------+

OR操作符:

mysql> SELECT uid,username,state FROM USER WHERE state IS NULL OR uid <= 13;
+-----+--------------+-------+
| uid | username?????| state |
+-----+--------------+-------+
|???4 | test1????????|?????0 |
|???3 | fly??????????|?????0 |
|???5 | test2????????|?????0 |
|???6 | test3????????|?????1 |
|???7 | 1????????????|?????1 |
|???8 | dfdg?????????|??NULL |
|???9 | dgdg?????????|??NULL |
|??10 | gdg??????????|??NULL |
|??11 | dgdgh????????|??NULL |
|??12 | dgklds???????|??NULL |
|??13 | dgkljdlkg????|??NULL |
|??14 | fdjwe????????|??NULL |
|??15 | gkdlkg???????|??NULL |
|??16 | dgdlkjg??????|??NULL |
|??17 | fdglkdjg?????|??NULL |
|??18 | gkldssjgdsas |??NULL |
|??19 | dgjkljg??????|??NULL |
|??20 | djglkdg??????|??NULL |
|??21 | kgdlksgj?????|??NULL |
+-----+--------------+-------+

混合使用时的顺序:
在有多个or和and同时使用时,优先处理and,可以使用()提高优先级

mysql> SELECT uid,username,state FROM USER WHERE (state IS NULL OR state =1) AND uid <=10;
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
|???6 | test3????|?????1 |
|???7 | 1????????|?????1 |
|???8 | dfdg?????|??NULL |
|???9 | dgdg?????|??NULL |
|??10 | gdg??????|??NULL |
+-----+----------+-------+
5 rows in set (0.00 sec)


mysql> SELECT uid,username,state FROM USER WHERE state IS NULL OR state =1 AND uid <=10;
+-----+--------------+-------+
| uid | username?????| state |
+-----+--------------+-------+
|???6 | test3????????|?????1 |
|???7 | 1????????????|?????1 |
|???8 | dfdg?????????|??NULL |
|???9 | dgdg?????????|??NULL |
|??10 | gdg??????????|??NULL |
|??11 | dgdgh????????|??NULL |
|??12 | dgklds???????|??NULL |
|??13 | dgkljdlkg????|??NULL |
|??14 | fdjwe????????|??NULL |
|??15 | gkdlkg???????|??NULL |
|??16 | dgdlkjg??????|??NULL |
|??17 | fdglkdjg?????|??NULL |
|??18 | gkldssjgdsas |??NULL |
|??19 | dgjkljg??????|??NULL |
|??20 | djglkdg??????|??NULL |
|??21 | kgdlksgj?????|??NULL |
+-----+--------------+-------+
16 rows in set (0.00 sec)

建议:使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确的分组,不用过分依赖计算次序,使用括号没有坏处且能消除歧义。

IN 操作符:
where子句使用in操作符

mysql>??SELECT uid,username,state FROM user WHERE state IN (0,1);
+-----+----------+-------+
| uid | username | state |
+-----+----------+-------+
|???4 | test1????|?????0 |
|???3 | fly??????|?????0 |
|???5 | test2????|?????0 |
|???6 | test3????|?????1 |
|???7 | 1????????|?????1 |
+-----+----------+-------+
5 rows in set (0.00 sec)

INOR 有类似作用,此句表示查询state是0或1的。

IN操作符的优点:

  1. 使用IN时,计算次序更容易管理(操作符少了,没那么多or)
  2. IN操作符的语法更清楚且直观;
  3. IN一般比OR的执行更快;
  4. IN的最大优点时可以包含其它SELECT语句,使得能更动态的建立WHERE子句。

NOT操作符:
where子句中,not用来否定之后跟的条件。

mysql> select * from tags where tid NOT IN (1,2,3,4,5,6,7,8,9,10);
+-----+---------+
| tid | tagname |
+-----+---------+
|??11 | 猎奇????|
|??12 | 少女????|
|??13 | 魔法????|
|??14 | 历史????|
|??15 | 机战????|
|??16 | 神魔????|
|??17 | 运动????|
|??18 | 励志????|
|??19 | 音乐????|
|??20 | 推理????|
|??21 | 美食????|
|??22 | 催泪????|
|??23 | 职场? ? |
|??26 | 搞笑????|
+-----+---------+

注:MySQL支持使用NOTINBETWEENEXISTS子句取反。

《MySql必知必会》笔记整理

原文:https://www.cnblogs.com/flytree/p/12222784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!