MySQL数据库基础第四天

MySQL中的运算符

MySQL中常用的运算符:
算数运算符

符号表达式作用
+X1+X2加法
-X1-X2减法
*X1*X2乘法
/X1/X2除法
DIVX1 DIV X2除法
%X1%X2取余
MODMOD(X1,X2)取余
mysql> SELECT 1+1,1-1,2*4,3/8;
+-----+-----+-----+--------+
| 1+1 | 1-1 | 2*4 | 3/8    |
+-----+-----+-----+--------+
|   2 |   0 |   8 | 0.3750 |
+-----+-----+-----+--------+
1 row in set (0.06 sec)

也支持数据类型转换

mysql> SELECT 1 +'3MAZI';
+------------+
| 1 +'3MAZI' |
+------------+
|          4 |
+------------+
1 row in set, 1 warning (0.05 sec)
mysql> SELECT 3/0;
+------+
| 3/0  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

mysql> SELECT 1+null;
+--------+
| 1+null |
+--------+
|   NULL |
+--------+
1 row in set (0.05 sec)

比较运算符

符号形式作用
=X1=X2判断是否相等
<>或!=X1<>X2 或X1 != X2判断是否不相等
<=>X1<=>X2判断是否不相等,可以判断是否等于NULL
>、>=X1>X2、X1>=X2判断是否大于等于
<、<=X1<X2、X1<=X2判断是否小于等于
IS NULL或IS NOT NULLX1 IS NULL X1 IS NOT NULL判断是否等于NULL
BETWEEN AND或NOT BETWEENX1 BETWEEN m AND n判断是否在范围内
IN 或NOT INX1 IN (值1,…)判断是否在某个固定范围内
LIKE 或 NOT LIKEX1 LIKE 表达式判断是否匹配
REGEXPX1 REGEXP 正则判断是否正则匹配
mysql> SELECT 1=1,1='1',1=2;
+-----+-------+-----+
| 1=1 | 1='1' | 1=2 |
+-----+-------+-----+
|   1 |     1 |   0 |
+-----+-------+-----+
1 row in set (0.00 sec)
SELECT id,username,age,age BETWEEN 10 AND 30 FROM cms_user;
mysql> SELECT 1 IN (1,2,3);
+--------------+
| 1 IN (1,2,3) |
+--------------+
|            1 |
+--------------+
1 row in set (0.05 sec)
mysql> SELECT 'S' LIKE '_';
+--------------+
| 'S' LIKE '_' |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

逻辑运算符

符号形式作用
&& 或者 AND并且
|| 或者 OR或者
! 或者 NOT取反
XOR异或不同为真

与null运算都是null

mysql> SELECT 2&&2,2&&0,2&&NULL,1||1,1||0,1||NULL,0||NULL;
+------+------+---------+------+------+---------+---------+
| 2&&2 | 2&&0 | 2&&NULL | 1||1 | 1||0 | 1||NULL | 0||NULL |
+------+------+---------+------+------+---------+---------+
|    1 |    0 |    NULL |    1 |    1 |       1 |    NULL |
+------+------+---------+------+------+---------+---------+
1 row in set, 7 warnings (0.05 sec)

mysql> SELECT !1,!0,!NULL;
+----+----+-------+
| !1 | !0 | !NULL |
+----+----+-------+
|  0 |  1 |  NULL |
+----+----+-------+
1 row in set, 3 warnings (0.03 sec)

运算符的优先级:

优先级运算符优先级运算符
1!8|
2~9=,<=>,<,<=,>,>=,!=,<>,IN,IN NULL,LIKE,REGEXP
3^10BETWEEN AND,CASE,WHEN,THEN,ELSE
4*,/,DIV,%,MOD11NOT
5+,-12&&,AND
6>>,<<13||,OR,XOR
7&14;=

括号可以改变运算符优先级

数据函数库

数据函数:

名称描述
CEIL()进一取整
FLOOR()舍一取整
MOD()取余数(取模)
POWER()幂运算
ROUND()四舍五入,可以加如第二个参数,表式保留小数点后几位
TRUNCATE()数字截取,可以加如第二个参数,表示保留小数点后几位
ABS()取绝对值
PI()圆周率
RAND()和RAND(X)返回0~1之间的随机数,RAND(X)返回固定随机数
SIGN()返回X的符号,X为负数:-1,0返回0,整数:1
EXP()计算e的几次方
SELECT * FROM cms.cms_user ORDER BY RAND();

字符串函数库

函数名称描述
CHAR_LENGTH(S)返回字符串的字符数
LENGTH返回字符串的长度
CONCAT(S1,S2…)将字符串合并为一个字符串
CONCAT_WS(X,S1,S2…)以指定分隔符连接字符串
UPPER(S)/UCASE(S)将字符串转换为大写
LOWER(S)/LCASE(S)将字符串转换为小写
LEFT(S,N)/RIGHT(S,N)返回字符串的前/后n个字符
LPAD(S1,LEN,S2)/RPAD(S1,LEN,S2)将字符串S1用S2填充给到指定的LEN
LTRIM(S)/RTRIM(S)/TRIM(S)去掉字符串中的空格
TRIM(S1 FROM S)去掉字符串s中开始处和结尾处的字符串s1
REPEAT(S,N)重复字符串指定次数
SPACE(N)返回N个空格
REPLACE(S,S1,S2)将字符串s中搜索s1,替换成s2
STRCMP(S1,S2)比较字符串,>=<分别返回1,0,-1
SUBSTRING(S,N,LEN)截取字符串
REVERSE(S)反转字符串
ELT(N,S1,S2…)返回指定位置的字符串
mysql> SELECT CHAR_LENGTH('MAIZI'),LENGTH('MAIZI');
+----------------------+-----------------+
| CHAR_LENGTH('MAIZI') | LENGTH('MAIZI') |
+----------------------+-----------------+
|                    5 |               5 |
+----------------------+-----------------+
1 row in set (0.05 sec)

mysql> SELECT CHAR_LENGTH('啊'),LENGTH('啊');
+--------------------+---------------+
| CHAR_LENGTH('啊')  | LENGTH('啊')  |
+--------------------+---------------+
|                  1 |             3 |
+--------------------+---------------+
1 row in set (0.00 sec)

以null来连接就是null

mysql> SELECT CONCAT('A','B',NULL);
+----------------------+
| CONCAT('A','B',NULL) |
+----------------------+
| NULL                 |
+----------------------+
1 row in set (0.05 sec)

mysql> SELECT CONCAT_WS(NULL,'A','B');
+-------------------------+
| CONCAT_WS(NULL,'A','B') |
+-------------------------+
| NULL                    |
+-------------------------+
1 row in set (0.00 sec)

NULL也相当于一个空字符串

mysql> SELECT CONCAT_WS('-','A','B',NULL);
+-----------------------------+
| CONCAT_WS('-','A','B',NULL) |
+-----------------------------+
| A-B                         |
+-----------------------------+
1 row in set (0.00 sec)

REPALCE如果没找到的话,会返回原字符串

mysql> SELECT REPLACE('ABCBCA','A','-');
+---------------------------+
| REPLACE('ABCBCA','A','-') |
+---------------------------+
| -BCBC-                    |
+---------------------------+
1 row in set (0.05 sec)

mysql> SELECT REPLACE('ABCBCA','a','-');
+---------------------------+
| REPLACE('ABCBCA','a','-') |
+---------------------------+
| ABCBCA                    |
+---------------------------+
1 row in set (0.00 sec)

STRCMP比较的是比较ANSCII码
字符串的下标是从1开始的

--从2的位置截取2个字符
mysql> SELECT SUBSTRING('ABCDEF',2,2);
+-------------------------+
| SUBSTRING('ABCDEF',2,2) |
+-------------------------+
| BC                      |
+-------------------------+
1 row in set (0.05 sec)

返回指定位置的字符或者字符串

mysql> SELECT ELT(2,'A','B','C');
+--------------------+
| ELT(2,'A','B','C') |
+--------------------+
| B                  |
+--------------------+
1 row in set (0.05 sec)

日期和时间函数

名称描述
CURDATE(),CURRENT_DATE()返回当前日期
CURTIME,CURRENT_TIME()但会当前时间
NOW()返回当前日期和时间
MONTH(D)返回日期中月份的值
MONTHNAME(D)返回日期中月份名称,返回January
DAYNAME(D)返回日期是几,Monday
DAYOFWEEK(D)返回一周内的第几天,1代表周日
WEEKDAY(D)返回日期是星期几,0代表星期一
WEEK(D)一年中的第多少个星期
YEAR(D)返回年分值
HOUR(D)返回小时值
MINUTE(D)返回分钟值
SECOND(D)返回秒数
DATEDIFF(D1,D2)计算两个日期之间相隔的天数
mysql> SELECT CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2020-02-07 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 18:45:01  |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT MONTH(NOW());
+--------------+
| MONTH(NOW()) |
+--------------+
|            2 |
+--------------+
1 row in set (0.05 sec)

mysql> SELECT MONTHNAME(NOW());
+------------------+
| MONTHNAME(NOW()) |
+------------------+
| February         |
+------------------+
1 row in set (0.05 sec)

mysql> SELECT DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| Friday         |
+----------------+
1 row in set (0.05 sec)

mysql> SELECT DAYOFWEEK(NOW());
+------------------+
| DAYOFWEEK(NOW()) |
+------------------+
|                6 |
+------------------+
1 row in set (0.05 sec)

mysql> SELECT WEEKDAY(NOW());
+----------------+
| WEEKDAY(NOW()) |
+----------------+
|              4 |
+----------------+
1 row in set (0.05 sec)

条件判断函数和系统函数

判断函数如下:

名称描述
IF(EXPR,V1,V2)如果表达式EXPR成立,返回结果V1,否则V2
IFNULL(V1,V2)如果V1的不为空,就显示V1的值;否则V2
CASE WHEN exp1 THEN v1[WHEN exp2 THEN v2][ELSE vn] ENDCASE表示函数开始,END表示函数结束。如果表达式exp1成立时,返回v1。如果表达还是exp2成立时,返回v2的值。依此类推,最后遇到ELSE时,返回vn的值

系统函数:

名称描述
VERSION()返回数据库版本号
CONNECTION_ID()返回服务器连接数
DATABASE(),SCHEMA()返回当前数据库名
USER(),SYSTEM_USER()返回当前用户
CURRENT_USER(),CURRENT_USER返回当前用户,第二种时常量形式
CHARSET(STR)返回字符串STR的字符集
COLLATION(STR)返回字符串STR的校验字符集
LAST_INSERT_ID()返回最近生成的AUTO_INCREMENT

其他函数

加密函数:

名称描述
MD5(str)信息摘要算法,返回32长度字符串
PASSWORD(str)密码算法,最新版已经移除这个函数
ENCODE(str,pwd_str)加密结果时以二进制数,必须使用BLOB类型字段保存
DECODE(crypt_STR,pwd_str)对通过ENCODE加密之后的内容解密
mysql> SELECT MD5('ADMIN');
+----------------------------------+
| MD5('ADMIN')                     |
+----------------------------------+
| 73acd9a5972130b75066c82595a1fae3 |
+----------------------------------+
1 row in set (0.05 sec)

mysql> SELECT LENGTH(MD5('ADMIN'));
+----------------------+
| LENGTH(MD5('ADMIN')) |
+----------------------+
|                   32 |
+----------------------+
1 row in set (0.00 sec)

MySQL的密码都会通过PASSWORD加密。

名称描述
FORMAT(X,N)将数字x进行格式话,将x保留到小数点后n位
ASCII(S)返回字符串s的第一个字符的ASCII码
BIN(X)返回x的二进制编码
HEX(X)返回x的十六进制编码
OCY(X)返回x的八进制编码
CONV(X,F1,F2)将x从f1进制变成f2进制
INET_AION(IP)将IP地址转换位数字
INET_NOTA(N)将数字转换成IP地址
GET_LOCT(NAME,TIME)定义锁
RELEASE_LOCK(NAME)解锁
mysql> SELECT FORMAT(3.14567,2);
+-------------------+
| FORMAT(3.14567,2) |
+-------------------+
| 3.15              |
+-------------------+
1 row in set (0.05 sec)

mysql> SELECT ASCII('ABC');
+--------------+
| ASCII('ABC') |
+--------------+
|           65 |
+--------------+
1 row in set (0.05 sec)

mysql> SELECT CONV(5,10,2);
+--------------+
| CONV(5,10,2) |
+--------------+
| 101          |
+--------------+
1 row in set (0.05 sec)

mysql> SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
|             2130706433 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT INET_NTOA(2130706433);
+-----------------------+
| INET_NTOA(2130706433) |
+-----------------------+
| 127.0.0.1             |
+-----------------------+
1 row in set (0.00 sec)

索引的使用

索引有数据中一列或多列组合而成,起作用是提高对表中数据的查询速度,索引的优点是可以提高检索数据的速度,索引的缺点是创建和维护索引需要耗费时间。
因此索引会提高查询速度,减慢写入速度。

索引的分类:

  • 普通索引:相当于建立一个书签
  • 唯一索引:primary key和unique key都是,唯一索引不允许重复 使用UNIQUE
  • 全文索引:只能创建在字符型字段上,内容是英文的才能用到,使用FULLTEXT
  • 单列索引:创建在一个字段上
  • 多列索引:多个字段上创建索引
  • 空间索引:空间索引利用SPATAL

创建索引

CREATE TABLE tbl_name(
字段名称 字段类型 [完整性约束条件],
...,
[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [索引名称](字段名称[(长度)][ASC|DESC])
);

什么都不加,只有KEY或者INDEX就是普通索引

CREATE TABLE test4(
id TINYINT UNSIGNED,
username VARCHAR(20),
INDEX in_id(id),
KEY in_username(username)
);

id、username 、card都是索引,主键索引也是特殊的唯一索引。

CREATE TABLE test5(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
--UNIQUE后面可以省略KEY
username VARCHAR(20) NOT NULL UNIQUE,
card CHAR(18) NOT NULL,
UNIQUE KEY uni_card(card)
);
CREATE TABLE test6(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULl UNIQUE,
userDesc VARCHAR(20) NOT NULL,
FULLTEXT INDEX full_userDesc(userDesc)
);

可以通过以下语句查看表内容。

SHOW CREATE TABLE tbl_name;

创建单列索引:

CREATE TABLE test7(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
INDEX in_test1(test1)
);

创建多列索引:

CREATE TABLE test7(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test1 VARCHAR(20) NOT NULL,
test2 VARCHAR(20) NOT NULL,
INDEX in_test1_test2(test1,test2)
);

多列索引只能验证第一个字段才能查看是否多列索引。
创建空间索引,空间索引必须是MyISAM:

CREATE TABLE test10(
id TINYINT UNSIGNED AUTO_INCREMENT KEY,
test GEOMETRY NOT NULL,
SPATIAL INDEX spa_test(test)
)ENGINE=MyISAM;

在已经存在表上创建索引

CREATE [UNIQUE|FULLTEXT|SPATAL] INDEX 索引名 ON 表名 {字段名称[(长度)][ASC|DESC]};

ALTER TABLE tbl_nameADD [UNIQUE|FULLTEXT|SPATAL] INDEX 索引名称(字段名称[(长度)][ASC|DESC]);

创建一个普通索引:

--第一种方法
CREATE INDEX in_id ON test4(id);
--第二种方法
ALTER TABLE test4 ADD INDEX in_username(username);

其他索引于此类似。

可以通过下列语句删除索引:

DROP INDEX 索引名称 ON tbl_name;
ALTER TABLE tbl_name DROP INDEX 索引名称

管理工具简单介绍:

phpMyAdmin是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库
SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界地任何角落通过网络来远程维护数据库。
其特点是基于C++和MySQLAPI编程、方便快捷地数据库同步与数据库结构同步工具、易用地数据库、数据表备份与还原功能、支持导入与导出XML、HTML、CSV等多种格式地数据、直接运行批量SQL脚本文件,速度极快、新版本支持数据迁移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值