MySQL基础

Posted yyyzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础相关的知识,希望对你有一定的参考价值。

mysql简介

概念

数据库(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语句做判断,因此效率低。

以上是关于MySQL基础的主要内容,如果未能解决你的问题,请参考以下文章

linux中怎么查看mysql数据库版本

从mysql的片段中加载ListView

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段