什么是SQL?
Structured Query Language,结构化查询语言。定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方称之为方言。
SQL的分类:
DDL(Data Definition Language)定义(操作)数据库对象:数据库、表、列、关键字等
DML(Manipulation):增删改(insert、delete、update)
DQL(Query):查询记录(关键字:select、where)
DCL(Control):定义数据库的访问权限、授权
MySQL语句一般不区分大小写,但是为了便于区分最好区分大小写。
MySQL基本操作:退出命令:exit;或quit;或\q;
MySQL语句规范:关键字和函数名大写 数据库名、表名、字段名小写 语句以分号结尾
注释方法:
单行注释:“-- 注释内容”也就是两个减号,一个空格,之后是注释内容;或者用“#注释内容”的方式进行注释。
多行注释:/*注释内容*/的方式进行注释。
操作数据库(CRUD)
Create:创建
创建数据库: CREATE DATABASE database_name(自己定的数据库名)
创建数据库的保险做法;CREATE DATABASE IF NOT EXISTS database_name;(这个数据库不存在的情况下才能创建)
创建一个数据库,指定字符集为gbk:CREATE DATABASE db_name CHARACTER SET 字符集名称; 或者CREATE DATABASE IF NOT EXISTS db_name CHARACTER SET gbk(默认情况下字符集为utf8)
Retrieve:查询
查看已有的数据库:SHOW DATABASES;
查询某个数据库的字符集:SHOW CREATE DATABASE db_name;
Update:修改
修改数据库的字符集:ALTER DATABASE db_name CHARACTER SET 字符集名称
Delete:删除
删除数据库:DROP DATABASE database_name
判断数据库存在的情况下再删除:DROP DATABASE IF EXSITS db_name;
使用数据库
查询当前正在使用的数据库:SELECT DATABASE();
使用(调用)某一个数据库:USE database_name
查看系统所支持的引擎:SHOW ENGINES
引擎:
默认引擎:InnoDB存储引擎
其他引擎:MyISAM存储引擎 MEMORY存储引擎
存储引擎的选择需要考虑每个引擎的功能和特点:
如果要提供提交、回滚和崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是个很好的选择,如果数据表主要用来插入和查询记录,则MYISAM引擎能提供较高的处理效率,如果只是临时存放数据看,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的MEMORY引擎,MYSQL中使用该引擎作为临时表,存放查询的中间结果。如果只有insert和select操作,可以选择Archive引擎,该引擎支持高并发的插入操作,但是本身并不是事务安全的。非常适合存储归档数据,如记录日志信息
操作数据表
Create:创建
CREATE TABLE tb_name(
列名1 数据类型1,
列名2 数据类型2,
最后列名 最后的数据类型(不加逗号)
);
Retrieve:查询
查询当前选中的数据库中的所有表:SHOW TABLES
查询表结构:DESC tb_name;(describe)
查看创建表的CREATE TABLE 语句:SHOW CREATE TABLE 表名
Update:修改
列名就是字段名
修改表名:ALTER TABLE 旧表名 RENAME 新表名
修改列的数据类型:ALTER TABLE 表名 MODIFY 列名 数据类型
修改列名;ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型
修改表的字符集:ALTER TABLE tb_name CHARACTER SET 字符集名
添加列:ALTER TABLE 表名 ADD 新字段名(列名) 数据类型
修改字段的排列位置:ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST | AFTER 字段2
Delete:删除
删除列:ALTER TABLE 表名 DROP 字段名
删除表:DROP TABLE 表名
DROP TABLE IF EXISTS 表名
对表中的数据进行增删改(DML)
【1】添加数据
给所有列插入数据:INSERT INTO 表名 VALUES(num1,num2,num3…)
INSERT INTO 表名 VALUES(num1),(num2),(num3)(同一个字段的值)
对指定的列添加数据:INSERT INTO 表名 (列1,列2, 列5,……列9) VALUES(num1,num2,……,numn)
除了数字类型,其他的数据类型需要用引号。
【2】删除数据
DELETE FROM 表名 WHERE 条件;(例如,DELETE FROM table1 WHERE 列1=15;)
注意:如果不加条件,则删除表中的所有记录
删除所有记录的快捷方法是,直接删除表,然后再创建一个与之前一模一样的表,如果采用删除所有数据的方法,效率比较低。这种先删除表再创建一个相同表的方法是: TRUNCATE TABLE 表名;
【3】修改数据
UPDATE 表名 SET 列1=值1,列2=值2,……列n=值n WHERE 条件
注意:如果不加条件,则会将表中所有记录全部修改
查询表中的记录(DQL)
查看表记录:SELECT *FROM 表名(最简单的查询语句)
查询的语法:
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段
HAVING 分组之后的条件
ORDER BY 排序
LIMIT 分页限定
基础查询:
查询指定列的数据:SELECT 列1,列2……列n,FROM 表名;
查询某一列不重复的所有值:SELECT DISTINCT 列名 FROM 表名;
查询两列值之和:SELECT 列1,列2,列1+列2 FROM 表名
注意:计算中,如果有一列的数字为NULL,则计算结果也是NULL,解决办法:IFNULL 函数。
【【条件查询】】:
运算符:
大于等于>=,小于等于<=, 等于=,不等于!=或者<>,AND(&&),OR(||),NOT(!),IN,BETWEEN ……AND
在一个范围之内:字段 >=value1 AND 字段 <=value2 或者 字段 BETWEEN value1 AND value2
如果范围是不连续的,则:字段 IN (值1,值2,……值n)
注意:NULL值不能使用“=”和“!=”去判断,而应该使用IS或IS NOT去判断
比如:SELECT *FROM table1 WHERE age IS NULL;
【模糊查询】:
用到的占位符:
“_”:单个任意字符
“%”:多个任意字符
LIKE模糊查询实例:
查找找到名字的姓氏为李的人:SELECT *FROM 表名 WHERE 字段 LIKE ‘李%’
查找找到名字的第二个字为玉的人:SELECT *FROM 表名 WHERE name LIKE ‘玉%’
查找姓名是三个字的人:SELECT *FROM 表名 WHERE name LIKE ’ _ _’
查找姓名中包含某个字的人:SELECT *FROM 表名 WHERE name LIKE ‘%马%’
排序、分组、分页查询
【排序查询】:
SELECT *FROM tb_name ORDER by 排序字段1 排序方式1(升序: math ASC\降序DESC),排序字段2 排序方式2 默认情况下是升序
例如:SELECT *FROM 表名 ORDER by age ASC
如果排序查询语句中有两个或多字排序字段,首先按照第一排序方式排列,如果根据第一字段排序的结果有两个并列,则按照第二字段排序,也就是说只有当第一条件相同时,才会用第二排序
【分组查询】:关键字:GROUP BY 分组字段
分组之后查询的字段必须是分组字段或者聚合函数,如果是其他字段,没有任何意义。
【分页查询】:
聚合函数
聚合函数是将一列数据作为整体,进行纵向的计算,主要包括以下函数:
注意:聚合函数的计算,排除了非空值
count:计算个数----:
SELECT COUNT(列名) FROM 表名----(统计一列中不为空的个数)
SELECT COUNT(IFNULL(列名,0)) FROM 表名----(如果某一列中存在NULL值,就将其更换为0,然后统计个数,可以避免NULL值的干扰)
SELECT COUNT(*) FROM 表名----(只要某一行中有一个不是NULL,那么就可以算一条记录)
max:计算最大值
SELECT MAX(列名 ) FROM 表名
min:计算最小值
SELECT MIN(列名 ) FROM 表名
sum:求和
SELECT SUM(列名 ) FROM 表名
avg:求平均
SELECT AVG(列名 ) FROM 表名
查看错误原因:SHOW WARNINGS
数据类型:
注意,其中VARCHAR要在后面加括号指定最大长度。
DOUBLE要在面的括号中指定(数据长度,小数点位数)
数值数据类型:整数TINYNIT\SAMLLINT\INT\BIGINT、浮点小数FLOAT\DOUBLE、定点小数DECIMAL
在创建表时字段的数据类型括号中的数字代表该数据类型指定的显示宽度,指定能够显示的数值中数字的个数
日期\时间类型:YEAR\TIME\DATE\DATETIME\TIMESTRAMP
YEAR:
INSERT INTO table VALUES(2010),(‘2010’),(‘0’),(‘00’),(‘99’),(‘10’),(99),(0),(11)
对应的是2010,2010,2000,2000,1999,2010,1999,0000,2011,
TIME:
INSERT INTO table VALUES(‘10:05:59’),(‘23:23’),(‘2 10:10’),(3 02),(‘10’)
对应的是:10:05:05,23:23:00,58:10:00,74:00:00,00:00:10
DATE:
INSERT INTO table VALUES(‘YYYY-MM-DD’),(‘YYYYMMDD’),(‘YY-MM-DD’),(YY-MM-DD),(YY-MM-DD),(YYMMDD)
DATETIME(同时包含日期和时间):
INSERT INTO table VALUES(‘YYYY-MM-DD HH:MM:SS’),(‘YYYYMMDDHHMMSS’),(‘YYMMDDHHMMSS’),(YYMMDDYYMMSS)
向表中插入系统当前日期:INSERT INTO 表名 VALUES(CURRENT_DATE()),(NOW());
NOW()函数返回系统当前的日期和时间值。
修改日期的区(默认为东8区),这里以修改到东10区为例:set time_zone=’+10:00’;(可以大写也可以小写,但是下划线不能忘记)
字符串类型:CHAR\VARCHAR\TEXT\SET\BINARY\BLOB等,主要分为文本字符串和二进制字符串
1、CHAR和VARCHAR
CHAR(M)为固定长度字符串,M表示列宽,范围是0-255,VARCHAR(M) 为长度可变字符串,M表示最大列长度,范围是0-65535
输入字符:INSERT INTO 表名 VALUES(’ string1 ‘,‘string2’),(‘string3’);
显示表中数据:SELECT concat(’(’,字段名1,’)’),concat(’(’,字段名2,’)’) FROM 表名;(左图)||||或者SELECT *FROM 表名;(右图)
从下图可知,CHAR类型的输入的空格删除了,儿VARCHAR 类型的没有删除。
2 TEXT类型
TINYTEXT\ TEXT\ MEDIUMTEXT\ LONGTEXT
3 ENUM类型
字符串对象,按照索引顺序排列
注意,MySQL的变量或者表、数据库的名字不可以是关键字,MySQL中的关键字有个博主总结的比较全面
check the manual that corresponds to your MySQL server version for the right syntax错误
hello__word__