MySQL基础SQL语句

一:SQL结构化查询语言分类

DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据检索语言

二:DDL数据定义语言

2.1 库定义

2.1.1 创建库

mysql> create database cxytest charset utf8mb4;

2.1.2 删除数据库(生产中禁止使用)

mysql> drop database cxytest;

2.1.3 修改字符集

mysql> alter database test charset utf8mb4;

2.1.4 查看创建的数据库

mysql> show create database cxytest;
+----------+---------------------------------------------------------------------+
| Database | Create Database                                                     |
+----------+---------------------------------------------------------------------+
| cxytest  | CREATE DATABASE `cxytest` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

2.2 表定义

2.2.1 列属性

数据类型

数字类型:
tinyint       1个字节        0-255                       3位数
int           3个字节        0-4294967295                10位数   

说明:手机号码是无法存储到int的,一般是使用char类型来存储手机号

字符类型:
char(10)
      定长10位,存储空间1次性分配,如果字符没有写满10位,也分配10位,可以分配255个;char(255)

varchar(10)
      可变长10位,按需分配空间,写几位占几位,可以分配65535个;char(65535)

enum('m','f') 枚举类型
      比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构
时间类型:
datetime  
      时间范围从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
timestamp
      时间范围从1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999

约束

primary key 主键:非空,唯一
unique key:唯一键;不重复
not null:非空
unsigned:无符号,数字类型的列,非负数

其他属性

default 默认值
auto_increment 自增长
comment 注释

2.2.2 表属性

engine   引擎
charset  字符集
comment  注释

2.3 表创建

2.3.1 创建语法

语法:create table 表名(
列1 属性(数据类型,约束,其他属性)
列2 属性
列3 属性
)

2.3.2 规范建表的例子

USE test;                                                                          """切换到要建表的数据库下
CREATE TABLE stu(
id      INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',                    """int整型;非空;主键;自增长;注释"""
sname   VARCHAR(20) NOT NULL COMMENT '姓名',                                       """varchar字符串;非空;注释"""
sage    TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',                        """tinyint整型;unsigned:无符号,数字类型的列,非负数;非空;有默认值为0;注释"""
sgender ENUM('男','女','未知') NOT NULL DEFAULT '未知',                             """枚举类型; 非空,有默认值'未知' """
sfz     CHAR(18)  NOT NULL UNIQUE COMMENT '身份证',                                """char字符串定长18位;非空;unique:唯一键不重复;注释"""
intime   TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'                       """timestamp时间类型;非空;默认值为当前时间;注释"""
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';                                   """表引擎innodb;字符集utf8mb4;注释"""

建表规范:

  • 表名小写
  • 不能是数字开头
  • 注意字符集和存储引擎
  • 选择合适的数据类型
  • 每个列都要有注释
  • 每个列设置为非空,无法保证非空的,用0来填充

2.3.3 删表(生产中禁止使用此命令)

mysql > drop table stu;

2.3.4 修改表

在stu表中添加qq列

ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT 'qq号';

在sname后加微信列

ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信号' AFTER sname;

在id列前加一个新列num

ALTER TABLE stu ADD num INT NOT NULL COMMENT '数字' FIRST;

删除刚才添加的列(危险)

ALTER TABLE stu DROP num;

修改sname数据类型的属性

ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL;

修改sgender改为列名sg char(3) not null default '未知'

ALTER TABLE stu CHANGE sgender sg CHAR(3) NOT NULL DEFAULT '未知'

2.3.5 查看表属性

查看表中有哪些列以及其属性

mysql> desc stu;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(128)        | NO   |     | NULL              |                |
| wechat | varchar(64)         | NO   | UNI | NULL              |                |
| sage   | tinyint(3) unsigned | NO   |     | 0                 |                |
| sg     | char(3)             | NO   |     | 未知              |                |
| sfz    | char(18)            | NO   | UNI | NULL              |                |
| intime | timestamp           | NO   |     | CURRENT_TIMESTAMP |                |
| qq     | varchar(20)         | NO   | UNI | NULL              |                |
+--------+---------------------+------+-----+-------------------+----------------+
8 rows in set (0.00 sec)

查看数据库里有哪些表

mysql> show tables;
+-------------------+
| Tables_in_cxytest |
+-------------------+
| stu               |
+-------------------+
1 row in set (0.00 sec)

查看创建表时的语句

mysql> show create table stu;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stu   | CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `sname` varchar(128) NOT NULL,
  `wechat` varchar(64) NOT NULL COMMENT '微信号',
  `sage` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `sg` char(3) NOT NULL DEFAULT '未知',
  `sfz` char(18) NOT NULL COMMENT '身份证',
  `intime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入学时间',
  `qq` varchar(20) NOT NULL COMMENT 'qq号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sfz` (`sfz`),
  UNIQUE KEY `qq` (`qq`),
  UNIQUE KEY `wechat` (`wechat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生表'      

三:DCL数据控制语言

grant
revoke
在mysql基础管理里有介绍

四:DML 对表中的数据进行增删改

4.1 增 insert

最标准的insert语句

INSERT INTO stu(id,sname,sage,sgender,sfz,intime)
VALUES
(1,'张三',20,'男',1111134454,NOW());

省事的写法

INSERT INTO stu
VALUES (2,'赵四',29,'女','8796554678',NOW());

针对性的录入

INSERT INTO stu(sname,sfz)
VALUES ("王铁柱",9808988332)

同时录入多行数据

INSERT INTO stu(sname,sage,sg,sfz,intime)
VALUES
('田二妞',29,'女','6549890',NOW()),
('支付宝',76,'男',4321908,NOW()),
('王大富',33,'未知','23213434',NOW());

4.2 删(谨慎使用)delete

DELETE FROM stu WHERE id=4;

4.3改update

修改表里的内容,一定要跟where字句一起使用

UPDATE stu SET sname='张三丰' WHERE id=1;

五:DQL数据检索语言(select)

5.1 单独使用,查看系统参数

查看系统参数

SELECT @@port;
SELECT @@datadir;
SELECT @@basedir;
SELECT @@server_id;

5.2 select 函数()

SELECT DATABASE();                 ''''查看当前使用的哪个数据库''''
SELECT NOW();                      ''''查看当前系统时间''''
SELECT USER();                     ''''查看当前登录的用户是谁''''

concat字符串的拼接

select concat(user,'@','host') from mysql.user;
image.png

group_concat:将列转行,将几列数据转成一行显示

SELECT GROUP_CONCAT(USER,'@','host') FROM mysql.user;
image.png

5.3 select-from 子句

语法

select 列1,列2,列3 from 表名;

查询stu中所有的数据(不要对大表进行操作)

SELECT * FROM stu;

查询stu表中,学生姓名和入学时间

SELECT sname,intime FROM stu;
image.png

5.4 where子句

查询中国所有的城市信息

SELECT * FROM city WHERE COUNTRYCODE='CHN';

查询北京市的信息

SELECT * FROM city WHERE NAME='peking'

查询甘肃省所有城市的信息

SELECT * FROM city WHERE DISTRICT='GANSU'

查询世界上人口小于100w的城市

SELECT * FROM city WHERE population<1000000;

查询中国人口大于500w的城市

使用AND用法

SELECT * FROM city WHERE Countrycode='CHN' AND population>5000000

查询中国或者美国的城市信息

使用or用法

SELECT * FROM city WHERE countrycode='CHN' OR COUNTRYCODE='USA';

使用in()用法

SELECT * FROM city WHERE countrycode IN('CHN','USA')

查询世界上人口数量大于100w小于200w的城市信息

2种写法

SELECT * FROM city WHERE population>1000000 AND population<2000000
SELECT * FROM city WHERE population BETWEEN 1000000 AND 2000000

模糊查询

SELECT * FROM city WHERE district LIKE 'guang%'
'''''不要使用全模糊查询,百分号不能放在字符最前面,这样会影响数据库速度'''

5.5 group by+聚合函数

  • 作用:将统计好的数据,按照by后面的条件进行分组排列
max()                        最大值
min()                        最小值
avg()                        平均值
sum()                        总和
count()                      个数
group_councat()              列转行

统计世界上每个国家的总人口数sum()

SELECT countrycode,SUM(population) FROM city GROUP BY countrycode;

统计中国各个省的总人口数量sum()

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district;

统计世界上每个国家的城市个数count()

SELECT countrycode,COUNT(NAME) FROM city GROUP BY countrycode

统计中国每个省的城市列表group_concat

SELECT district,GROUP_CONCAT(NAME) FROM city WHERE countrycode='CHN' GROUP BY district;

5.6 having 子句

  • 作用:运行在group by后面,跟where的作用一样,只是优先级比where低

统计中国每个省的总人口数,只打印总人口数小于100w的

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population)<1000000

5.7 order by +limit

  • 作用:排序,默认从小到大,从大到小需要加desc
    order by 条件 desc;
    limit 显示数据中的某几列
    limit 3:显示前3行
    limit 3,7:跳过前3行之后,从第4行开始显示到第7行

查看中国所有的城市,并按人口数进行排序(从大到小)

SELECT NAME,population  FROM city WHERE countrycode='CHN' ORDER BY population DESC;

统计中国各个省的总人口数量,按照总人口从大到小排序

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district ORDER BY SUM(population) DESC;

统计中国每个省的总人口,找到总人口大于500w的,并按总人口从大到小排序,只显示前三名

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population)>5000000 ORDER BY SUM(population) DESC LIMIT 3;

5.8 distinct 去重复查询

SELECT countrycode FROM city ;
SELECT DISTINCT(countrycode) FROM city;

5.9 联合查询-union all

查询中国或者美国城市信息

SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE COUNTRYCODE='USA'

6.0 子句的优先级顺序

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

推荐阅读更多精彩内容