MySQL-SQL基础应用(SQL基础)

1、SQL基础应用

1.1 SQL的介绍

1>SQL标准https://blog.csdn.net/weixin_33963189/article/details/90584378
SQL-92:https://blog.csdn.net/zhongmengya/article/details/5049025
SQL-99:https://blog.csdn.net/qq_23924249/article/details/85625956

2>SQL_MODE
https://blog.csdn.net/ccccalculator/article/details/70432123

注:以上都是为了保证SQL语句的规范性

1.2 SQL的常用分类

DDL(Data Definition Language):数据定义语言
DCL(Data Control Language):数据控制语言
DML(Data Manioulation Language):数据操作语言
DQL(Data QueryLanguage):数据查询语言

1.3 表的核心属性介绍

1.3.1 列属性

1>数据类型
(1)数字类型

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

(2)字符类型

常用的字符类型:
char(10) :定长的字符串类型,在存储字符串时,最大字符长度10个,立即分配10个字符长度的存储空间,如果存不满,空格填充。
varchar(10):变长的字符串类型看,最大字符长度10个。在存储字符串时,自动判断字符长度,按需分配存储空间。
enum('bj','tj','sh'):枚举类型,比较适合于将来此列的值是固定范围内的特点,可以使用enum,可以很大程度的优化我们的索引结构。
注意:
对于char(10)和varchar(10)的数据类型
括号中表示的是,最多的字符个数.
具体占用字节长度如下:
基础字符
    a         ------>  1字节 
    1         ------>  1字节 
    ?         ------>  1字节
中文:
    张    ---gbk-->       2字节 
    张    ---uft8-->      3字节 
    张    ---utf8mb4=-->  4字节

(3)时间类型

常用的时间类型:
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会受到时区的影响

(4)二进制类型(一般不使用)

neo4J:专门用于图片、视频存储

2>约束

常见约束:
not null:非空
unique key:唯一
primary key:主键(非空且唯一)

说明:
    a> 一个表有且一个主键列,最好是一个无关列数字列,一般会在表中设置自增长的id列
    b> 尽量每个列非空,如果无法保证,可以追加默认值
    c> 手机号、身份证号、银行卡号……种类的列设定为UK(unique key)

3>其他类型

unsigned:无符号,一般是在int或tinyint后添加的附加属性
default:设定默认值
auto_increment:数字列自增长
comment:注释信息
1.3.2 表属性

1>存储引擎

engine=xxx,如:engine=innodb

2>字符集及校对规则

字符集:
    gbk:专门存简体中文
    utf8:
        特点:中文字符占3个字符
    utf8mb4(推荐):是utf8的超级
        特点:中文字符占4个字符
    查看支持的字符集:show charset;
            
校对规则(collation):
    校对规则是跟着字符集走的
    查看所有的字符集:show  collation
        utf8mb4_general_ci:通用的校对,默认,不区分大小写
        utf8mb4_bin:区分大小写
    修改校对规则:ALTER DATABASE school CHARSET utf8mb4 COLLATE utf8mb4_bin

utf8与utf8mb4的区别?
a> utf8-->中文字符占3个字符,而utf8mb4-->中文字符占4个字符
b> utf8mb4支持emoji字符
c> utf8mb4支持ü

1.4 DDL语句

1.4.1 库定义

1>建库

CREATE DATABASE school CHARSET utf8mb4;    

建库的规范:

  • 库名是小写
  • 库名不能是数字开头
  • 库名要和业务有关
  • 建库时需要设定字符集
    2>删库
DROP DATABASE school;

3>修库

\\修改test库的字符集
wenjuan[(none)]>alter database test charset utf8mb4;   

\\修改test库的字符集和校对规则(默认utf8mb4_general_ci)
wenjuan[(none)]>ALTER DATABASE test CHARSET utf8mb4 COLLATE utf8mb4_bin   

4>查库(DQL)

wenjuan[(none)]>show databases;   \\查询所有的库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ceshi              |
| mysql              |
| performance_schema |
| school             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)
wenjuan[(none)]>show create database school;   \\查询指定库的属性
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| school   | CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

wenjuan[(none)]>
1.4.2 表定义

1>建表
标准的建表语句:

CREATE TABLE xs(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
NAME VARCHAR(20) NOT NULL COMMENT '姓名',
age TINYINT NOT NULL DEFAULT 0 COMMENT '年龄',
sex CHAR(1) NOT NULL DEFAULT 'n' COMMENT '性别',
shengfen ENUM('bj','sh','cq') NOT NULL DEFAULT 'bj' COMMENT '省份',
shijian DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
)ENGINE=INNODB CHARSET=utf8mb4;

建表规范:

  • 表名小写,无数字开头,与业务有关
  • 表中必须有主键,一般是一个自增长的无关列
  • 选择合适的数据类型,字符长度要适中
  • 每个列尽量是非空,并设定默认值
  • 每个列必须要有注释
  • 建表时必须设置存储引擎和字符集

    查看表结构信息:
    DESC xs;
    SHOW CREATE TABLE xs;

2>改表
(1)添加(重要)

举例1:在xs表中添加手机号列?(常用)
ALTER TABLE xs ADD  shouji CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号';

举例2:在xs表中的sex后面添加weixin列?
ALTER TABLE xs ADD weixin VARCHAR(64) NOT NULL UNIQUE KEY COMMENT '微信号' AFTER sex;

举例2:在xs表中的第一列位置添加QQ号列?
ALTER TABLE xs ADD qq VARCHAR(64) NOT NULL UNIQUE KEY COMMENT 'QQ号' FIRST;

(2)删除列(危险操作!!不代表生产操作!!!)

ALTER TABLE xs DROP qq;

(3)修改列属性

列名和属性都修改:(常用)
    ALTER TABLE xs CHANGE NAME sname  VARCHAR(64) NOT NULL COMMENT '姓名'

只改属性,不改列名:
    ALTER TABLE xf MODIFY sname VARCHAR(20);        

1.5 DCL语句

授权:grant 权限 on 范围  to 用户  identified by 密码;
权限回收:revoke 权限 on 范围  from 用户;

1.6 DML语句

专门用做表的数据行的增删改查

1.6.1 insert

1>完整写法:

INSERT INTO xs(id,sname,age,sex,shengfen,shijian,shouji) VALUES(1,'小花',18,'m','bj',NOW(),'18820012009')

2>简化插入数据:

INSERT INTO xs VALUES(2,'lis',19,'f','sh',NOW(),'18820012229');

3>针对性的插入数据:

INSERT INTO xs(sname,age,sex,shengfen,shouji) VALUES('arex',12,'m','bj','18820982089')

4>批量插入数据:

INSERT INTO xs(sname,age,sex,shengfen,shouji) VALUES('小小',20,'f','sh','18340982089'),('李四',23,'m','sh','17708982089'),('港盛',19,'f','bj','12345678901')
1.6.2 update
UPDATE xs SET age=31 WHERE id=1

注意:update语句必须要加where条件,否则很危险

1.6.3 delete
DELETE FROM xs WHERE id=2

注意:delete语句必须要加where条件,否则很危险

delete与trancate的区别?(面试题)
truncate:
   (1)DDL语句,清空整表的所有数据,按照区来删除的,属于物理删除.性能高.
   (2)表所占用的空间,会立即释放.
delete:
   (1)DML语句,清空整表的所有数据,按照行来删除的,属于逻辑删除.性能低.
   (2)表所占用的空间,不会立即释放.

1.6.4 使用update替代delete实现伪删除

1>添加一个状态列state

ALTER TABLE xs ADD state TINYINT NOT NULL DEFAULT 1 ;

2>用update替代delete

原语句:
    DELETE FROM xs WHERE id=6;
改写后:
    UPDATE xs SET state=0 WHERE id=6;

3>查询业务语句进行调整

原语句:
    select * from xs;
改写后:
    select * from xs where state=1;

未完……

你可能感兴趣的:(MySQL-SQL基础应用(SQL基础))