09-SQL语句基础与体系结构讲解

1.SQL介绍

1.什么是SQL

SQL,英文全称为Structured Query Language,中文是结构化查询语言,是一种对关系数据库数据定义和操作语言。

2.SQL分类

DDL	DDL全拼Data Definition Language,数据定义语言, [运维、DBA常用]
CREATE(创建)、ALTER(修改)、DROP(删除)

? Data Definition
特点:增删库\表\索引本身.

DCL	DCL全拼Data Control Language,数据控制语言,[运维、DBA常用]
主要关键字为GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚)。
执行mysql> ? Account Management,可查相关帮助。

DML	DML全拼Data Manipulation Language,数据操作语言,[开发人员常用,运维用的少,DBA审核开发SQL语句].
主要关键字为INSERT(增)、DELETE(删)、UPDATE(改),主要针对数据库里的表里的数据进行操作。
执行mysql> ? Data Manipulation,可查相关帮助

DQL	DQL全称Data Query Language,数据查询语言,作用是从表中获取数据。
关键字SELECT是用得最多的,相关常用保留字有WHERE、ORDER BY、GROUP BY和HAVING等。

2.SQL语句实践

0.DDL语句show查询

# 显示所有数据库的列表。
show databases;  
# 显示当前数据库中所有表的列表。
show tables; 
# 查看oldboy库里有多少个表
show tables from oldboy;
# 查字符集列表及校对规则
show charset;    
# 查权限列表
show privileges;
# 查用户授权
show grants for oldboy@'10.0.0.%'; 
# 查建库语句
show create database oldboy;  
# 查建表语句
show create table oldboy.stu; 
# 查正在运行sql语句
show processlist;
show full processlist;

#查mysql配置参数:可以存在于my.cnf中。
show variables; 
show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/3306/data/binlog       |
| log_bin_index                   | /data/3306/data/binlog.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+
6 rows in set (0.00 sec)
==========================================

# 查看数据库运行状态:ZABBIX监控数据库数据从这里获取。
show status; 
# 查看全局状态
show global status;
# 查看引擎innodb的状态
show engine innodb status; 
解读:
https://blog.csdn.net/github_26672553/article/details/52931263
# 查看索引
show index from mysql.user;
# 查看引擎
show engines;

show查询主从复制相关

show binary logs;  #二进制日志,记录更改数据库信息的语句 create insert update drop alter
SHOW BINLOG EVENTS IN 'binlog.000013'; # 查看某一个事件
SHOW RELAYLOG EVENTS # 查看中继日志事件
show master status; # 查看主的状态
show slave status;  # 查看从的状态

show slave hosts;  # 查看同步的主机
show plugins; # 查看插件

1.DDL语句只管理库

1.创建数据库

# 语法:
# 默认建库,字符集是utf8mb4
CREATE DATABASE dbanme;
# 指定字符集和校对规则建库
CREATE DATABASE db_name CHARACTER SET charset_name COLLATE collation_name
# 例子:
CREATE DATABASE oldboy;
# 创建一个名为 "oldgirl" 的数据库,并将其默认字符集设置为 UTF-8,排序规则设置为不区分大小写和重音符号。
# UTF-8 是一种常用的字符编码,支持包括中文在内的各种字符。
# 排序规则决定了数据库在执行比较和排序操作时使用的规则
# "utf8_general_ci" 是一种不区分大小写、不区分重音符号的排序规则,常用于多语言环境。
CREATE DATABASE oldgirl default character SET utf8 COLLATE utf8_general_ci;
# 默认创建相当于指定如下字符集
CREATE DATABASE oldboy; # 与下面是等价的(8.0.26)
# utf8mb4 是一种用于存储 Unicode 字符的字符集,支持存储任意的 Unicode 字符,包括表情符号等。
# "utf8mb4_0900_ai_ci" 是一种不区分大小写、不区分重音符号的排序规则,适用于 Unicode 字符集。
CREATE DATABASE oldgirl DEFAULT character SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
# 从0创建任意字符集的数据库
# 问:字符集和校对规则去哪查?
show charset;
? CREATE DATABASE
=========================
CREATE DATABASE db_name
CHARACTER SET gbk
COLLATE  gbk_chinese_ci;

2.查看建库语句

查看默认创建库的语句结果

mysql> show create database oldboy;
+----------+--------------------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------------------+
| oldboy   | CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create database oldgirl\G # 竖向格式化显示
*************************** 1. row ***************************
       Database: oldgirl
Create Database: CREATE DATABASE `oldgirl` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */
1 row in set (0.00 sec)

3.字符集和校对规则

show charset; #查支持的字符集和校对规则
show collation; #查支持的校对规则

4.有关字符集说明

8.0默认字符集是utf8mb4,是当前主流字符集,适合英文\中文,PC,移动端,物联网多场景。
utf8mb4大于utf8(utf8mb3),类似ext4大于ext3


重点知识:通过命令查出的建库语句结尾多了一些东西,其中DEFAULT CHARACTER SET utf8mb4,是数据库默认的字符集8.0之后是utf8mb4,8.0之前是latin1,查询字符集的命令为:show charset;。COLLATE utf8mb4_0900_ai_ci为校对规则,查询校对规则的命令为:show collation; 字符集的不一致会导致数据库中文内容出现乱码,后文章节会详细讲解字符集和校对规则,此处完全默认即可。

5.查看数据库

查看数据库的常用命令(可help show获得帮助)是:

show databases;                 #<==查询所有数据库。
show databases like 'oldboy';   #<==匹配oldboy字符串的内容。
show databases like 'oldboy%';  #<==%为通配符,表示匹配以oldboy开头的所有内容。

6.切换数据库

mysql> use oldboy          # cd /oldboy 进入到指定的库。


mysql> select database();  # 查看当前用户所在库pwd。
+------------+
| database() |
+------------+
| oldboy     |
+------------+
1 row in set (0.00 sec)


mysql> select user();       # 查看当前用户,类似whoami。
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

7.修改数据库

#语法:
ALTER DATABASE [db_name]
    CHARACTER SET = charset_name
    COLLATE = collation_name;

#例子:修改字符集为utf8
alter database oldboy charset utf8;

8.删除数据库

drop database oldboy;

9.管理库生产经验

1.管理员谨慎使用drop命令。
2.业务用户中,禁止有drop权限。
3.数据库名不能用大写字母,不能是关键字,不能使数字开头。
4.创建数据库时应显示设置字符集。
CREATE DATABASE oldboy CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

表知识小总结:

	1.数据类型
	2.约束属性
	3.引擎\字符集
	4.SELECT,insert,update,delete
	5.管理索引(表的列上)

2.DDL语句之管理表

1.表数据类型

表的数据类型作用于[列上]的,用于控制存储数据的格式和规范。

a.整型

表1:

列类型 存储容量 正数数字范围 负数数字范围 说明
tinyint(微小整型) 1bytes 0-255 -128~127 最大3位数
int 4bytes 0-2^32-1 -231~231-1 最大10位数
bigint 8bytes 0-2^64-1 -263~263-1 最大20位数

UNSIGNED:它表示该列只能存储非负整数值(包括零)

b.浮点型(小数)

除了整数之外,还有浮点数,一般用于对于精度要求很高的业务,例如和钱有关的业务,例如:99.99。 可以使用放大倍数手法把浮点数变成整数存储,例如:99.99放大100倍,为9999,使用在缩小100倍。 提示:在数据库里以整数形式存储,提高读取效率.

面试题:

1.请描述tinyint、int、 bigint区别?
2.你们公司怎么存储浮点数数据的? 
解答:金钱(精度要求高)有关的decimal,精度要求不高的,统一放大10的n次方倍,变成整型存储。

c.字符类型

char(10) 定长,浪费存储空间,作为条件列查询会更快。

varchar(10) 变长,节省空间

面试题:char(10) 和 varchar(10) 区别?

1.相同点:都是字符串类型,最多都只能存10个字符。
2.不同点
char    定长 浪费存储空间,作为条件列查询会更快(不要计算,直接读取内容相对多)
varchar 变长 节省空间,没有极特殊情况,尽量都用varchar
存储说明:
char(10)    存储 '       abc',左边补7个空格。
varchar(10) 存储 'abc'。 

d.时间类型

时间类型往往是数据表中的必备类型
列类型 存储容量 说明
timestamp 4字节 从1970-1-1到2038-1-19,秒数
datetime 8字节 从1000-1-1到9999-12-31

问题1:字符串类型可以放数字么?

可以,还是字符串类型。

问题2:那要数字类型还有啥用?

有用.  
1.数字可以用来计算的,而字符串不行.  
2.数字查询效率更高.

e.枚举类型

判断,选择:enum('N','Y')
性别:enum('F','M','N')
省份:固定多个简单值的内容。

mysql> show create table  mysql.user\G
`account_locked` enum('N','Y')
`Create_role_priv` enum('N','Y')
`Drop_role_priv` enum('N','Y')

f. 二进制类型

文件\图片

g. json

ELK、mongodb存储格式

2.表的约束属性

类型 说明
PRIMARY KEY 简写PK,设置于表主键列,非空且唯一,用于必填项且不能重复。
NOT NULL /NULL 表示列的内容是否非空,空列不利于数据库优化。
UNIQUE KEY 简写UK,表示列的内容唯一,#比如手机号,就不能重复。
FOREIGN KEY 简写FK,表示表的外键,多个表之间关联用的。

生产经验:

1.每张表务必设置一个主键列,建议是数字且自增,学号,身份证,订单编号。

2.表的每个列尽量设置非空,给默认值。

3.表的其他属性

类型 说明
AUTO_INCREMENT [=] value 设置主键自增长,一般为数字自增长,默认为1。
COMMENT [=] 'string' 对列等信息进行注释。
ENGINE [=] engine_name 指定表的底层存储引擎(MySQL文件系统),默认为 innodb。
CHARACTER SET [=] charset_name 指定表的字符集,默认为utf8mb4。
COLLATE [=] collation_name 指定表的校对规则
DEFAULT 设定列的默认值,,如果是时间列取当前时间。
unsigned 无符号数字(非负数)

4.建表

1)建库

drop database oldboy;
create database oldboy;
use oldboy;

2)在oldboy库创建表stu

create table <表名> (
 <字段名1> <类型1>  ...,
 <字段名2> <类型1>  ...,
…
<字段名n> <类型n>
);

下面是创建stu表的完整语句示例,表名为stu。

USE oldboy;
CREATE TABLE stu(
表的字段  表数据类型   表的约束属性  表的其他属性
id     INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname  VARCHAR(64) NOT NULL COMMENT '姓名',
age    TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
gender ENUM('M','F','N') NOT NULL DEFAULT 'N' COMMENT '性别',
telnum  CHAR(15) NOT NULL DEFAULT '0'  COMMENT '手机号'
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';

释义

id:整数类型,非空,主键,自增,用于表示学号。
sname:字符串类型,最大长度为64,非空,用于表示姓名。
age:无符号小整数类型,非空,默认为0,用于表示年龄。
gender:枚举类型,包含'M'、'F'和'N'三个值,非空,默认为'N',用于表示性别。
telnum:字符类型,固定长度为15,非空,默认为'0',用于表示手机号码。
该表使用InnoDB引擎,字符集为utf8mb4,表的注释为"学生表"。

5.查看表信息

# 查看表信息
show tables;或show tables from oldboy; 

# 查看建表语句
show create table stu\G

# 查看表结构
mysql> show create table stu\G
*************************** 1. row ***************************
       Table: stu
Create Table: CREATE TABLE `stu` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '学号',
  `sname` varchar(64) NOT NULL COMMENT '姓名',
  `age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '性别',
  `telnum` char(15) NOT NULL DEFAULT '0' COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'
1 row in set (0.02 sec)

# 查看表字段
mysql> desc stu;
+--------+-------------------+------+-----+---------+----------------+
| Field  | Type              | Null | Key | Default | Extra          |
+--------+-------------------+------+-----+---------+----------------+
| id     | int               | NO   | PRI | NULL    | auto_increment |
| sname  | varchar(64)       | NO   |     | NULL    |                |
| age    | tinyint unsigned  | NO   |     | 0       |                |
| gender | enum('M','F','N') | NO   |     | N       |                |
| telnum | char(15)          | NO   |     | 0       |                |
+--------+-------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

6.更改表名

rename table stu to test;
alter table test rename to stu;

7.增删改表字段(开发人员常用,了解)

(1)添加列默认到所有列结尾,命令语法为:
alter table 表名 {add|drop|modify} 字段 类型 其他;

#1.在stu表中添加addr列,默认是最后一列
ALTER TABLE stu ADD addr VARCHAR(100) NOT NULL COMMENT '地址';

#2.在sname列后插入dept列。使用after sname;
alter table stu add dept varchar(32) after sname;

#3.在首列插入qq列。使用first
alter table stu add qq varchar(15) first;

#4.若要同时添加以上两个字段,还可采用如下命令
alter table stu drop dept;
alter table stu drop qq;
alter table stu add dept varchar(32) after sname,add qq varchar(15)  first;

#5.修改字段类型的命令如下:
alter table stu modify dept char(64); #<==将dept数据类型及长度改为char(64)。

#6.删除列的命令如下
alter table stu drop qq;
alter table stu drop dept;
alter table stu drop addr;

有关字段修改生产经验:

1.如何改字段
需要开发把增删改字段语句,发给运维或者DBA,由DBA审核后,由DBA在线上执行。
2.online DDL,最好不做.添加到最后一个字段可以,其他情况在业务低谷执行,紧急情况pt工具.

常把数字列用于主键,只有数字主键才能自增.主键列不一定用数字.

8.删除表

drop table stu;

9.有关DDL表生产规范和经验

请简述你们公司在Schema设计过程中有哪些开发规范?

-- 库的DDL规范

1. 禁止线上业务系统出现DROP操作.
2. 库名: 不能大写字母,不能是关键字,不能使数字开头.一般和业务有关.
3. 显式设置字符集.

-- 表的DDL规范

1. 建表时,表名小写, 建议格式: wp_user,不要出现数字开头和大写字母
2. 显式的设置存储引擎\字符集\表的注释.
3. 列名要和业务有关
4. 列的数据类型,讲究:完整\简短\合适,精度不高浮点数,放大N倍.
5. 每个表必须要有主键,数字自增无关列.
6. 每个列尽量是非空的,而且设置默认值.
7. 每个列要有注释.
8. 变长列,一般选择varchar类型,定长列一般选择char. 
9. 大字段,可以选择附件形式,可以选择ES.
10. 对于Online-DDL ,对于追加方式添加列,可以online,添加索引可以online(8.0)
其他情况下,需要在数据库低谷时间点去做.如果很紧急,pt-osc或者gh-ost

3. DML语句之管理表数据

建立oldboy库,stu表

create database oldboy;
use oldboy;
drop table stu;
CREATE TABLE stu (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号', sname   VARCHAR(64) NOT NULL COMMENT '姓名', age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄', gender  ENUM('M','F','N') NOT NULL DEFAULT 'N' COMMENT '性别', telnum  CHAR(15) NOT NULL DEFAULT '0'  COMMENT '手机号' )ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表';

释义

id:整数类型,非空,主键,自增,用于表示学号。
sname:字符串类型,最大长度为64,非空,用于表示姓名。
age:无符号小整数类型,非空,默认为0,用于表示年龄。
gender:枚举类型,包含'M'、'F'和'N'三个值,非空,默认为'N',用于表示性别。
telnum:字符类型,固定长度为15,非空,默认为'0',用于表示手机号码。
该表使用InnoDB引擎,字符集为utf8mb4,表的注释为"学生表"。

1.往表中插入数据

INSERT关键字

第一种:指定列插入
INSERT INTO stu(id,sname,age,gender,telnum) VALUES(1,'oldboy',28,'M','111');
# 注意:数字不加引号,字符加引号
# 不要看长相,看字段属性,确定是否是字符和数字.
第二种:按顺序插入,可以不指定列(重点)
INSERT INTO stu VALUES(2,'oldgril',25,'F','126');
第三种:批量插入多行(节省IO),注意缩进。
INSERT INTO
	stu
VALUES 
	(3,'Jack',18,'M','189'),
	(4,'Tim',35,'F','183'); 
模拟批量插入:
delete from stu;
select * from stu;
INSERT INTO `stu` 
VALUES 
(1,'oldboy',28,'M','111'),
(2,'oldgril',25,'F','126'),
(3,'Jack',18,'M','189'),
(4,'Tim',35,'F','183');
只插入部分列,需要按顺序指定列名,且其他列允许为空,不允许为空有默认值
mysql> INSERT INTO stu(id,sname) VALUES(2,'oldgril');
Query OK, 1 row affected (0.00 sec)

mysql> select * from stu;
+----+---------+------+-----+--------+--------+
| id | sname   | dept | age | gender | telnum |
+----+---------+------+-----+--------+--------+
|  2 | oldgril | NULL |   0 | N      | 0      |
+----+---------+------+-----+--------+--------+
备份数据:
[root@db01 ~]# mysqldump -uroot -p123 -B oldboy >/opt/bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@db01 ~]# egrep -v "\-\-|\*|^$" /opt/bak.sql
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '学号',
  `sname` varchar(64) NOT NULL COMMENT '姓名',
  `age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
  `gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '性别',
  `telnum` char(15) NOT NULL DEFAULT '0' COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表';
LOCK TABLES `stu` WRITE;
INSERT INTO `stu` VALUES (1,'oldboy',28,'M','111'),(2,'oldgril',25,'F','126'),(3,'Jack',18,'M','189'),(4,'Tim',35,'F','183');
UNLOCK TABLES;

2.修改表的数据

update关键字,语法:
update 表名 set 字段='要改成的内容' where 条件列='内容';
练习1:把名字为Tim的人的年龄改为29
update stu set age=29 where sname='Tim';
练习2:把id为2的行的名字改为girl
update stu set sname='girl' where id=2;
练习3:把手机号为189的行,性别改为N?
update stu set gender='N' where telnum='189';
练习4.修改数据导致的事故案例和解决方案
不加条件执行下面语句:
update stu set sname='oldboy';

恢复:mysql -uroot -p123 oldboy</opt/bak.sql

3.生产经验:

1.禁止不带where条件操作数据库表
2.带where条件,也必须对查询的列建立索引
禁止不带where条件操作数据库表4种方法:
服务端[mysqld]两种方法:
sql_safe_updates作用:
在delete,update操作中,
	1)没有where条件.
	2)当where条件中列没有索引可用.
	3)且无limit限制时会拒绝更新。

方法1:临时执行mysql> set global sql_safe_updates=1;,退出重新登陆生效。自己控制自己.
方法2:永久生效
sql_safe_updates=1参数在my.cnf中添加启动报错。通过启动加载脚本方式来修改。
[root@db01 ~]# vi /etc/my.cnf
[mysqld]
init_file=/opt/init.sql
#新建脚本
echo 'set global sql_safe_updates=1;' >/opt/init.sql
chmod +x /opt/init.sql
/etc/init.d/mysqld restart
[root@db01 ~]# mysql -uroot -p123 -e "select @@global.sql_safe_updates"
+---------------------------+
| @@global.sql_safe_updates |
+---------------------------+
|                         1 |
+---------------------------+

客户端两种方法:mysql客户端防止误删
方法1:把safe_updates=1加入到my.cnf的client标签下。
[root@db01 ~]# cat /etc/my.cnf
#by oldboy weixin:oldboy0102
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
port=3306
socket=/tmp/mysql.sock

[client]
socket=/tmp/mysql.sock
safe_updates=1

注意:把sql_safe_updates=1加入到my.cnf的mysqld标签下这个不好用.
使用永久生效模式
方法2:设置别名alias mysql='mysql -U' ,并放入/etc/profile永久生效。


设置后效果:
mysql> update oldboy.stu set sname='oldboy';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE 

4.删除表的数据

delete from 表名 where 列名 条件;

mysql> use oldboy
mysql> delete from stu where id=3;     #<==删除id为3的行。
mysql> delete from stu where age=28;   #<==删除name 等于oldboy的行。
生产经验:禁止使用delete语句,数据库删除不用drop,delete,truncate

因为有安全更新参数所以age没有索引,不让删除.
mysql> delete from stu where age>28;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 

创建索引:
mysql> alter table stu add index i_age(age);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc stu;
+--------+-------------------+------+-----+---------+----------------+
| Field  | Type              | Null | Key | Default | Extra          |
+--------+-------------------+------+-----+---------+----------------+
| id     | int               | NO   | PRI | NULL    | auto_increment |
| sname  | varchar(64)       | NO   |     | NULL    |                |
| age    | tinyint unsigned  | NO   | MUL | 0       |                |
| gender | enum('M','F','N') | NO   |     | N       |                |
| telnum | char(15)          | NO   |     | 0       |                |
+--------+-------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)


#可以删除了
mysql> delete from stu where age>28;
Query OK, 1 row affected (0.00 sec)

*不让我用delete,但是我又有删除需求如何解决?*

5.伪删除数据(了解)

#1.添加state状态字段,默认为1。

ALTER TABLE stu ADD state TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1为存在,0为不存在';
mysql> desc stu;
+--------+-------------------+------+-----+---------+----------------+
| Field  | Type              | Null | Key | Default | Extra          |
+--------+-------------------+------+-----+---------+----------------+
| id     | int               | NO   | PRI | NULL    | auto_increment |
| sname  | varchar(64)       | NO   |     | NULL    |                |
| age    | tinyint unsigned  | NO   |     | 0       |                |
| gender | enum('M','F','N') | NO   |     | N       |                |
| telnum | char(15)          | NO   |     | 0       |                |
| state  | tinyint           | NO   |     | 1       |                | ###增加一列
+--------+-------------------+------+-----+---------+----------------+

2.显示数据语句:用下面语句
mysql> select * from stu where state=1; ###select * from stu
+----+---------+-----+--------+--------+-------+
| id | sname   | age | gender | telnum | state |
+----+---------+-----+--------+--------+-------+
|  1 | oldboy  |  28 | M      | 111    |     1 |
|  2 | oldgril |  25 | F      | 126    |     1 |
|  3 | Jack    |  18 | M      | 189    |     1 |
|  4 | Tim     |  35 | F      | 183    |     1 |
+----+---------+-----+--------+--------+-------+

3.伪删除

mysql> update stu set state=0 where id=4; #<==delete from stu where id=4;

# 删除结果:
mysql> select * from stu where state=1;
+----+---------+-----+--------+--------+-------+
| id | sname   | age | gender | telnum | state |
+----+---------+-----+--------+--------+-------+
|  1 | oldboy  |  28 | M      | 111    |     1 |
|  2 | oldgril |  25 | F      | 126    |     1 |
|  3 | Jack    |  18 | M      | 189    |     1 |
+----+---------+-----+--------+--------+-------+

# 实际上没有删除:
mysql> select * from stu;
+----+---------+-----+--------+--------+-------+
| id | sname   | age | gender | telnum | state |
+----+---------+-----+--------+--------+-------+
|  1 | oldboy  |  28 | M      | 111    |     1 |
|  2 | oldgril |  25 | F      | 126    |     1 |
|  3 | Jack    |  18 | M      | 189    |     1 |
|  4 | Tim     |  35 | F      | 183    |     0 |
+----+---------+-----+--------+--------+-------+

6.生产经验:

	等号后面字符串和数字,如何引用?
	1)字符串必须用引号引起来。
    2)数字不要引起来。
	注意:不要只看内容显示的表象,而要看实际列类型。

7.清空表的数据

truncate table stu

8.企业面试题:

drop table stu、truncate table stu、delete from stu,三个删除语句的区别 ?
答:三者相同点是都会删除表中的数据
区别说明
**drop table stu:**	
	同时删除表本身和表中数据,
	会立即释放磁盘空间,速度比TRUNCATE慢。
	
**truncate table stu**:	
    删除表中所有数据,表本身未删除,
    释放[数据页page]空间,并且只在事务日志中记录页的释放。并立即释放磁盘空间,速度快。
	
**delete from stu**:	        
    逐行"删除",逻辑删除表中的每行数据,表本身未删除
    并在事务日志中为所删除的每行记录一项,不会立即释放磁盘空间。

4.DQL语句之查询表中的数据

关键字select

1.查询表配置参数及函数

(1)查询系统变量以及配置参数
mysql> select @@datadir; #<==查看数据目录,也可用show variables like '%datadir%';
mysql> select @@socket;  #<==显示socket路径。

(2)执行函数
mysql> select now();      #<==显示当前日期时间。
mysql> select database(); #<==显示当前所在的库。
mysql> select user();     #<==显示当前的用户。

(3) 计算
mysql> select 100*(100+1)/2;
+---------------+
| 100*(100+1)/2 |
+---------------+
|     5050.0000 |
+---------------+

mysql> select 100*(100+1)/2+(0.1+0.5);
+-------------------------+
| 100*(100+1)/2+(0.1+0.5) |
+-------------------------+
|               5050.6000 |
+-------------------------+

2.查询表中的数据(重点)

1)[基础]命令语法为:
select <字段1,字段2,...> from <表名> [WHERE 条件]


2)测试数据:day02_world_oldboy.sql提前上传到Linux
上传文件到linux的根目录
然后到mysql里进行查看
# 这是通过system查看系统文件
mysql> system ls
day02_world_oldboy.sql	mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz  mysqld3307	mysqld3308
mysql> system pwd
/root
# 把文件内容传输进去
mysql>source ~/day02_world_oldboy.sql;

mysql> use world
Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |  # 城市
| country         |  # 国家
| countrylanguage |  # 国家语言
+-----------------+
3 rows in set (0.00 sec)


3)查看表结构
mysql> desc city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int      | NO   | PRI | NULL    | auto_increment |  # id
| Name        | char(35) | NO   |     |         |                |  # 名称
| CountryCode  | char(3)  | NO   | MUL|         |                |  # 国家代号
| District     | char(20) | NO   |    |         |                |  # 地域
| Population   | int      | NO   |    | 0       |                |  # 人口
+-------------+----------+------+-----+---------+----------------+

4)采用WHERE+等值(=)查询
#查询中国的所有城市信息
分析:
*表示所有列,CHN为中国代号。
mysql> select * from city where countrycode='CHN';
+------+---------------------+-------------+----------------+------------+
| ID   | Name                | CountryCode | District       | Population |
+------+---------------------+-------------+----------------+------------+
| 1890 | Shanghai            | CHN         | Shanghai       |    9696300 |
| 1891 | Peking              | CHN         | Peking         |    7472000 |
| 1892 | Chongqing           | CHN         | Chongqing      |    6351600 |
| 1893 | Tianjin             | CHN         | Tianjin        |    5286800 |
| 1894 | Wuhan               | CHN         | Hubei          |    4344600 |

#只查询中国的所有城市的名称和人口数量,CHN为中国代号。
mysql> select name,population from city where countrycode='CHN';
+---------------------+------------+
| name                | population |
+---------------------+------------+
| Shanghai            |    9696300 |
| Peking              |    7472000 |
| Chongqing           |    6351600 |
| Tianjin             |    5286800 |
| Wuhan               |    4344600 |

5)采用WHERE + 条件判断(</>/>=/<=/!=)查询

#查询大于700万人的所有城市信息
mysql> select * from city where population>7000000;
+------+-------------------+-------------+------------------+------------+
| ID   | Name              | CountryCode | District         | Population |
+------+-------------------+-------------+------------------+------------+
|  206 | São Paulo         | BRA         | São Paulo        |    9968485 |
|  456 | London            | GBR         | England          |    7285000 |
|  939 | Jakarta           | IDN         | Jakarta Raya     |    9604900 |
| 1024 | Mumbai (Bombay)   | IND         | Maharashtra      |   10500000 |
| 1025 | Delhi             | IND         | Delhi            |    7206704 |
| 1532 | Tokyo             | JPN         | Tokyo-to         |    7980230 |
| 1890 | Shanghai          | CHN         | Shanghai         |    9696300 |
| 1891 | Peking            | CHN         | Peking           |    7472000 |
| 2331 | Seoul             | KOR         | Seoul            |    9981619 |
| 2515 | Ciudad de México  | MEX         | Distrito Federal |    8591309 |
| 2822 | Karachi           | PAK         | Sindh            |    9269265 |
| 3357 | Istanbul          | TUR         | Istanbul         |    8787958 |
| 3580 | Moscow            | RUS         | Moscow (City)    |    8389200 |
| 3793 | New York          | USA         | New York         |    8008278 |
+------+-------------------+-------------+------------------+------------+
14 rows in set (0.00 sec)

#查询小于等于1000人的所有城市信息
mysql> select * from city where population<=1000;
+------+---------------------+-------------+-------------+------------+
| ID   | Name                | CountryCode | District    | Population |
+------+---------------------+-------------+-------------+------------+
|   61 | South Hill          | AIA         | –           |        961 |
|   62 | The Valley          | AIA         | –           |        595 |
| 1791 | Flying Fish Cove    | CXR         | –           |        700 |
| 2316 | Bantam              | CCK         | Home Island |        503 |
| 2317 | West Island         | CCK         | West Island |        167 |
| 2728 | Yaren               | NRU         | –           |        559 |
| 2805 | Alofi               | NIU         | –           |        682 |
| 2806 | Kingston            | NFK         | –           |        800 |
| 2912 | Adamstown           | PCN         | –           |         42 |
| 3333 | Fakaofo             | TKL         | Fakaofo     |        300 |
| 3538 | Città del Vaticano  | VAT         | –           |        455 |
+------+---------------------+-------------+-------------+------------+

成功要素:自信心,责任心,恒心

6)采用WHERE +逻辑判断符(AND/OR ) 查询

#查询中国境内,大于520万人口的城市信息
mysql> select * from city where countrycode='CHN' and population>5200000; #<==同时满足两个条件。
+------+-----------+-------------+-----------+------------+
| ID   | Name      | CountryCode | District  | Population |
+------+-----------+-------------+-----------+------------+
| 1890 | Shanghai  | CHN         | Shanghai  |    9696300 |
| 1891 | Peking    | CHN         | Peking    |    7472000 |
| 1892 | Chongqing | CHN         | Chongqing |    6351600 |
| 1893 | Tianjin   | CHN         | Tianjin   |    5286800 |
+------+-----------+-------------+-----------+------------+
4 rows in set (0.00 sec)

#查询中国和美国的所有城市 
mysql> select * from city where countrycode='chn' or countrycode='usa';
+------+-------------------------+-------------+----------------------+------------+
| ID   | Name                    | CountryCode | District             | Population |
+------+-------------------------+-------------+----------------------+------------+
| 1890 | Shanghai                | CHN         | Shanghai             |    9696300 |
| 1891 | Peking                  | CHN         | Peking               |    7472000 |
| 1892 | Chongqing               | CHN         | Chongqing            |    6351600 |
| 1893 | Tianjin                 | CHN         | Tianjin              |    5286800 |
| 3841 | Saint Louis             | USA         | Missouri             |     348189 |
| 3842 | Wichita                 | USA         | Kansas               |     344284 |
| 3843 | Santa Ana               | USA         | California           |     337977 |

7)采用WHERE + LIKE模糊查询(早期用于网站搜索框搜索)

#查询国家代号是CH开头的城市信息
SELECT * FROM city WHERE countrycode LIKE 'CH%';  ##CHXXXX
SELECT * FROM city WHERE countrycode LIKE '%US%'; ##ASDFASDFASDUSFASDF

查询慢的解决:
1.早期用于网站搜索框搜索,现在改为用ES做搜索.
2.Redis缓存
3.去一个从库查

8)采用WHERE + BETWEEN+AND区间查询
#查询人口数在100w到200w之间的城市信息,以下两条命令等同。
SELECT * FROM city WHERE population BETWEEN 1000000 AND 2000000;
SELECT * FROM city WHERE population>=1000000 AND population<=2000000;

作业:

见单独文件

来了解下 DataGrip,我们为解决专业 SQL 开发者的特定需求量身定做的全新数据库 IDE。
数据库客户端datagrip,写sql语句有自动提示,还能检测错误,并提示解决办法
posted @ 2023-07-25 13:41  猛踢瘸子nei条好腿  阅读(54)  评论(0)    收藏  举报