MySQL基础操作

MySQL 数据类型

字符类型

CHAR, 1~255个字符的定长串。它的长度必须在创建时指定,否则MySQL假定为CHAR(1)

ENUM, 接受最多64 K个串组成的一个预定义集合的某个串

VARCHAR, 长度可变,最多不超过21845

TEXT, 最大长度为64 K的变长文本

TINYTEXT,  最大长度为255字节

MEDIUMTEXT, 最大长度为16K

LONGTEXT, 最大长度为4GB

数值类型

二进制

BIT, 位字段,1~64位。

BOOLEAN, 布尔标志,或者为0或者为1

整数

TINYINT, 整数值,-128~127

SMALLINT, 整数值,-32768~32767

INT, 整数值,-2147483648~2147483647

BIGINT, 整数值,-9223372036854775808~9223372036854775807

浮点数

DECIMAL, 精度可变的浮点值,精确的。

FLOAT, 单精度浮点值

DOUBLE, 双精度浮点值

时间类型 

DATE, 格式为YYYY-MM-DD,(1000-01-01/9999-12-31)

TIME, 格式为HH:MM:SS

YEAR, 用2位数字表示,范围是70(1970年)~69(2069年),用4位数字表示,范围是1901年~2155年

DATETIME, YYYY-MM-DD HH:MM:SS,(1000-01-01 00:00:00/9999-12-31 23:59:59)

TIMESTAMP, 功能和DATETIME相同(但范围较小)(1970-01-01 00:00:00/2037-12-31 23:59:59)

二进制类型 

BLOB, 最大长度为64KB

MEDIUMBLOB, 最大长度为16MB

LONGBLOB, 最大长度为4GB

TINYBLOB, 最大长度为255字节

用户管理

mysql数据库有一个名为user的表,它包含所有用户账号信息。IP地址默认为%

查询用户

select user,host from mysql.user;

创建用户

create user '用户名'@'IP地址' identified by '密码';

删除用户

drop user '用户名'@'IP地址';

重新命名

rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';

修改密码

set password for '用户名'@'IP地址' = Password('新密码')

权限管理

查看权限

show grants for '用户'@'IP地址';

show grants for sadmin;

用户授权

grant  权限 on 数据库.表 to '用户'@'IP地址';

--grant允许用户admin在django的所有表中有select的权限。
grant select on django.* to admin;

--all处了grant以外的所有权限
grant all on django.* to admin; 

用户撤权

revoke 权限 on 数据库.表 from '用户'@'IP地址';

revoke select on django.* from admin;

库操作

查看数据库

show databases;

创建数据库

create database 数据库名;

使用数据库

use 数据库名;

删除数据库

drop database 数据库名;

表操作

创建表

CREATE TABLE customers
(
  cust_id      int       NOT NULL AUTO_INCREMENT,
  cust_name    char(50)  NOT NULL,
  cust_age   int     NOT NULL DEFAULT 25,
  cust_address char(50)  NULL,
  cust_city    char(50)  NOT NULL DEFAULT 'local',
  cust_country char(50)  NULL,
  PRIMARY KEY (cust_id)  --设置主键cust_id
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 主键值必须唯一,即表中的每个行必须具有唯一的主键值。
  • 每个表只允许一个AUTO_INCREMENT列,而且必须被索引,如成为主键。
  • MySQL只支持常量作为默认值。
  • InnoDB是一个可靠的事务处理引擎,不支持全文本搜索。
  • MyISAM是一个性能极高的引擎,支持全文本搜索,但不支持事务处理。
  • 引擎可以混用,但是外键不能跨引擎,即使用一个引擎的表不能引用不同引擎的外键。

重新命名

rename table 表名 to 新表名;

删除表

drop table 表名;

清除表内容,表还保存

delete from 表名;
truncate table 表名;

查看表

show tables; 

查看表结构

describe 表名;

修改表结构

-- 添加字段
alter table 表名 add 字段名 字段类型;
-- 删除字段
alter table 表名 drop 字段名;
-- 修改字段
alter table 表名 change column 字段名 新字段名 类型 NOT NULL DEFAULT 值;
alter table 表名 modify column 字段名 新类型 NOT NULL;
-- 修改默认值
alter table 表名 alter 字段名 set default 值;
-- 删除默认值
alter table 表名 alter 字段名 drop default;

主键

-- 添加主键
alter table 表名 add primary key(字段名);
-- 删除主键
alter table 表名 modify 字段名 int;  --先取消AUTO_INCREMENT
alter table 表名 drop primary key;  --删除主键

外键

  引用一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束。外键用来建立和加强两个表数据之间的连接。

-- 添加外键
alter table 表名 add constraint 外键名fk_从_主 foreign key (字段) references 外表名 (外表字段);
-- 删除外键
alter table 表名 drop foreign key 外键名称

引擎

-- 修改表引擎
ALTER TABLE customers ENGINE = MYISAM;

表内容操作

MySQL用单条INSERT语句处理多个插入,比用多条INSERT语句快,提高数据库处理的性能。

insert into 表 (列名,列名...) values (值,值...);  -- 插入单行数据
insert into 表 (列名,列名...) values (值,值...),(值,值...);  -- 插入多行数据
insert into 表1 (列名,列名...) select (列名,列名...) from 表2;  -- 插入SELECT返回的行

delete from 表;  -- 删除表中所有行
delete from 表 where id=1;  -- 删除条件匹配的行

  如果用UPDATE更新多行,并且更新时出现一个错误,则整个UPDATE操作会被取消,所有行恢复到原来的值;使用IGNORE可以忽略这些错误,update ignore 表名...

update 表名 set 列名 = 值 where id = 1;  -- 更新单列
update 表名 set 列名1 = 值, 列名2 = 值 where id = 1;  -- 更新多列

select * form 表名;
select name, age from 表名;

限制limit

select * from 表名 limit 2;  -- 前2行
select * from 表名 limit 2,3;  -- 从第3行开始的3行
select * from 表名 limit 5 offset 3;  -- 从第4行开始的5行

条件判断where

WHERE匹配条件,=,!=,<>,<,<=,>,>=,BETWEEN AND,IS NULL判断值是否为空。AND和OR的用法,多个操作符组合括号用法,IN (start,end)范围操作符,NOT非操作符,可以与IN、BETWEEN、EXISTS组合。

select * from 表名 where name = 'Alice';  -- name为Alice的行
select * from 表名 where age > 25 and name = 'Alice';  -- age大于25并且name为Alice的行
select * from 表名 where name is null;  -- name为空的行
select * from 表名 where age between 25 and 35;  -- age在25和35之间的行
select * from 表名 where age not in (25,35);  -- age不在25-35之间的行

通配符like

 LIKE是WHERE子句,%任意个任意字符,_一个任意字符,区分大小写,NULL不会被匹配。通配符影响性能,尽量少使用,避免开头使用通配符。

select * from 表名 where name like 'Ali%';  -- name为Ali开头的行
select * from 表名 where name like 'Ali_';  -- name为Ali后一个字符的行

排序order by

可以根据多个列排序,asc正向排序,desc反向排序

select * from 表名 order by age asc;  -- age正向排序
select * from 表名 order by age desc;  -- age反向排序
select * from 表名 order by age asc, num desc;  -- 先对age正向,age中有重复的行,再根据num反向排序

分组group by

having过滤分组

select age from 表名 group by age;  -- 根据age进行分组
select age from 表名 group by age having count(1) > 2;  -- 对age分组后每组中成员数大于2的age列

聚合函数

avg(column)平均值,只用于单个列,列名必须作为函数参数给出,忽略列值为NULL的行。

count(*) 对表中行计数,包含null,count(列) 对列中有值行计数,不包含NULL。

max(),min()最大最小值,也会返回文本列中的。

sum()指定列值的和,忽略列值为NULL的行。

distinct去重函数,后面必须使用列名,不能用于计算或表达式。

select avg(age), max(age), min(age) from 表名;  -- 查询表中age的平均值,最大值,最小值
select count(age) from 表名 where age > 20;  -- 查询age大于20的行数
select distinct age from 表名;  -- 查询去重后的age

SELECT子句顺序

  1. SELECT 要返回的列或表达式
  2. FROM 从中检索数据的表
  3. WHERE 行级过滤
  4. GROUP BY 分组说明
  5. HAVING 组级过滤
  6. ORDER BY 输出排序顺序
  7. LIMIT 要检索的行
-- user_id大于5,对class_id分组,再提取组成员大于1,然后对class_id进行反向排序,最后限制1-3行
select class_id from user_info where user_id > 5 group by class_id having count(1) > 1 order by class_id desc limit 2 offset 0;

连表

  LEFT JOIN(左连接):获取左表所有记录,右表没有对应匹配显示NULL。

  RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

  INNER JOIN 内连接查询: 显示两个表共有的数据。

-- LEFT JOIN
select * from 表1 left join 表2 on 表1.字段 = 表2.字段;  -- 以表1的条件字段为主进行连表,只查询表1中有的,如果表2中没有则为NULL 
select * from 表1 left join 表2 on 表1.字段 = 表2.字段 left join 表3 on 表1.字段 = 表3.字段;  -- 以表1为主,表2表3连接进去
-- INNER JOIN
select * from 表1 inner join 表2 on 表1.字段 = 表2.字段 inner join 表3 on 表1.字段 = 表3.字段;  -- 只显示表1表2表3中,条件字段存在且不为NULL的行

 

posted @ 2019-09-12 11:04  houyongchong  阅读(148)  评论(0编辑  收藏  举报