MySQL_day3_SQL语句基础应用

1、SQL介绍

结构化查询语言
5.7 以后符合SQL92标准的严格模式
通过sql_mode来控制

2、常用SQL分类

DDL:数据定义语言
DCL:数据控制语言
DML:数据操作语言
DQL:数据的查询语言

3、数据类型、表属性、字符集

3.1 数据类型

3.1.1 作用

保证数据的准确性和标准性。

3.1.2 种类

数值类型
image.png

tinyint : -128~127
int :-231~231-1
说明:手机号是无法存储到int的。一般是使用char类型来存储收集号

字符类型
image.png
char(11) :
定长 的字符串类型,在存储字符串时,最大字符长度11个,立即分配11个字符长度的存储空间,如果存不满,空格填充。
varchar(11):
变长的字符串类型看,最大字符长度11个。在存储字符串时,自动判断字符长度,按需分配存储空间。
enum('bj','tj','sh'):
枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用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。
timestamp会受到时区的影响
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0

unique key :唯一键

列值不能重复

unsigned :无符号

针对数字列,非负数。

key :索引

可以在某列上建立索引,来优化查询

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。
timestamp会受到时区的影响
二进制类型
image.png

3.2 表属性

3.2.1 列属性

约束(一般建表时添加):
**primary key** :主键约束
设置为主键的列,此列的值必须非空且唯一,主键在一个表中只能有一个,但是可以有多个列一起构成。
**not null**      :非空约束
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
**unique key** :唯一键
列值不能重复
**unsigned** :无符号
针对数字列,非负数。

其他属性:
**key** :索引
可以在某列上建立索引,来优化查询
**default**           :默认值
列中,没有录入值时,会自动使用default的值填充
**auto_increment**:自增长
针对数字列,顺序的自动填充数据(默认是从1开始,将来可以设定起始点和偏移量)
**comment ** : 注释

3.2.2 表的属性

存储引擎:
InnoDB(默认的)
字符集和排序规则:
utf8       
utf8mb4

3.3 字符集和校对规则

3.3.1 字符集

utf8       
utf8mb4

3.3.2 校对规则(排序规则)

大小写是否敏感

4、DDL应用

4.1 数据定义语言

4.2 库定义

4.2.1 创建

create database / create schema
mysql> create database xuexiao; 

建库规范:
1.库名不能有大写字母 *****
2.建库要加字符集 *****
3.库名不能有数字开头

4.库名要和业务相关

建库标准语句
mysql> create database db charset utf8mb4;
mysql> show create database xuexiao;

4.2.2 删除(生产中禁止使用)

mysql> drop database oldboy;

4.2.3 修改

mysql> show create database xuexiao;
mysql> alter database xuexiao charset utf8mb4;
mysql> show create database xuexiao;
注意:修改字符集,修改后的字符集一定是原字符集的严格超集
mysql> show charset;
mysql> show collation

4.2.4 查询库相关信息(DQL)

show databases;
show create database oldboy;

4.3 表定义

4.3.1 创建

create table  xuesheng (
列1  属性(数据类型、约束、其他属性) ,
列2  属性,
列3  属性
)
建表举例:

USE xuexiao
SELECT DATABASE();
CREATE TABLE xuesheng (
id INT PRIMARY KEY NOT NULL  AUTO_INCREMENT COMMENT '学生学号',
sname VARCHAR(64) NOT NULL COMMENT '学生姓名',
xingbie ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '学生性别',
shouji  CHAR(11) UNIQUE KEY NOT NULL COMMENT '手机号',
age  TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '学生年龄',
ruxue TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4;

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

4.3.2 删除(生产中禁用命令)

drop table t1;

4.3.3 修改

-- 1. 在xuesheng表中添加qq列

ALTER TABLE xuesheng ADD qq VARCHAR(64) UNIQUE KEY  NOT NULL COMMENT 'qq号';
DESC xuesheng;

-- 2. 在sname后加微信列
ALTER TABLE xuexiao.xuesheng ADD weixin VARCHAR(64) UNIQUE KEY  NOT NULL COMMENT '微信' AFTER sname;
DESC xuesheng;

-- 3. 在id列前加一个新列num
ALTER TABLE xuesheng ADD num INT FIRST;

-- 4\. 把刚才添加的列都删掉
ALTER TABLE xuesheng DROP num;
ALTER TABLE xuesheng DROP weixin;
ALTER TABLE xuesheng DROP qq;

-- 5\. 修改sname数据类型的属性
ALTER TABLE xuesheng MODIFY sname VARCHAR(32) NOT NULL COMMENT 'aa';
DESC xuesheng;

-- 6. 将sname 改为sn 数据类型改为 varchar(64)
ALTER TABLE xuesheng CHANGE sname sn VARCHAR(64);

4.3.4 表属性查询(DQL)

use xuexiao
show tables;
desc xuesheng;
show create table xuesheng;
select  *  from xuesheng  where  id <5
create table ceshi like xuesheng; (复制结构一样的空表)

5、DCL应用 ****

grant   授权
revoke  取消授权

6、DML应用 ***

6.1 作用

对表中的数据行进行增、删、改

6.2 insert

-- 1\. 在学生表插入一行数据
DESC xuesheng;
INSERT INTO xuesheng(sn,xingbie,shouji,age)
      VALUES('zs','m',  '110'  ,18);
SELECT * FROM xuesheng;
-- 省事的插入方法
INSERT INTO xuesheng
VALUES(2,'ls','f','190',18,NOW());
SELECT * FROM xuesheng;

-- 2\. 一次性录入多行数据
INSERT INTO xuesheng(sn,xingbie,shouji,age)
VALUES
('w5','f','120',19),
('m6','m','119',20),
('m66','f','1190',27);
SELECT * FROM xuesheng;
INSERT INTO xuesheng(sn,shouji,age)
VALUES
('w55','1200',17);

6.3 update

UPDATE xuesheng SET sn='zhao4' WHERE id=7;
注意:update语句必须要加where。

6.4 delete(危险!!)

delete from xuesheng where id=7;
伪删除:用update来替代delete,最终保证业务中查不到(select)即可
1\. 添加状态列
Master [xuexiao]>alter table xuesheng add state tinyint not null default 1;

2\. 使用update替代delete
Master [xuexiao]>update xuesheng set state=0 where id=6;
Master [xuexiao]>select * from xuesheng;

3\. 业务查询时 ,加入状态判断
Master [xuexiao]>select * from xuesheng where state=1;

7、DQL应用(select ) *****

7.0 select 单独使用的情况

查看mysql的参数设定情况:
Master [xuexiao]>select @@basedir;
Master [xuexiao]>select @@innodb_flush_log_at_trx_commit;
调用mysql的内置函数:
Master [world]>select database();
Master [(none)]>select user();
Master [(none)]>select now();
Master [xuexiao]>select concat("lisi shi ge da hun dan ");

7.1 from 子句

语法:
select 列1,列2 from 表
select * from 表;

例子:
学一些常用单词:
world ===>世界
city ===>城市
country ===>国家
countrylanguage ===>国家语言
city ===>城市
DESC city;
ID :城市ID
NAME :城市名
CountryCode :国家代码,比如中国CHN 美国USA
District :区域
Population :人口

7.1.1 查询表中所有的数据(生产中避免使用)

SELECT * FROM city;

7.1.2 查询某些列的数据

SELECT NAME,population FROM world.city;

7.2 where

-- 1\. 查询中国所有的城市
DESC city;
SELECT * FROM city WHERE countrycode='CHN';
-- 2\. 查询CH开头国家代号的城市信息
SELECT * FROM city WHERE countrycode LIKE 'CH%';
注意:%不能加在前面,例如:'%CH%'
-- 3\. 查看中国和美国的城市信息
SELECT * FROM city WHERE countrycode='CHN' OR countrycode='USA';
或者:
SELECT * FROM city WHERE countrycode IN ('CHN','USA');
或者:
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'
注意:  一般我们会将 or或者in 语句改写成union union all 语句
-- 4\. 查询中国城市中人口数量大于500w的城市信息
SELECT * FROM city WHERE countrycode='CHN' AND population>5000000;
-- 5\. 查询中国城市中人口数量小于9w的信息
SELECT * FROM city WHERE countrycode='CHN' AND population <90000;
-- 6\. 查询一下世界上小于100人口的城市
SELECT * FROM city WHERE population<100;
-- 7. 查询人口数100w到200w之前的城市信息
SELECT * FROM city WHERE population>1000000 AND population <2000000
或者:
SELECT * FROM city WHERE population BETWEEN 1000000 AND 2000000;

7.3 group by +常用聚合函数

7.3.1 作用

根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列

7.3.2 常用聚合函数

max() :最大值

min() :最小值

avg() :平均值

sum() :总和

count() :个数

7.3.3 GROUP BY + 聚合函数公式

1.遇到统计想函数
2.形容词前 GROUP BY
3.函数中央是名词
4.列名select后添加

7.3.4 例子:

例子1:统计世界上每个国家的总人口数.

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

例子2: 统计中国各个省的总人口数量(练习)

SELECT district,SUM(Population) FROM city  WHERE countrycode='chn' GROUP BY district;

例子3:统计世界上每个国家的城市数量(练习)

SELECT countrycode,COUNT(id)  FROM city GROUP BY countrycode;

7.4 having

where|group|having

例子4:统计中国每个省的总人口数,将总人口数小于100w

SELECT district,SUM(Population)
FROM city
WHERE countrycode='chn'
GROUP BY district
HAVING SUM(Population) < 1000000 ;

你可能感兴趣的:(MySQL_day3_SQL语句基础应用)