数据库(DataBase:DB):数据库是是按照数据结构来组织、存储和管理数据的仓库。
1.在MySQL数据库中,SQL语句大小写不敏感
2.SQL语句可单行或多行书写
3.在SQL语句中,关键字不能跨多行或缩写
4.为了提高可读性,一般关键字大写,其他小写
5.空格和缩进使程序易读
第一范式:1NF 原子性,列或者字段不能再分,要求属性具有原子性,不可再分解;
第二范式:2NF 唯一性,一张表只说一件事,是对记录的惟一性约束,要求记录有惟一标识,
第三范式:3NF 直接性,数据不能存在传递关系,即每个属性都跟主键有直接关系,而不是间接关系。
我们说MySQL是一种关系型数据库。关系数据库最重要的概念就是表。
表具有固定的列数和任意的行数,在数学上称为“关系”。
表和类的关系
表-------->类
行记录--->对象
字段------>属性
整数类型:tinyint, smallint, mediumint, int, bigint
小数类型:float, double, decimal
字符类型:char, varchar, tinytext, text, mediumtext, longtext
日期时间类型:date, datetime, timestamp, time, year
二进制类型:bit, binary, varbinary, tinyblob, blob, mediumblob, longblob
CREATE TABLE 表名(
列名1 列的类型 [约束],
列名2 列的类型 [约束],
....
列名N 列的类型 约束
);
注意:最后一行没有逗号
表的约束
1.非空约束:NOT NULL(NK)
2.列默认值:DEFAULT
3.唯一约束:UNIQUE(UK)
4.主键约束:PRIMARY KEY(PK)
5.自增约束:AUTO_INCREMENT
6.外键约束:FOREIGN KEY(FK)
查看表结构:DESC table_name;
查看表的详细定义:SHOW CREATE TABLE table_name;
DROP TABLE table_name;
简单查询:
1.简单数据查询:
SELECT {*, column [alias],...} FROM table_name;
2.避免重复查询-DISTINCT:
SELECT DISTINCT 列名,... FROM table_name;
3.实现数学运算查询:
对NUMBER型数据可以使用算数操作符创建表达式(+ - * /)
对DATE型数据可以使用部分算数操作符创建表达式 (+ -)
运算符优先级:
乘法和除法的优先级高于加法和减法
同级运算的顺序是从左到右
表达式中使用"括号"可强行改变优先级的运算顺序
4.设置列名的别名
改变列的标题头;
用于表示计算结果的含义;
作为列的别名;
如果别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都需加单引号;
过滤查询:
1.比较运算符:
= 等于
> 大于
>= 大于或等于
< 小于
<= 小于或等于
!=(<>) 不等于
2.逻辑运算符:
AND(&&) 如果组合的条件都是TRUE,返回TRUE
OR(||) 如果组合的条件之一是TRUE,返回TRUE
NOT(!) 如果下面的条件是FALSE,返回TRUE`
3.范围查询-BETWEEN AND
使用BETWEEN运算符显示某一值域范围的记录,这个操作符最常见的使用在数字类型数据的范围上,但对于字符类型数据和日期类型数据同样可用。
4.集合查询-IN
使用IN运算符,判断列的值是否在指定的集合中。
格式: WHERE 列名 IN (值1,值2....);
5.控制查询-IS NULL
IS NULL:判断列的值是否为空。
格式:WHERE 列名 IS NULL;
6.模糊查询
使用LIKE运算符执行通配查询,查询条件可包含文字字符或数字:
%通配符:可表示零或多个字符。
_通配符:可表示一个字符。
通配符:用来实现匹配部分值得特殊字符。
结果排序:
1.排序语法和规则
使用ORDER BY子句将记录排序
ASC : 升序,缺省。
DESC: 降序。
ORDER BY 子句出现在SELECT语句的最后。
格式:
SELECT <selectList>
FROM table_name
WHERE 条件
ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC]...;
分页查询:
MySQL分页查询:
------------------------------------------------
语法:
SELECT column1, column2...
FROM table_name
[WHERE condition]
LIMIT beginIndex,pageSize;
beginIndex:是开始索引(从0开始):第一条记录:0,第二条记录:1
pageSize:每页显示多少条数据
beginIndex = (当前页数 - 1) * pageSize
---------------------------------
每页最多3条记录: pageSize = 3:
------------------------------------------
第一页: SELECT * FROM product
LIMIT 0, 3 : 0,1,2
第二页: SELECT * FROM product
LIMIT 3, 3 : 3,4,5
第三页: SELECT * FROM product
LIMIT 6, 3 : 6,7,8
第四页: SELECT * FROM product
LIMIT 9, 3
第七页: SELECT * FROM product
LIMIT 18,3 : 18,19,20
第N页: SELECT * FROM product
LIMIT beginIndex,3
聚合函数:
结果总个数:COUNT
最大值:MAX
最小值:MIN
求和:SUM
求平均数:AVG
1.笛卡尔积
没有连接条件的表关系返回的结果。
多表查询会产生笛卡尔积:
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
2.外键约束
主键约束(PRIMARY KEY): 约束在当前表中,指定列的值非空且唯一.
外键约束(FOREIGN KEY): A表中的外键列. A表中的外键列的值必须参照于B表中的某一列(B表主键).
3.内连接查询
内连接查询:是相对于外连接。
内连接分为:隐式内连接、显示内连接,其查询效果相同。
-----------------------------------------------
隐式内连接:
SELECT <selectList>
FROM A ,B WHERE A.列 = B.列
-----------------------------------------------
显示内连接(推荐写法):
SELECT <selectList>
FROM A [INNER] JOIN B ON A.列 = B.列
4.外连接查询
外连接查询:
左外连接:查询出JOIN左边表的全部数据查询出来,JOIN右边的表不匹配的数据使用NULL来填充数据.
右外连接:查询出JOIN右边表的全部数据查询出来,JOIN左边的表不匹配的数据使用NULL来填充数据.
----------------------------
语法格式
SELECT <selectList>
FROM A LEFT/RIGHT OUTER JOIN B
ON (A.column_name = B.column_name)];
左连接:
SELECT * FROM product p LEFT JOIN productdir pd ON p.dir_id = pd.id
右连接:
SELECT * FROM product p RIGHT JOIN productdir pd ON p.dir_id = pd.id
左外连接:
右外连接:
插入语句:一次插入操作只插入一行.
INSERT INTO table_name (column1,column2,column3...)
VALUES (value1,value2,value3...);
-------------------------------------------
1.插入完整数据记录
2.插入数据记录一部分
3.插入多条数据记录(MySQL特有)
INSERT INTO table_name (column1,column2,column3...)
VALUES (value1,value2,value3...),
(value1,value2,value3...),
(value1,value2,value3...)..;
4.插入查询结果
INSERT INTO table_name (column1,column2,column3...)
SELECT (column1,column2,column3...)
FROM table_name
INSERT INTO productdir (dirName,parent_id)
SELECT dirName,parent_id FROM productdir
UPDATE table_name
SET columnName = value [columnName = value] …
WHERE condition;
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
DELETE FROM tablename
WHERE condition;
如果省略了where子句,则全表的数据都会被修改
补充:
truncate table (DDL)表名:把表删除 然后重新创建 ,不写服务器日志,无法恢复,效率高
delete from:逐条删除数据,可以回滚(事务)会写服务器日志,效率低
truncate不扫描表,相当于重新创建了表,只保留了表的结构,然后删除掉原有表,效率非常高。
delete会扫描全表,根据where语句做判断,因此效率低。