【MySQL入门篇 第二节】MySQL基本语法

一、SQL语句分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。功能:创建、删除、修改库和表结构。
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录:增、删、改表记录。
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。
  • DQL(Data Query Language):数据查询语言,用来查询记录。也是本章学习的重点。

二、SQL属性类型

属性 大小 含义
TINYINT 1字节 小整数值
SMALLINT 2字节 大整数值
MEDIUMINT 3字节 大整数值
INT或INTEGER 4字节 整型,大整数值
FLOAT 单精度浮点数值
DOUBLE(5,2) 双精度浮点型数值,参数表示该浮点型数值最多有5位,其中必须有2位小数
DECIMAL(M,D) 小数值,参数表示该数值最多有M位,其中必须有D位小数。
CHAR 字符型,固定长度字符串类型:char(255)。你存入一个a字符,虽然a只占一个字符,但是它会自动给你加254个空格凑成255个长度即数据的长度不足指定长度,会补足到指定长度。
VARCHAR 可变长度字符串类型:varchar(65535),存入的数据多长它就是多长。它会抽出几个字节来记录数据的长度。
TEXT(CLOB) mysql独有的数据类型,字符串类型。
BLOB 字节类型。
YEAR 年份值,格式为:YYYY
DATA 日期类型,格式为:yyyy-MM-dd。
TIME 时间类型,格式为:hh:mm:ss。
TIMESTAMP 时间戳类型,格式为上面二者的综合。
DATETIME 混合日期和时间值,格式为:YYYYMMDD HHMMSS.

三、SQL语句详解

当然首先需要再命令行中输入如下指令来进入mysql。

mysql -uroot -p

注意:

  • MySQL语法不区分大小写,但是建议关键字使用大写表示。
  • 每一条语句后面以分号结尾。

3.1 DDL(数据定义语言语法)

该语言用来对数据库和表结构进行操作。

3.1.1 对数据库的操作:

  1. 查看所有数据库
SHOW DATABASES;
  1. 使用数据库
USE 数据库名;
  1. 创建数据库并指定编码:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARACTER SET UTF8];
  1. 删除数据库:
DROP DATABASE 数据库名;
  1. 修改数据库的编码:
ALTER DATABASE 数据库名 CHARACTER SET UTF-8;

3.1.2 对表结构的操作

3.1.2.1 创建表

CREATE TABLE (IF NOT EXISTS) 表名(
列名 列类型,
...,
列名 列类型
); 

3.1.2.2 查看表

  1. 查看当前数据库中所有表:
SHOW TABLES;
  1. 查看表结构:
DESC 表名;

3.1.2.3 删除表

  1. 删除表:
DROP 表名;

3.1.2.4 修改表

修改表:修改表有5个操作,但前缀都是一样的:ALTER TABLE 表名...

  • 修改表之添加列:ALTER TABLE 表名 add (列名 列类型,...,列名 列类型);
  • 修改表之修改列类型:ALTER TABLE 表名 MODIFY 列名 列的新类型;
  • 修改表之列名称列类型一起修改:ALTER TABLE 表名 CHANGE 原列名 新列名 列名类型;
  • 修改表之删除列:ALTER TABLE 表名 DROP 列名;
  • 修改表之修改表名:ALTER TABLE 表名 RENAME TO 新表名

3.2 DML(数据操作语言)语法

用来对表记录操作,包括增、删、改。

3.2.1 插入数据(一次插入就是插入一行)

insert into 表名 (列名1,列名2,列名3) values (列值1,列值2,列值3);

说明:

  1. 在数据库中所有的字符串类型,必须使用单引号。
  2. (列名1,列名2,列名3)可省略,表示按照表中的顺序插入。但不建议采取这种写法,因为降低了程序的可读性。
  3. 在命令行插入记录不要写中文,否则可能会出现乱码。

3.2.2 修改记录(不会修改一行)

  1. 修改某列的全部值:
update 表名 set 列名1=列值1(,列名2=列值2);
  1. 修改(某行或者多行记录的)列的指定值:
update 表名 set 列名1=列值1 where 列名2=列值2 or 列名3=列值3;

运算符:=、!=、<>、<、>、>=、<=、between...and、in(…)、is null、not、or、and,其中in(…)的用法表示集合。

例如:

//写法1
update 表名 set 列名1=列值1 where 列名2=列值2 or 列名2=列值3


//写法2
update 表名 set 列名1=列值1 where 列名2 in(列值2,列值3)

3.2.3 删除数据(删除若干整行)

delete from 表名 (where 条件);

不加where条件时会删除表中所有的记录,所以为了防止这种失误操作,很多数据库往往都会有备份。

3.2.4 请空数据(删除所有行)

delete from 表名;
truncate table 表名;

不带where参数的delete语句可以删除mysql表中所有内容,
使用truncate table也可以清空mysql表中所有内容。

效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据。
delete的效果有点像将mysql表中所有记录一条一条删除到删完,
而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表。

3.3 DCL(数据控制语言)语法

该语言用来定义访问权限,理解即可,以后不会多用。需要记住的是,一个项目创建一个用户,一个项目对应的数据库只有一个。这个用户只能对这个数据库有权限,其它数据库该用户就操作不了。

3.3.1 创建用户

  1. 用户只能在指定ip地址上登录mysql:
create user 用户名@IP地址 identified by ‘密码’;
  1. 用户可以在任意ip地址上登录:
create user 用户名@‘%’ identified by ‘密码’;

3.3.2 给用户授权

  1. 语法格式:
grant 权限1,…,权限n on 数据库名.表名 to 用户名@IP地址;

其中权限1、2、n可以直接用all关键字代替。权限例如:create,alter,drop,insert,update,delete,select。

  1. 授权举例:最大特权
GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123' WITH GRANT OPTION;  
flush privileges; 

3.3.3 撤销授权

  1. 语法格式:
revoke 权限1,…,权限n on 数据库.* from 用户名@ ip地址;

撤销指定用户在指定数据库上的指定权限。

  1. 撤销举例:
revoke create,delete on mydb1.* form user@localhost;

说明:撤消user用户在数据库mydb1上的create、alter权限。

3.3.4 查看权限

查看指定用户的权限:

SHOW GRANTS FOR 用户名@ip地址;

3.3.5 删除用户

DROP USER 用户名@ip地址;

3.4 DQL(数据查询语言)语法

mysql学习的重点,该语言用来查询记录,不会修改数据库和表结构。

3.4.1 基本查询(后缀都是统一为from 表名)

3.4.1.1 字段(列)控制

  1. 查询所有列:
select * from 表名;

说明:其中‘*’表示查询所有列,而不是所有行的意思。

  1. 查询指定列:
select 列1,列2,列n from 表名;
  1. 完全重复的记录只显示一次:在查询的列之前添加distinct:
select distinct $ from 表名;

说明:缺省值为all,即查询所有的结果,包括重复的行。

  1. 列运算
  • a.数量类型的列可以做加、减、乘、除:
SELECT sal*5 from 表名;

说明:
遇到null加任何值都等于null的情况,需要用到ifnull()函数;将字符串做加减乘除运算,会把字符串当作0。

  • b.字符串类型可以做连接运算(需要用到concat()函数):
select concat(列名1,列名2) from 表名;

其中,列名的类型要为字符串。

  • c. 给列名起别名:
select 列名1 (as) 别名1,列名2 (as) 别名2 from 表名;

3.4.1.2 条件控制

  1. 条件查询:在查询语句的后面添加where指定条件:
SELECT * FROM 表名 WHERE 列名=指定值;
SELECT 表1.a,表2.b FROM 表1,表2 WHERE 表1.a=表2.c;
  1. 模糊查询:当你想查询所有姓张的记录。用到关键字like。eg:
SELECT * FROM 表名 WHERE 列名 LIKE ‘张_’;

说明:

  • _代表匹配任意一个字符
  • %代表匹配0~n个任意字符

3.4.2 排序

有时我们需要对查询的结果进行排序输出,而所谓升序和降序都是从上往下排列。

  1. 升序:
select * form 表名 order by 列名 (ASC);

说明:()里面的内容为缺省值,即mysql的order by子句默认会将结果按照升序方式排列输出。

  1. 降序:
select * from 表名 order by 列名 DESC;
  1. 使用多列作为排序条件:

当第一列排序条件相同时,根据第二列排序条件排序(当第二列依旧相同时可视情况根据第三例条件排序)。例如:

select * from 表名 order by 列名1 ASC, 列名2 DESC;

意思是当列名1的值相同时按照列名2的值降序排。

3.4.3 聚合函数

  • count:统计有效行数。
select count(列名) from 表名;
  • max:求列中最大值。
select max(列名) from 表名;
  • min:求列中最小值。
select min(列名) from 表名;
  • sum:求列的总值,null 和字符串默认为0。
select sum(列名) from 表名;
  • avg:求一列的平均值。
select avg(列名) from 表名;

3.4.4 分组查询

分组查询的信息都是组的信息,不能查到个人的信息,其中查询组的信息是通过聚合函数得到的。

  1. 语法格式:
select 分组列名,聚合函数1,聚合函数2 from 表名 group by 该分组列名;

其中,

  • 分组列名需要的条件是该列名中有重复的信息
  • 查询的结果只能为作为分组条件的列和聚合函数
  • 查出的信息都是组的信息
  1. 使用技巧

分组查询前,可以通过关键字where先把满足条件的人分出来:

select 分组列,聚合函数 from 表名 where 条件;

再根据需要进行分组:

select 分组列,聚合函数 from 表名 where 条件 group by 分组列;

分组查询后,也可以通过关键字having把组信息中满足条件的组再细分出来:

select 分组列,聚合函数 from 表名 where 条件 group by 分组列 having 聚合函数或列名(条件);

3.4.5 LIMIT子句

LIMIT子句可以过滤显示结果,用来限定查询结果的起始行,以及总行数。

  1. 语法格式:
SELECT * FROM 表名 LIMIT ${START_LINE},${LINE_COUNT};
  1. 例如:
select * from 表名 limit 4,3;

说明:对查询出来的结果进行过滤,只显示起始行为第5行,一共查询3行记录。

四、总结

  1. 关键字:
    select,from,where,group by,having,order by,limit

  2. 优先级:
    select>from>where>group by>having>order by>limit

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 3,151评论 0 33
  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,780评论 5 116
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,176评论 0 9
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,898评论 2 89
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,030评论 0 19