MySql学习(深入浅出MySql)

本博文记录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.运算符优先级

  1. :=
  2. ||、OR、XOR
  3. &&、AND
  4. NOT
  5. BETWEEN、CASE、WHEN、THEN 、 ELSE
  6. =、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN
  7. |
  8. &
  9. <<、>>
  10. -、+
  11. *、/、DIV、%和MOD
  12. ^
  13. -(一元减号)、~(一元比特反转)
  14. !

二、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值

 

 

 

 

 

你可能感兴趣的:(mysql,数据库)