数据库基础
关键词:数据库
表
(表名唯一,取决多个因素,如不同数据库的表可以同名)模式
(关于数据库和表的布局及特性的信息)列
(表中的字段)行
[行(raw)和记录(record)很大程度可以等同,但行才是正确的术语]数据类型
(限制数据种类,帮助正确排序,磁盘优化方面的作用)主键
(primary key): 一列,其值可以唯一区分表中的行。SQL
[(Structured Query Language):结构化查询语言。]
主键条件:
- 每行都应有一个主键,所以其值不为null。
- 任意两行间的主键值不同。
主键通常是一列,但也可多列共同构成主键。
主键设置建议:
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值。
SQL命令执行:
- 命令在
mysql>
之后输入; - 命令用
;
或\g
结束,仅按Enter
不执行命令; - 输入
help
或\h
获取帮助; - 输入
quit
或exit
退出程序。
基本语句:
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)
IN
和 OR
有类似作用,此句表示查询state是0或1的。
IN操作符的优点:
- 使用IN时,计算次序更容易管理(操作符少了,没那么多or)
- IN操作符的语法更清楚且直观;
- IN一般比OR的执行更快;
- 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支持使用NOT
对IN
,BETWEEN
,EXISTS
子句取反。
来源:https://www.cnblogs.com/flytree/p/12222784.html