前言
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
mysql的特点
1 | mysql> select workPicPath from smbms_user where workPicPath ='123 ' and 123='123a'; |
数据库基本信息
1 | SELECT user, host FROM mysql.user; --用户信息查询 |
MySQL数据库管理语法
数据库的连接
使用 PHP 脚本连接 MySQL服务
mysqli_connect(host, username, password, dbname,port, socket);
断开与MySQL数据库的链接
mysqli_close ( connection )
提示:通常不需要使用 mysqli_close(),因为已打开的非持久连接会在脚本执行完毕后自动关闭。
数据定义
创建,删除数据库(结果以query而定)
mysqli_query(connection,query,resultmode);
‘DROP DATABASE RUNOOB’
‘CREATE DATABASE RUNOOB’
也可以使用mysqli_multi_query(connection,query)执行一条或多条sql语句,然后将结果全部输出。
选择MySQL数据库
mysqli_select_db(connection,dbname);
创建,删除数据表
mysqli_query(connection,query,resultmode);
1 | CREATE TABLE <表名>( |
数据类型
约束条件
查看列:desc 表名;
或describe 表名
删除表: DROP TABLE <表名>[RESTRICT| CASCADE];
RESTRICT:删除表是有限制的。
欲删除的基本表不能被其他表的约束所引用(如视图等)
如果存在依赖该表的对象,则此表不能被删除
CASCADE:删除该表没有限制。
在删除基本表的同时,相关的依赖对象一起删除
添加,修改,删除表名,列名
1 | ALTER TABLE <表名> |
数据操纵
insert into 插入数据
1 | INSERT |
如果常量是数字型可以不加引号,如果数据是字符型,必须使用单引号或者双引号
INSERT 插入多条数据
INSERT INTO table_name (field1, field2,...fieldN) VALUES (valueA1,valueA2,...valueAN),(valueB1,valueB2,...valueBN),(valueC1,valueC2,...valueCN)......;
如果所有的列都要添加数据可以不规定列进行添加数据
insert 还可以还select配套使用
1 | INSERT |
REPLACE INTO
REPLACE INTO在执行插入操作时,如果发现某个行与表格中已有的行具有相同的主键或唯一性字段,则会删除原有的行,并插入新记录。这种情况下不会报“重复键”错误,因为它相当于先执行了一条 DELETE 再执行 INSERT。
1 | REPLACE INTO `score` (`username`,`listen`,`read`,`write`) |
Update set 修改数据
1 | UPDATE <表名> |
1 | select username,listen,`read`,`write` from `score`; |
DELETE 删除 数据
1 | DELETE FROM <表名> |
删除数据 :delete from students where id=3;
select 查询语法
1 | SELECT [ALL|DISTINCT] |
在php中的使用
mysqli_fetch_array(result,resulttype); 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。
result 必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。
resulttype 可选。规定应该产生哪种类型的数组。可以是以下值中的一个:
MYSQLI_ASSOC
MYSQLI_NUM
MYSQLI_BOTH
select简单的查询
1 | SELECT DISTINCT Sno FROM SC; |
如果没有指定DISTINCT关键词,则缺省为ALL,关键词DISTINCT可以去掉表中重复的行
聚集函数
as起别名
为数据表和字段起别名
- “SELECT 字段名 AS 别名 FROM 数据表;”,可为字段指定别名;
- “SELECT 字段名 FROM 数据表 AS 别名;”,可为表指定别名。
通过as构建视图
1 | select REPLACE(username,'火',' - ') as username,listen,`read`,`write` from `score`; |
有条件有限制的查询和输出
where子句
常用的查询条件
嵌套查询常用的比较运算符
LIKE 语法
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
如WHERE Sname LIKE '欧阳_';
like 匹配/模糊匹配,会与 % 和 _ 结合使用。
1 | (1)'_'表示任意单个字符 |
A(表名) rlike B (表达式) ,表示A里边只要含有B即可,B中一般放正则表达式。
regexp 正则
regexp与其用法相似,即A(表名) regexp B (表达式)。
SELECT name FROM person_tbl WHERE name REGEXP ' '
多重条件查询
逻辑运算符:
and用 && 代替
or用 || 代替
xor用 | 代替
not用 ! 代替
AND和 OR来联结多个查询条件
优先级: NOT>AND>OR
可以用括号改变优先级
EXISTS
1 | SELECT Sname |
ORDER BY子句
MySQL ORDER BY 子句排序ORDER BY 关键字
用于对结果集按照一个列或者多个列进行排序。ORDER BY 关键字
默认按照升序[ASC]
对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC
关键字
也可以使用ORDER BY n
以“第n个字段”排序
group by 子句
SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING aggregate_function(column_name) operator value ORDER BY column1, column2
group by一般和聚合函数一起使用才有意义
select deptno,sum(sal) from emp group by deptno;#按照deptno字段分组后再求和
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选 组合后的各组数据。执行顺序
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by组和,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集
如果没有groupby的select语句执行结果只有一条,分组后的执行结果可以是多个LIMIT
数据库应用常见功能之一就是分页,尤其是当数据量很大的时候,应用性能的高低,一定程度上和分页逻辑的效率紧密相关
1
2
3
4
5select* from test LIMIT 3 (提取前三条数据)
如: select * from test limit 2,1; (从第二行的下取一行,即取:第3行数据)
select * from test LIMIT 3 offset 2;(第二行的下一行开始向下取3条数据,即取:3,4,5行的三条数据)
集合查询
并操作UNION
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中(联合查询,必须保证字段数一致)多个 SELECT 语句会删除重复的数据
union all则只是简单地将两个结果集合并后就返回结果。因此,如果返回的两个结果集中有重复的数据,那么返回的结果就会包含重复的数据
1 | SELECT * |
交操作INTERSECT
差操作EXCEPT
join连接查询结果
1 | SELECT column_name(s) |
MYSQL 常用函数
聚合函数
聚合函数的操作对象是列,一般只用输入单个指定的字段名即可,可以与group by 配合使用
1 | 计数 |
字符函数
LEN() - 返回某个文本字段的长度
ASCII(s)- 返回字符串s的第一个字符或字符s的 ASCII 码
left(a,b)- 指从左侧读取a的前b位
right(a,b)- 指从右侧读取a的前b位
substr(string,start,length) - 字符串截取
substr(string from start for length)
substring()、mid() 函数与substring()函数功能类似
replace(string,search,replace)把object对象中出现的的search全部替换成replace
greatest(n1,n2,n3.....)返回输入参数的最大值;
least(n1,n2,n3....)返回输入参数的最小值
- 字符串多参数函数
#CONCAT(s1,s2…sn) 字符串 s1,s2 等多个字符串合并为一个字符串(横向)
CONCAT_WS() 使用指定的字符将目标字符串进行拼接
数字函数
CEIL() 进一(向上)取整
FLOOR() 舍一(向下)取整
EXP(x)- 返回 e 的 x 次方计算
LN(x) 返回数字的自然对数,以 e 为底
FLOOR(x)- 返回小于或等于 x 的最大整数
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
RAND() 返回 0 到 1 的随机数
FORMA(X,D) 将数字格式化为带有千位分隔符、小数点和指定位数的字符串
ABS() 绝对值计算
时间函数
NOW() - 返回当前的系统日期和时间
CURDATE() 则单独返回当前日
流程控制函数
IF(expr,v1,v2)- 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2
IFNULL(a,b) 如果a不为null返回a,否则返回b;
benchmark(重复次数, 执行的函数) 用于测试函数或者表达式的执行速度。其运行返回值都是0,在表外显示时间。测试函数的
CASE WHEN a then b else c end 判断如果a为真返回b,为假返回c
SQL 功能性函数
1 | sleep()- 休眠几秒 |
mysql中的其他查询语法
handler(句柄)
handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
1 | # 打开一个表名为 tbl_name 的表的句柄 |
MySQL其他扩展语法
Mysql自带的预编译
第一步:
set @a=concat(‘sel’,’ect * from ?;’);在SQL中,‘@’通常用于表示变量。具体而言,‘@’后面跟着一个字符串,这个字符串就是一个变量名。
将命令concat(‘sel’,’ect * from ?;’)赋给变量@a
这里的命令即是连接sql语句,形成查表语句。
第二步:
prepare stmt from @@a
编译命令,将命令编译后命名为新的可执行文件stmt
第三步:
set @tablename=’table_a’;
EXECUTE stmt using @tablename;
运行可执行文件stmt
select into outfile 文件写入
可以使用select @@secure_file_priv
查看用户是否有权限
在MySQL中,‘@@’表示系统变量。
SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据。但是这种方法只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。
1 | select * from Table into outfile '/路径/文件名' |
路径目录必须有读写权限
LOAD DATA INFILE语法
语法主要是用于读取一个文件的内容并且放到一个表中,文件可以是客户端也可以是服务端的
1 | load data infile "/data/data.csv" into table TestTable; --+和load_file类似 |
mysql中的特殊库
information_schema简介
sys库
mysql5.7增加sys系统数据库,这个库是通过视图的形式把information_schema和performance_schema结合起来