本博文记录MySql的学习笔记
一、SQL基础
1.使用入门
(1)SQL类别
- DDL:数据定义语句,定义数据表结构
- DML:数据操作语句
- DCL:数据控制语句,定义访问权限和安全级别(配置)
(2)DDL
建库:CREATE DATABASE dbname
查询库:show databases
自带库介绍:information_schema 数据库对象信息;cluster,系统集群信息;mysql,用户权限信息;test,测试库
选择数据库:USE dbname DATABASE CHANGED
展示所有表:show tables
删除数据库:DROP DATABASE dbname
建表:CREATE TABLE tablename(
列名(student) 类型(varchar(20)) 约束条件(DEFAULT NULL)
)
查看表定义:DESC tablename 或者 show create table tablename \G (更详细信息)
表删除:DROP TABLE tablename
修改表字段定义:ALTER TABLE 表名 MODIFY 字段名 字段定义 [FIRST | AFTER 字段名]
eg:ALTER TABLE tablename MODEIFY student varcha(20) DEFAULT NULL
增加表字段:ALTER TABLE 表名 ADD COLUMN 字段名 字段定义 [FIRST | AFTER 字段名]
删除表字段:ALTER TABLE 表名 DROP COLUMN 字段名
字段改名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 字段定义 [FIRST | AFTER 字段名]
修改字段在表中的顺序:[FIRST] 放在最前面, [AFTER 字段名] 放在该字段后面 (Mysql在标准SQL的扩展)
更改表名:ALTER TBALE 表名 RENAME 新表名
(2)DML
插入记录:INSERT INTO 表名 (字段1,字段2) VALUES(值1,值2),(值3,值4)
更新记录:UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2 [WHRE 条件]
联表更新记录:eg : update table1 a, table2 b set a.col1 = b.col2, b.col1 = a.col2;
删除记录:DELETE FROM 表名 [WHERE 条件]
查询记录(所有字段):SELECT * FROM 表名 [WHERE 条件]
查询记录(指定字段):SELECT 字段1 as 重命名,字段2 as 重命名 FROM 表名 [WHERE 条件]
查询记录关键字:distinct(不重复),order by(排序),group by(分组), limit(限制查询条数,mysql特有),sum(求和),count(记录数),max(最大值),min(最小值,having(对查询的结果进行再过滤),with rollup(对分类后的结果进行再次汇总)
表内连接:inner join 仅仅选出两张表相互匹配记录 SELECT * FROM table1 a inner join table2 b on a.id = b.parent_id;
表左连接:left join 包含所有左边表的记录,右边表没有与它匹配的数据会被设置为null
eg select * from table1 p left join table2 q on p.id = q.parent_id;
表右连接:right join 包含所有右边表的记录,左边表没有与它匹配的数据会被设置为null
子查询:in、not in、=、!=、exists、not exists
eg select * from table1 where id in (select parent_id from table2 where id = 3);
记录联合:union/union all将多表的数据按一定查询条件查询出来,合并一起显示
eg. select * from t1 union|union all select * from t2 union|union all select * from t3;
(3) DCL语句
权限赋予:grant 权限(all privileges所有权限) on 表 to 用户名”@”登录IP或域名(%表示没有限制)
权限收回:revoke 权限(all privileges所有权限) on 表 from 用户名”@”登录IP或域名(%表示没有限制)
刷新权限:flush privileges;
查看权限: show grants for 用户名”@”登录IP或域名(%表示没有限制);
(4)Mysql帮助的使用
查看帮助文档:?contents
查看具体模块:?data types
查看具体模块里面的具体部分内容:?int
快速查阅:?show
2.Mysql支持的数据类型
(1)数值类型
- TINYINT:1字节(8位)(-128~127,0~255)
- SMALLINT:2字节 (-32768~32767,0~65535)
- MEDIUMINT:3字节 (-8388608~8388607,0~1677215)
- INT、INTEGER:4字节 (-2147483648~2147483647,0~4294967295)
- BIGINT:8字节 (-9223372036854775808~9223372036854775807)
- FLOAT:4字节
- DOUBLE:8字节
- BIT(M):1~8字节
- DEC(M,D):M+2字节
- DECIMAL(M,D):M+2字节
(2)日期时间类型
- 年月日:DATE
- 年月日时分秒:DATE-TIME(YYYY-MM-DD HH:MM:SS/YY-MM-DD HH:MM:SS 允许不严格语法,任何标点符号可以当时间分隔符;YYYYMMDDHHMMSS/YYMMDDHHMMSS)
- 时分秒:TIME
- 时间戳:TIMESTAMP(系统只允许一个CURRENT_TIMESTAMP当前系统时间设置,默认第一个TIMESTAMP为默认系统时间)
- 年:YEAR(1901-2155)
(3)字符串类型
- CHAR:操作时字符串末尾的空格会被去除
- VARCHAR:操作时字符串末尾的空格会被保留
- BINARY:二进制字符串,在值得后面填充零字节(0x00)达到指定长度
- VARBINARY:二进制字符串
- BLOB:存储大文本,保存二进制数据
- TEXT:存储大文本,保存字符数据
- ENUM:值得范围需要通过枚举方式指定,如果插入值不在范围之内,则插入第一个枚举值
- SET:和ENUM类似,但是set类型可以一次选择多个成员
3、Mysql运算符
(1)算术运算符
(2)比较运算符
- 等于:=
- 不等于:<> 或 !=
- NULL安全的等于:<=>
- 小于:<
- 小于等于:<=
- 大于:>
- 大于等于:>=
- 存在于指定范围:BETWEEN
- 存在于指定集合:IN
- 为NULL:IS NULL
- 不为NULL:
- 通配符匹配:LIKE
- 正则表达式匹配:REGEXP或RLIKE
(3)逻辑运算符
- 逻辑非:NOT 或者!
- 逻辑与:AND 或者 &&
- 逻辑或:OR 或者 ||
- 逻辑异或:XOR
4.位运算符
- 位与:&
- 位或:|
- 位异或:^
- 位取反:~
- 位右移:>>
- 位左移:<<
5.运算符优先级
- :=
- ||、OR、XOR
- &&、AND
- NOT
- BETWEEN、CASE、WHEN、THEN 、 ELSE
- =、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN
- |
- &
- <<、>>
- -、+
- *、/、DIV、%和MOD
- ^
- -(一元减号)、~(一元比特反转)
- !
二、SQL常用函数
1.字符串函数
- CONCAT(S1,S2,...Sn):连接S1、S2,...Sn为一个字符串
- INSERT(str,x,y,instr):将字符串str从第x位置开始,y个字符串长度的子串替换为字符串instr
- LOWER(str):将字符串str中所有字符变成小写
- UPPER(str):将字符串str中所有字符变成大写
- LEFT(str,x):返回字符串str最左边的x个字符
- RIGHT(str,x):返回字符串str最右边的x个字符
- LPAD(str,n,pad):用字符串pad对str最左边进行填充,直到长度为n个字符长度
- RPAD(str,n,pad):用字符串pad对str最右边进行填充,直到长度为n个字符长度
- LRIM(str):去掉字符串str左侧的空格
- RTRIM(str):去掉字符串行尾的空格
- REPREAT(str,x):返回str重复x次的结果
- REPLACE(str,a,b):用字符串b替换字符串str中所有出现的字符串a
- STRCMP(s1,s2):比较字符串s1和s2
- TRIM(str):去掉字符串行尾和行头的空格
- SUBSTRING(str,x,y):返回从字符串str x位置起y字符长度的字符串
2.数值函数
- ABS(x):返回x的绝对值
- CEIL(x):返回大于x的最小整数值
- FLOOR(x):返回小于x的最大整数值
- MOD(x,y):返回x/y的模
- RAND():返回0~1的随机值
- ROUND(x,y):返回参数x的四舍五入的有y位小数的值
- TRUNCATE(x,y):返回数字x截断为y位小数的结果
3.日期和时间函数
- CURDATE():返回当前日期(只包含年月日)
- CURTIME:返回当前时间(只包含时分秒)
- NOW():返回当前的时间和日期(包含年月日时分秒)
- UNIX_TIMESTAMP(date):返回日期date的UNIX时间戳
- FROM_UNIXTIME(timestamp):返回UNIX时间戳的日期值
- WEEK(date):返回日期date为一年中的第几周
- YEAR(date):返回日期date的年份
- HOUR(time):返回time的小时值
- MINUTE(time):返回time的分钟值
- MONTHNAME(date):返回date的月份名
- DATE_FORMAT(date,fmt) :返回字符串fmt格式化日期date值(秒:%s,分:%i,2位数12小时制时:%h,2位数24小时制时:%H,数字12小时制时:%l,数字24小时制时:%k,24小时hh:mm:ss:%T,12小时hh:mm:ss:%r,AM或者PM:%p,星期几:%W,缩写星期几:%a,两位数月中天数:%d,数字月中天数:%e,英文后缀月中天数:%D,数字表示星期几:%w,三位数表示年中天数:%j,周、其中Sunday为周第一天:%U,周、其中MonDay为周第一天:%u,月名:%M,缩写月名:%b,两位数字月份:%m,数字月份:%c,4位数年份:%Y,两位数年份:%y,直接值:%%)
- DATE_ADD(date,INTERVAL,expr type):返回一个日期或时间值加上一个时间间隔的时间值(HOUR:hh,MINUTE:mm,SECOND:ss,YEAR:YY,MONTH:MM,DAY:DD,YEAR_MONTH:YY-MM,DAY_HOUR:DD hh,DAY_MINUTE:DD hh:ss, DAY_SECOND:DD hh:mm:ss,HOUR_SECOND:hh:ss,HOUR_MINUTE:hh:mm,MINUTE_SECOND:mm:ss)
- DATEDIFF(expr,expr2):返回起始时间expr和结束时间expr2之间的天数
4.流程函数
- IF(value,t,f):如果value为真,则返回t,否则返回f
- IFNULL(value1,value2):如果value1不为空,返回value1,否则返回value2
- CASE WHEN [value1] THEN [result]... ELSE [default] END:如果value1为真,返回result1,否则返回default
- CASE [expr] WHEN [value1] THEN [result1] ... ELSE [default] END:如果expr值为value1,返回result1,否则返回default
5.其他常用函数
- DATEBASE():返回当前数据库名
- VERSION():返回当前 数据库版本
- USER():返回当前登录名
- INET_ATON(IP):返回IP地址的数字表示
- INET_NTOA(num):返回数字代表的IP地址
- PASSWORD(str):返回字符串str的加密版本
- MD5(str):返回字符串str的md5值