mysql入门操作
目录
一,MySQL简述
1,什么是MySQL
2,什么是SQL
3,SQL的分类
二,数据库的数据存储类型
1,数值类型
2,字符串类型
3,时间和日期类型
三,数据库的基本操作
1,DDL(对数据库,表的创建,删除修改等)
(1)数据库的创建,删除
(2)数据库表的创建,删除,修改,增添数据
2,数据库约束
主键约束(primary key):
默认值约束(default):
非空约束(not null):
唯一约束(unique):
外键约束(FOREIGN KEY (外键列名)REFERENCES 主表(参照列)):
检查约束:
3,复制表结构和数据:
四,SQL之DML
插入语句(insert into)
删除语句(delete from)
更新语句(update,replace)
查询语句(select):
简单的sql查询
条件查询(where)
分组统计与筛选(group by having):
查询结果排序(order by):
分页(limit):
多表关联查询:
五,SQL中的函数
聚合函数:
数值型函数:
字符串类型:
日期和时间函数:
流程控制函数:
一,MySQL简述
1,什么是MySQL
MySQL是一种开源的关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理,支持多用户、多线程及跨平台操作,具有高可靠性、高性能和易扩展性,广泛应用于Web应用、企业系统等领域,提供事务支持、ACID特性及多种存储引擎,是LAMP/LNMP等开发架构的核心组件之一。
2,什么是SQL
SQL(Structured Query Language,结构化查询语言)是一种专门用于管理关系型数据库的标准化编程语言,支持数据的定义、查询、操作和权限控制,通过简洁的语法(如SELECT
、INSERT
、UPDATE
、DELETE
等命令)实现数据库的创建、增删改查、事务管理及安全控制,是几乎所有关系型数据库(如MySQL、Oracle、SQL Server等)的核心交互接口。
3,SQL的分类
DDL:(Data Definition Language):数据定义语言,定义对数据库对象(库、表、列、索引)的操作。 CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML:(Data Manipulation Language): 数据操作语言,定义对数据库记录的操作。 INSERT、DELETE、UPDATE、SELECT等
DQL(Data Query Language):数据查询语言SELECT将数据的查询单独说明
DCL:(Data Control Language): 数据控制语言,定义对数据库、表、字段、用户的访问权限和安全级别。 GRANT、REVOKE等
二,数据库的数据存储类型
主要分三大类:数值类型,字符串类型,时间和日期类型
1,数值类型
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。 0 到 255 无符号*。在括号中规定最 大位数。 |
SMALLINT(size) | -32768 到 32767 常规。 0 到 65535 无符号*。在括号中 规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。 0 to 16777215 无符号*。在 括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。 0 到 4294967295 无 符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。 0 到18446744073709551615 无符号*。在括号中规定最大位 数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 |
2,字符串类型
数据类型 | 描述 |
---|---|
CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的长度。最多 255 个字符。 |
VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的最大长度。最多 255 个字 符。 注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 注释:这些值是按照你输入的顺序存储的。 可以按照此格式输入可能的值: ENUM('X','Y','Z') |
SET | 与 ENUM 类似, SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
3,时间和日期类型
数据类型 | 描述 |
---|---|
DATE() | 日期。格式: YYYY-MM-DD 注释:支持的范围是从 '1000-01-01' 到 '9999-12-31' |
DATETIME() | 日期和时间的组合。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是'1000-01-01 00:00:00' 到 '9999-12- 31 23:59:59' |
TIMESTAMP() | 时间戳。 TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() | 时间。格式: HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。 注释: 4 位格式所允许的值: 1901 到 2155。 2 位格式所允许 的值: 70 到69,表示从 1970 到 2069 |
三,数据库的基本操作
1,DDL(对数据库,表的创建,删除修改等)
(1)数据库的创建,删除
创建数据库 :create database 数据库名称;
mysql> create database t_test1;
创建数据库时设置字符编码:create database db_name default charset="utf8mb4";
mysql> create database school DEFAULT CHARACTER SET utf8mb4;
查看创建的数据库信息:show create database 数据库名称
mysql> show create database t_test1;
展示所有数据库:show databases;
使用或切换数据库:use 数据库名称;
mysql> use t_test1;
删除数据库:mysql> drop 数据库名称;
mysql> drop database t_test1;
(2)数据库表的创建,删除,修改,增添数据
创建表:
create table [if not exists] t_name (# 定义表结构字段名称1 类型 [约束条件],字段2 类型 [约束条件],……字段n 类型 [约束条件]
);
mysql> create table t_user(-> id int primary key,-> name varchar(50),-> age int ,-> gender char(5),-> address varchar(255),-> tel char(11)-> );
展示当前数据库的所有表格:show tables;
mysql> show tables;
+-------------------+
| Tables_in_t_test1 |
+-------------------+
| t_user |
+-------------------+
1 row in set (0.00 sec)
展示表结构:desc 数据库表
mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(5) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
插入数据:insert Into 数据库表(字段1,字段2),value(值1,值2);
mysql> insert into t_user(id,name,age,gender,address,tel) value(1,"张三","18","男","伍仙桥","10011001");
插入多条数据:
mysql> insert into t_user(id,name,age,gender,address,tel) value(2,"李四","19","男","伍仙桥","10011002"),-> (3,"王五","20","女","伍仙桥","10011003");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
简单查询数据库表的所有内容:select * from 数据库表
mysql> select * from t_user;
+----+--------+------+--------+-----------+----------+
| id | name | age | gender | address | tel |
+----+--------+------+--------+-----------+----------+
| 1 | 张三 | 18 | 男 | 伍仙桥 | 10011001 |
| 2 | 李四 | 19 | 男 | 伍仙桥 | 10011002 |
| 3 | 王五 | 20 | 女 | 伍仙桥 | 10011003 |
+----+--------+------+--------+-----------+----------+
3 rows in set (0.00 sec)
修改表结构:alter table 数据表 动作(modify,add...)
修改列类型
ALTER TABLE 表名 MODIFY 列名 列类型; -- 注意存在值的情况,类型不一定能成功
增加列
ALTER TABLE 表名 ADD 列名 列类型;
删除列
ALTER TABLE 表名 DROP 列名;
列改名
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
更改表名
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
修改列类型:
mysql> alter table t_user modify id varchar(255);
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | varchar(255) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(5) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
添加列:
mysql> alter table t_user add email varchar(255);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | varchar(255) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(5) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
删除列:
mysql> alter table t_user drop email;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | varchar(255) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(5) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
更改列名:
mysql> alter table t_user change id tid int;
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| tid | int | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(5) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
更改表名:
mysql> alter table t_user rename t_user1;
Query OK, 0 rows affected (0.02 sec)mysql> show tables;
+-------------------+
| Tables_in_t_test1 |
+-------------------+
| t_user1 |
+-------------------+
1 row in set (0.00 sec)
2,数据库约束
创建数据库表的时候,字段名称 该字段类型 [约束 [,……] ]
。
约束是在表上强制执行的数据校验规则。约束主要用于保证数据库的完整性。当表中数据有相互依赖性时,可以保护相关的数据不被删除。大部分数据库支持下面五类完整性约束:
存在如下一些数据库表的约束:
-
默认值约束
-
主键约束
-
非空约束
-
外键约束
-
唯一约束
-
检查约束 【MySQL8之前,不生效。MySQL8之后是支持检查约束】
主键约束(primary key):
主键从功能上看相当于非空且唯一,一个表中只允许一个主键,主键是表中唯一确定一行数据的字段。一般建议主键采用“int类型”,一般建议由数据库自身维护这个字段的值。当建立主键约束时,MySQL为主键创建对应的索引——主键索引,主键约束名总为PRIMARY。
设置id为主键:id int primary key 后面的auto_increment代表自增
mysql> create table t_user2(-> id int primary key auto_increment,-> age int-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user2;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| age | int | YES | | NULL | |
+-------+------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
此时插入数据id值不能为空且重复,因为id是主键,是这给条数据的唯一标识。
mysql> insert into t_user2(age) value(18);
Query OK, 1 row affected (0.00 sec)mysql> select * from t_user2;
+----+------+
| id | age |
+----+------+
| 1 | 18 |
+----+------+
1 row in set (0.00 sec)
再次插入id为1时报错:
mysql> insert into t_user2(id,age) value(1,18);
ERROR 1062 (23000): Duplicate entry '1' for key 't_user2.PRIMARY'
当设置自动增长时,插入id为NULL不会报错,会自增:
mysql> insert into t_user2(id,age) value(null,18);
Query OK, 1 row affected (0.00 sec)mysql> select * from t_user2;
+----+------+
| id | age |
+----+------+
| 1 | 18 |
| 2 | 18 |
+----+------+
2 rows in set (0.00 sec)
默认值约束(default):
给定的字段,设置默认值。
mysql> create table t_user2(-> id int primary key auto_increment,-> uname varchar(50),-> age int default 18-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| uname | varchar(50) | YES | | NULL | |
| age | int | YES | | 18 | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
插入数据时若没给指定的值,会在该字段添加默认值
mysql> insert into t_user2(uname) value("张三");
Query OK, 1 row affected (0.01 sec)mysql> select * from t_user2;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 1 | 张三 | 18 |
+----+--------+------+
非空约束(not null):
不允许字段的值为空。
mysql> create table t_user2(-> id int primary key auto_increment,-> uname varchar(50) not null,-> age int-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| uname | varchar(50) | NO | | NULL | |
| age | int | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
设置uname为不允许null之后,插入数据必须要给uname值
mysql> insert into t_user2(uname) value("张三");
Query OK, 1 row affected (0.00 sec)mysql> insert into t_user2(age) value(18);
ERROR 1364 (HY000): Field 'uname' doesn't have a default value
mysql> select * from t_user2-> ;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 1 | 张三 | NULL |
+----+--------+------+
1 row in set (0.00 sec)
唯一约束(unique):
唯一约束的作用,是保证该字段的值是唯一的,值不允许重复。
唯一性约束条件确保所在的字段或者字段组合不出现重复值
同一张表内可建多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引——唯一索引。
如果不给唯一约束起名,该唯一约束默认与列名相同。
mysql> create table t_user2(-> id int primary key auto_increment,-> uname varchar(50),-> age int not null,-> email varchar(50) unique-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| uname | varchar(50) | YES | | NULL | |
| age | int | NO | | NULL | |
| email | varchar(50) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
插入的数据在该字段中必须不同
mysql> insert into t_user2(uname,age,email) value("李四",20,"123@123.com");
Query OK, 1 row affected (0.01 sec)mysql> insert into t_user2(uname,age,email) value("王五",20,"123@123.com");
ERROR 1062 (23000): Duplicate entry '123@123.com' for key 't_user2.email'
外键约束(FOREIGN KEY (外键列名)REFERENCES 主表(参照列)):
外键:指的是两张或者多张表之间关联关系的字段。
外键约束:是表的约束,是约束表在插入外键数据时能够正确的插入,即给a表某个字段设置外键关联b表某个字段,a表该字段的数据插入或者修改时必须是b表其对应字段的数据。
首先得先有b表:
mysql> create table t_class(-> id int primary key auto_increment,-> cname varchar(50)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into t_class(cname) value("MYSQL");
Query OK, 1 row affected (0.01 sec)mysql> select * from t_class;
+----+-------+
| id | cname |
+----+-------+
| 1 | MYSQL |
+----+-------+
1 row in set (0.00 sec)
再创建a表设置外键约束:
mysql> create table t_stu(-> id int primary key auto_increment,-> sname varchar(50),-> c_id int,-> foreign key (c_id) references t_class(id)-> );
Query OK, 0 rows affected (0.03 sec)mysql> desc t_stu;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| sname | varchar(50) | YES | | NULL | |
| c_id | int | YES | MUL | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
只能插入t_class表中id字段含有的值
mysql> insert into t_stu(sname,c_id) value("张三",1);
Query OK, 1 row affected (0.01 sec)mysql> insert into t_stu(sname,c_id) value("李四",2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t_test1`.`t_stu`, CONSTRAINT `t_stu_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `t_class` (`id`))
mysql> select * from t_stu;
+----+--------+------+
| id | sname | c_id |
+----+--------+------+
| 1 | 张三 | 1 |
+----+--------+------+
1 row in set (0.00 sec)
检查约束:
⚠️ 注意:检查约束在MySQL8之前是不生效的,当然也不报错。MySQL8之后,就支持了检查约束。
mysql> create table t_user2(-> id int primary key auto_increment,-> name varchar(50),-> age int check(age>=18),-> gender enum("男","女")-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user2;
+--------+-------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
+--------+-------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
会检测插入的数据是否满足要求:
mysql> insert into t_user2(-> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
mysql> insert into t_user2(name,age,gender) value("张三",18,"男");
Query OK, 1 row affected (0.00 sec)mysql> insert into t_user2(name,age,gender) value("李四",12,"男");
ERROR 3819 (HY000): Check constraint 't_user2_chk_1' is violated.
mysql> insert into t_user2(name,age,gender) value("王五",20,"动物");、
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> select * from t_user2;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 张三 | 18 | 男 |
+----+--------+------+--------+
1 row in set (0.00 sec)
3,复制表结构和数据:
复制一个表结构的实现方法有两种
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。
create table 新表名 like 源表如果已经存在一张机构一致的表,复制数据
insert into 表 select * from 原表;方法二:在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表
记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。
create table 新表名 select * from 源表
如果直接复制表结构,则会默认将约束也复制过来
如果复制表结构的同时,复制数据,则不会复制约束
复制表结构
mysql> select * from t_user2;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 张三 | 18 | 男 |
+----+--------+------+--------+
1 row in set (0.00 sec)mysql> desc t_user2;
+--------+-------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
+--------+-------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)mysql> create table t_user3 like t_user2;
Query OK, 0 rows affected (0.02 sec)mysql> desc t_user3;
+--------+-------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
+--------+-------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)mysql> select * from t_user3;
Empty set (0.00 sec)mysql> insert into t_user3 select * from t_user2;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0mysql> select * from t_user3;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 张三 | 18 | 男 |
+----+--------+------+--------+
1 row in set (0.00 sec)mysql>
没有复制表结构
mysql> create table t_user4 select * from t_user2;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0mysql> desc t_user4;
+--------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | enum('男','女') | YES | | NULL | |
+--------+-------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)mysql> select * from t_user4;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 张三 | 18 | 男 |
+----+--------+------+--------+
1 row in set (0.00 sec)
四,SQL之DML
数据库使用时,大多数情况下,开发者只会操作数据,也是就增删改查(CRUD)。是核心,是任何一个IT人士必备技能。增删改查四条语句,最重要的是查询(DQL)。
有关数据表的DML操作INSERT INTO、DELETE、TRUNCATE、UPDATE、SELECT、条件查询、查询排序、聚合函数、分组查询
插入语句(insert into)
插入一条数据:insert into 数据表(字段一,字段二)value(值一,值二)
注意插入值时要注意对应的类型:字符类型插入值时要加引号,数值数据插入时,可以加引号也可以不加引号。
mysql> create table t_user1(-> id int primary key auto_increment,-> uname varchar(50),-> age int-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into t_user1(uname,age) value("张三",18);
Query OK, 1 row affected (0.01 sec)mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 1 | 张三 | 18 |
+----+--------+------+
1 row in set (0.00 sec)
插入多条数据
mysql> insert into t_user1(uname,age) values("李四",19),("王五","20");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 1 | 张三 | 18 |
| 2 | 李四 | 19 |
| 3 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)mysql>
删除语句(delete from)
删除指定数据行delete from 数据表 where 条件:
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 1 | 张三 | 18 |
| 2 | 李四 | 19 |
| 3 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)mysql> delete from t_user1 where id=1;
Query OK, 1 row affected (0.04 sec)mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 2 | 李四 | 19 |
| 3 | 王五 | 20 |
+----+--------+------+
2 rows in set (0.00 sec)
删除所有数据(delete from 数据表):
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 2 | 李四 | 19 |
| 3 | 王五 | 20 |
+----+--------+------+
2 rows in set (0.00 sec)mysql> delete from t_user1;
Query OK, 2 rows affected (0.03 sec)mysql> select * from t_user1;
Empty set (0.00 sec)
更新语句(update,replace)
updata更新指定语句 update 数据表名 set 字段名=值1 where 条件:
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 张三 | 18 |
| 5 | 李四 | 19 |
| 6 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)mysql> update t_user1 set uname="杨六" where age=18;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 19 |
| 6 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)
update更新字段的所有数据 pdate 数据表名 set 字段名=值1:
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 19 |
| 6 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.00 sec)mysql> update t_user1 set age=18;
Query OK, 2 rows affected (0.03 sec)
Rows matched: 3 Changed: 2 Warnings: 0mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
+----+--------+------+
3 rows in set (0.00 sec)
replace更新数据(用法更插入数据类似:replace into 数据表(字段1,字段2) value(值1,值2)):
使用replace时是根据表中主键查找数据,如果存在数据则删除数据,再插入新数据,如果不存在主键,则新增加数据。
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
+----+--------+------+
3 rows in set (0.00 sec)mysql> replace into t_user1(uname,age) value("王五",20);
Query OK, 1 row affected (0.03 sec)mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 王五 | 20 |
+----+--------+------+
4 rows in set (0.00 sec)
更新数据:先删除再插入
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 王五 | 20 |
+----+--------+------+
4 rows in set (0.00 sec)mysql> replace into t_user1(id,uname,age) value(7,"小二",20);
Query OK, 2 rows affected (0.03 sec)mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 小二 | 20 |
+----+--------+------+
4 rows in set (0.00 sec)
查询语句(select):
简单的sql查询
#查询所有数据mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 小二 | 20 |
+----+--------+------+
4 rows in set (0.00 sec)#查询指定字段
mysql> select uname,age from t_user1;
+--------+------+
| uname | age |
+--------+------+
| 杨六 | 18 |
| 李四 | 18 |
| 王五 | 18 |
| 小二 | 20 |
+--------+------+
4 rows in set (0.00 sec)
条件查询(where)
条件判断
=
判断两次的值是否相等
is
判断空null
is not null
来判断不为空
<=>
可以判断null或者普通值
!=
不等于
<>
也是不等于逻辑运算符
and
or
not
#等值查询mysql> select uname,age from t_user1 where age=20;
+--------+------+
| uname | age |
+--------+------+
| 小二 | 20 |
+--------+------+
1 row in set (0.00 sec)#等值判断查询
mysql> select * from t_user1 where age<=20;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 小二 | 20 |
+----+--------+------+
4 rows in set (0.03 sec)#NULL不能用=判断
mysql> select * from t_user1;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 4 | 杨六 | 18 |
| 5 | 李四 | 18 |
| 6 | 王五 | 18 |
| 7 | 小二 | 20 |
| 8 | 黄七 | 23 |
| 9 | 张三 | 44 |
| 10 | 唐九 | 37 |
| 11 | 帅哥 | NULL |
+----+--------+------+
8 rows in set (0.00 sec)mysql> select * from t_user1 where age=NULL;
Empty set (0.03 sec)mysql> select * from t_user1 where age is NULL;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 11 | 帅哥 | NULL |
+----+--------+------+
1 row in set (0.00 sec)#逻辑算运算符
mysql> select * from t_user1 where age>=20 and age<=30;
+----+--------+------+
| id | uname | age |
+----+--------+------+
| 7 | 小二 | 20 |
| 8 | 黄七 | 23 |
+----+--------+------+
2 rows in set (0.00 sec)#别名
mysql> select uname as "名字",age as "年龄" from t_user1 where age between 20 and 30;
+--------+--------+
| 名字 | 年龄 |
+--------+--------+
| 小二 | 20 |
| 黄七 | 23 |
+--------+--------+
2 rows in set (0.03 sec)
分组统计与筛选(group by having):
#分组mysql> select gender as "性别" from t_user1 group by gender;
+--------+
| 性别 |
+--------+
| 女 |
| 男 |
+--------+
2 rows in set (0.00 sec)#统计
mysql> select gender as "性别",count(*) as "人数" from t_user1 group by gender;
+--------+--------+
| 性别 | 人数 |
+--------+--------+
| 女 | 3 |
| 男 | 5 |
+--------+--------+
2 rows in set (0.00 sec)#分组后的条件筛选
mysql> select gender as "性别",count(*) as "人数" from t_user1 group by gender having count(gender)>4;
+--------+--------+
| 性别 | 人数 |
+--------+--------+
| 男 | 5 |
+--------+--------+
1 row in set (0.00 sec)
查询结果排序(order by):
# 默认升序
mysql> select * from t_user1 order by age;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 11 | 帅哥 | NULL | 男 |
| 4 | 杨六 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
| 6 | 王五 | 18 | 女 |
| 7 | 小二 | 20 | 男 |
| 8 | 黄七 | 23 | 男 |
| 10 | 唐九 | 37 | 男 |
| 9 | 张三 | 44 | 男 |
+----+--------+------+--------+
8 rows in set (0.00 sec)# 设置降序
mysql> select * from t_user1 order by age desc;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 9 | 张三 | 44 | 男 |
| 10 | 唐九 | 37 | 男 |
| 8 | 黄七 | 23 | 男 |
| 7 | 小二 | 20 | 男 |
| 4 | 杨六 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
| 6 | 王五 | 18 | 女 |
| 11 | 帅哥 | NULL | 男 |
+----+--------+------+--------+
8 rows in set (0.00 sec)#设置升序
mysql> select * from t_user1 order by age asc;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 11 | 帅哥 | NULL | 男 |
| 4 | 杨六 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
| 6 | 王五 | 18 | 女 |
| 7 | 小二 | 20 | 男 |
| 8 | 黄七 | 23 | 男 |
| 10 | 唐九 | 37 | 男 |
| 9 | 张三 | 44 | 男 |
+----+--------+------+--------+
8 rows in set (0.00 sec)#存在多字段排序时,根据顺序依次排序
mysql> select * from t_user1 order by age asc,id desc;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 11 | 帅哥 | NULL | 男 |
| 6 | 王五 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
| 4 | 杨六 | 18 | 女 |
| 7 | 小二 | 20 | 男 |
| 8 | 黄七 | 23 | 男 |
| 10 | 唐九 | 37 | 男 |
| 9 | 张三 | 44 | 男 |
+----+--------+------+--------+
8 rows in set (0.00 sec)
分页(limit):
limit num # 查询多少条
limit num1, num2; # num1: 偏移量, num2 : 每页的数量
#显示前几条数据:
mysql> select * from t_user1;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 4 | 杨六 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
| 6 | 王五 | 18 | 女 |
| 7 | 小二 | 20 | 男 |
| 8 | 黄七 | 23 | 男 |
| 9 | 张三 | 44 | 男 |
| 10 | 唐九 | 37 | 男 |
| 11 | 帅哥 | NULL | 男 |
+----+--------+------+--------+
8 rows in set (0.00 sec)mysql> select * from t_user1 limit 2;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 4 | 杨六 | 18 | 女 |
| 5 | 李四 | 18 | 女 |
+----+--------+------+--------+
2 rows in set (0.00 sec)#偏移前两条数据,显示后面4条数据:
mysql> select * from t_user1 limit 2,4;
+----+--------+------+--------+
| id | uname | age | gender |
+----+--------+------+--------+
| 6 | 王五 | 18 | 女 |
| 7 | 小二 | 20 | 男 |
| 8 | 黄七 | 23 | 男 |
| 9 | 张三 | 44 | 男 |
+----+--------+------+--------+
4 rows in set (0.00 sec)
多表关联查询:
#先看两张表的结构
mysql> select * from t_stu;
+----+--------+------+
| id | sname | c_id |
+----+--------+------+
| 1 | 张三 | 1 |
| 3 | 李四 | 2 |
| 4 | 王五 | 3 |
| 5 | 老六 | 4 |
+----+--------+------+
4 rows in set (0.00 sec)mysql> select * from t_class;
+----+-----------------------+
| id | cname |
+----+-----------------------+
| 1 | MYSQL |
| 2 | Python |
| 3 | JAVA |
| 4 | 计算机网络基础 |
+----+-----------------------+
4 rows in set (0.00 sec)#直接查询两张表(引发笛卡尔积现象)
mysql> select * from t_stu,t_class;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 5 | 老六 | 4 | 1 | MYSQL |
| 4 | 王五 | 3 | 1 | MYSQL |
| 3 | 李四 | 2 | 1 | MYSQL |
| 1 | 张三 | 1 | 1 | MYSQL |
| 5 | 老六 | 4 | 2 | Python |
| 4 | 王五 | 3 | 2 | Python |
| 3 | 李四 | 2 | 2 | Python |
| 1 | 张三 | 1 | 2 | Python |
| 5 | 老六 | 4 | 3 | JAVA |
| 4 | 王五 | 3 | 3 | JAVA |
| 3 | 李四 | 2 | 3 | JAVA |
| 1 | 张三 | 1 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
| 4 | 王五 | 3 | 4 | 计算机网络基础 |
| 3 | 李四 | 2 | 4 | 计算机网络基础 |
| 1 | 张三 | 1 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
16 rows in set (0.00 sec)#给上条件可以解决
mysql> select * from t_stu,t_class where t_stu.c_id = t_class.id;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 1 | 张三 | 1 | 1 | MYSQL |
| 3 | 李四 | 2 | 2 | Python |
| 4 | 王五 | 3 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
4 rows in set (0.00 sec)#使用join(没有条件时引发笛卡尔积)
mysql> select * from t_stu join t_class;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 5 | 老六 | 4 | 1 | MYSQL |
| 4 | 王五 | 3 | 1 | MYSQL |
| 3 | 李四 | 2 | 1 | MYSQL |
| 1 | 张三 | 1 | 1 | MYSQL |
| 5 | 老六 | 4 | 2 | Python |
| 4 | 王五 | 3 | 2 | Python |
| 3 | 李四 | 2 | 2 | Python |
| 1 | 张三 | 1 | 2 | Python |
| 5 | 老六 | 4 | 3 | JAVA |
| 4 | 王五 | 3 | 3 | JAVA |
| 3 | 李四 | 2 | 3 | JAVA |
| 1 | 张三 | 1 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
| 4 | 王五 | 3 | 4 | 计算机网络基础 |
| 3 | 李四 | 2 | 4 | 计算机网络基础 |
| 1 | 张三 | 1 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
16 rows in set (0.00 sec)#带上条件
mysql> select * from t_stu join t_class where t_stu.c_id = t_class.id;
+----+--------+------+----+-----------------------+
| id | sname | c_id | id | cname |
+----+--------+------+----+-----------------------+
| 1 | 张三 | 1 | 1 | MYSQL |
| 3 | 李四 | 2 | 2 | Python |
| 4 | 王五 | 3 | 3 | JAVA |
| 5 | 老六 | 4 | 4 | 计算机网络基础 |
+----+--------+------+----+-----------------------+
4 rows in set (0.00 sec)
五,SQL中的函数
聚合函数:
函数名称 | 作用 |
---|---|
MAX | 查询指定列的最大值 |
MIN | 查询指定列的最小值 |
COUNT | 统计查询结果的行数 |
SUM | 求和,返回指定列的总和 |
AVG | 求平均值,返回指定列数据的平均值 |
数值型函数:
函数名称 | 作用 |
---|---|
ABS | 求绝对值 |
SQRT | 求平方根 |
POW 和 POWER | 两个函数的功能相同,返回参数的幂次方 |
MOD | 求余数 |
CEIL 和 CEILING | 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整 |
FLOOR | 向下取整,返回值转化为一个BIGINT |
RAND | 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列 |
ROUND | 对所传参数进行四舍五入 |
SIGN | 返回参数的符号 |
字符串类型:
函数名称 | 作用 |
---|---|
LENGTH | 计算字符串长度函数,返回字符串的字节长度 |
CHAR_LENGTH | 计算字符串长度函数,返回字符串的字节长度,注意两者的区别 |
CONCAT | 合并字符串函数,返回结果为连接参数产生的字符串,参数可以使一个或多个 |
INSERT(str,pos,len,newstr) | 替换字符串函数 |
LOWER | 将字符串中的字母转换为小写 |
UPPER | 将字符串中的字母转换为大写 |
LEFT(str,len) | 从左侧字截取符串,返回字符串左边的若干个字符 |
RIGHT | 从右侧字截取符串,返回字符串右边的若干个字符 |
TRIM | 删除字符串左右两侧的空格 |
REPLACE(s,s1,s2) | 字符串替换函数,返回替换后的新字符串 |
SUBSTRING(s,n,len) | 截取字符串,返回从指定位置开始的指定长度的字符换 |
REVERSE | 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串 |
STRCMP(expr1,expr2) | 比较两个表达式的顺序。若expr1 小于 expr2 ,则返回 -1,0相等,1则相反 |
LOCATE(substr,str [,pos]) | 返回第一次出现子串的位置 |
INSTR(str,substr) | 返回第一次出现子串的位置 |
日期和时间函数:
函数名称 | 作用 |
---|---|
CURDATE() CURRENT_DATE() CURRENT_DATE | 两个函数作用相同,返回当前系统的日期值 |
CURTIME() CURRENT_TIME() CURRENT_TIME | 两个函数作用相同,返回当前系统的时间值 |
NOW | 返回当前系统的日期和时间值 |
SYSDATE | 返回当前系统的日期和时间值 |
DATE | 获取指定日期时间的日期部分 |
TIME | 获取指定日期时间的时间部分 |
MONTH | 获取指定日期中的月份 |
MONTHNAME | 获取指定曰期对应的月份的英文名称 |
DAYNAME | 获取指定曰期对应的星期几的英文名称 |
YEAR | 获取年份,返回值范围是 1970〜2069 |
DAYOFWEEK | 获取指定日期对应的一周的索引位置值,也就是星期数,注意周日是开始日,为1 |
WEEK | 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1 〜53 |
DAYOFYEAR | 获取指定曰期是一年中的第几天,返回值范围是1~366 |
DAYOFMONTH 和 DAY | 两个函数作用相同,获取指定日期是一个月中是第几天,返回值范围是1~31 |
DATEDIFF(expr1,expr2) | 返回两个日期之间的相差天数,如 SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); |
SEC_TO_TIME | 将秒数转换为时间,与TIME_TO_SEC 互为反函数 |
TIME_TO_SEC | 将时间参数转换为秒数,是指将传入的时间转换成距离当天00:00:00的秒数,00:00:00为基数,等于 0 秒 |
流程控制函数:
函数名称 | 作用 |
---|---|
IF(expr,v1,v2) | 判断,流程控制,当expr = true时返回 v1,当expr = false、null 、 0时返回v2 |
IFNULL(v1,v2) | 判断是否为空,如果 v1 不为 NULL,则 IFNULL 函数返回 v1,否则返回 v2 |
CASE | 搜索语句 |
相关文章:
mysql入门操作
目录 一,MySQL简述 1,什么是MySQL 2,什么是SQL 3,SQL的分类 二,数据库的数据存储类型 1,数值类型 2,字符串类型 3,时间和日期类型 三,数据库的基本操作 1&…...
机械臂【逆运动学】
回顾正运动学fk: IK: 几何法 代数法 六轴 456轴交再同一点 有解析解 下列公式为正运动学部分结论 a和d是长度 ,theta和alfa是角度 **疑问:alfa00? Z轴互相平行 ** 已知末端要在空间XYZ处如下 绿色项&#x…...
思库拉水厂开业庆典千人大会回顾
近日,思库拉离子水厂在广州隆重举办了开业盛典,现场汇聚了逾千名嘉宾。此次盛会不仅是对思库拉离子水厂正式投产的庆祝,更是对思库拉品牌未来蓝图的一次展示。 现场氛围热烈,洋溢着浓厚的喜庆气息。参与者来自五湖四海,既有思库拉的忠实拥趸,也有对思库拉产品充满兴趣的潜在消费…...
将Wi-Fi模块订阅MQTT主题以获取最新的固件版本推送信息
将Wi-Fi模块订阅MQTT主题以获取最新的固件版本推送信息,是一种常见的物联网(IoT)应用场景。这种设计可以实现远程监控和设备的OTA(Over-The-Air)升级功能。以下是详细的实现步骤和技术细节: 一、系统架构概…...
Netty源码—5.Pipeline和Handler一
大纲 1.Pipeline和Handler的作用和构成 2.ChannelHandler的分类 3.几个特殊的ChannelHandler 4.ChannelHandler的生命周期 5.ChannelPipeline的事件处理 6.关于ChannelPipeline的问题整理 7.ChannelPipeline主要包括三部分内容 8.ChannelPipeline的初始化 9.ChannelPi…...
Vue 中的nextTick函数的原理、作用及使用场景。
大白话Vue 中的nextTick函数的原理、作用及使用场景 在 Vue 里,nextTick 函数是个超实用的工具,它能让你在 DOM 更新完成之后再执行代码。为了能更好地理解 nextTick 函数的原理,咱们就来深入剖析一下。 核心思路 Vue 里的数据更新是异步执…...
详细讲解css的穿透方法
样式穿透(CSS穿透)的几种方法,包括在Vue中使用::v-deep、>>>、/deep/,还有pointer-events属性。还有关于Shadow DOM和::part伪元素的内容。接下来我会把这些方法分类,并详细说明每种方法的适用场景和注意事项…...
深入理解 tree 命令行工具:目录结构可视化的利器
文章目录 前言1. 什么是 tree 命令?安装 tree 2. tree 的基本用法显示当前目录的树状结构显示指定目录的树状结构 3. tree 的常用选项3.1 显示隐藏文件3.2 排除特定目录或文件3.3 限制递归深度3.4 显示文件大小3.5 显示文件的权限信息3.6 将输出保存到文件 4. 实际应…...
【QA】QT中事件和信号的区别以及联系是什么?
在 Qt 中,事件(Event) 和 信号与槽(Signals & Slots) 是 GUI 编程的核心机制,它们既有联系又有本质区别。以下从底层原理、触发流程、代码实现、适用场景四个维度展开对比,并通过大量示例说…...
C++实用函数:find与find_if
本篇来介绍C++中find和find_if函数的使用,通过多个实例来演示。 find用于基础的查找功能,find_if可以实现更复杂的匹配查找条件。 1 find 1.1 函数原型 template <class InputIterator, class T> InputIterator find ( InputIterator first, InputIterator last, c…...
全面了解 Cookies、Session 和 Token
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
酷淘商场项目【从零到一详解】Web端
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
如何转移虚拟主机?最新虚拟主机迁移方法
转移网站并不困难,但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石,全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…...
JVM 核心知识点总结
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
无人机数据链技术详解,无人机图传数传技术,无人机数据传输技术原理
以下是对无人机数据链技术、无人机图传数传技术以及无人机数据传输技术原理的详细解释: 无人机数据链技术 无人机数据链是任务机、地面控制站之间,以及任务机与中继机、武器系统或其它操作平台之间,按照约定的通信协议和信息传输方式&#…...
【Linux】同步原理剖析及模拟BlockQueue生产消费模型
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【AVRCP】GOEP互操作性深度解析:蓝牙封面艺术传输的技术实现与演进
目录 一、技术基础:协议架构与核心概念 1.1 GOEP协议体系解析 1.2 IrOBEX协议关键技术 1.3 版本强制性要求 1.4 关键特性对比(GOEP v2.0 vs v1.1) 1.5 关键技术实现细节 1.6 GOEP v2.0互操作性要求 1.7 IrOBEX v1.5互操作性要求 二、…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
《Oracle DBA入门实战:十大高频问题详解与避坑指南》
Oracle DBA 入门作业十问十答 本文为 Oracle DBA 入门作业整理,涵盖工具使用、配置管理及权限控制等核心知识点,适合新手快速上手。 如有疑问或补充,欢迎评论区交流! 1. DBA 常用工具有哪些? Oracle Universal Instal…...
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent(二十四)
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent 引言 在 Android 应用开发中,动画是提升用户体验的重要手段。它能够让界面元素的显示与隐藏、状态的切换变得更加自然和流畅,避免生硬的变化给用户带来不佳…...
【线程安全问题的原因和方法】【java形式】【图片详解】
在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…...
Cocos Creator Shader入门实战(六):使用setProperty动态设置材质属性,以及材质常用接口
引擎:3.8.5 您好,我是鹤九日! 回顾 上篇文章,我们主要讲解了关于材质的使用,主要有这么几点: 一、没有Effect资源,材质无从说起。 二、材质的构建,支持编译器和代码的动态构建 三…...
编程题记录3
九宫幻方 题目链接:https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&second_category_id3&tags%E7%9C%81%E8%B5%9B&tag_relationintersection 先旋转、镜像得到所有的情况,可以发现情况是可以暴力得出的。…...
Geotools自动识别SLD并生成图例图片实战-以Polygon数据为例
目录 前言 一、Geotools与SLD制图基础 1、SLD是什么 2、SLD有什么用 二、SLD文件的解析与读取 1、SLD结构介绍 2、SLD实例展示 3、SLD读取方法 三、图例生成与展示 1、图例生成流程 2、图例生成实战 3、图例生成展示 四、结论 前言 在地理信息系统(GIS&…...
windows docker如何修改 默认的Container memory usage
参考:https://forums.docker.com/t/docker-on-windows-11-with-wsl2-does-not-use-the-memory-i-set-in-wslconfig/144404/3 参考:https://learn.microsoft.com/en-us/windows/wsl/wsl-config...
LabVIEW液压传动系统教学仿真平台
本文介绍了一种基于LabVIEW的液压传动系统教学仿真平台,该平台采用“老师讲解、线上仿真、线下操作”的复合实验模式,旨在提高实验教学的效率与安全性。通过实例验证,展示了该平台在教学和实际操作中的应用效果,同时也为液压传动系…...
Java实习生面试题(2025.3.23 be)
一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:v-if 会根据条件决定是否编译元素,而 v-show 则始终编译元素,只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...
OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示
1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…...
Blender导出fbx到Unity找不到贴图的问题
fbx导入Unity材质能不能找到贴图是一件玄学的事情。常见的情况是有些材质能找到,有些找不到: 可能有用的方法 解决方法1:把贴图文件复制过去,模型reimport; 解决方法2:导出时路径模式选复制,内…...
kafka的文章
1.面试的问题 要点 至多一次、恰好一次数据一致性超时重试、幂等消息顺序消息挤压延时消息 1.1 kafaka 生产消息的过程。 在消息发送的过程中,涉及到了两个线程,一个是main 线程,一个是sender 线程。在main 线程中创建了一个双端队列 Reco…...
Go常见问题与回答(下)
文章目录 1、通过指针变量 p 访问其成员变量 name,有哪几种方式?2、代码,说出结果3、扩容提,代码,说出结果4、指出下面这段代码的错误之处5、是否通过编译6、关于字符串连接,下面语法正确的是7、关于iota&a…...
vue3中如何缓存路由组件
在 Vue3 中缓存路由组件,主要借助<keep-alive>组件来实现,具体方法如下: 1. 全局缓存路由组件 在 App.vue 等根组件中,直接将<router-view>包裹在<keep-alive>标签内,这样所有的路由组件都会被缓存…...
云服务器怎么防御ddos攻击呢?
防御DDoS攻击是保障云服务器稳定运行的关键措施,以下是综合多种防护策略的详细方案: 1. 启用云服务商提供的DDoS防护服务 高防IP/流量清洗: 将业务流量接入云服务商的高防IP,由专业清洗中心过滤恶意流量,仅放行正常请求…...
Log4j2 的核心实现和源码分析
Log4j2 的核心实现和源码分析 1. 核心组件 1.1 Logger 功能:负责记录日志信息。实现:org.apache.logging.log4j.Logger 接口,org.apache.logging.log4j.core.Logger 类。1.2 Appender 功能:负责将日志信息输出到不同的目的地,如文件、控制台等。实现:org.apache.loggin…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV3模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
四种跨模态行人重识别可视化方法
1.Gradcam 2.检索可视化 3.tsne图 4.距离分布 需要的私聊,代码需要付费...
8个DeepSeek文章润色指令
今天道叔给各位文字工作者安利DeepSeek的8个神仙级润色指令(附真实案例拆解),建议搭配冰美式食用更佳↓↓↓ 一、【学术黑话翻译器】 适用场景:给投资人看的BP/行业白皮书/专家访谈实录 指令公式:"将以下内容转化为通俗易懂的行业洞察…...
解决PowerShell下Git中文乱码问题
解决PowerShell下Git中文乱码问题 在使用Git进行版本控制时,许多开发者可能会遇到中文乱码的问题,尤其是在Windows环境下使用PowerShell时。这不仅影响代码的阅读和提交,还可能导致一些不可预见的错误。本文将详细探讨如何在PowerShell下解决…...
oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)
目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…...
mapreduce时,客户端做哪些事
在MapReduce过程中,客户端(Client)是用户提交作业的入口,负责作业的初始化、配置、资源提交和作业监控。以下是客户端在整个流程中的具体职责和操作步骤: 1. 作业配置与参数解析 设置作业属性: 定义MapRed…...
DeepBI:重构流量逻辑,助力亚马逊广告实现高效流量增长
在日益激烈的跨境电商竞争环境中,广告投放早已从“粗放撒网”走向“精细化运营”。尤其是在亚马逊这样一个成熟且竞争白热化的平台,如何在广告预算有限的前提下实现高效曝光、精准触达、稳定转化,成为众多卖家和运营团队面临的核心挑战。 De…...
Linux内核的页面错误:原因与解决方案
当程序访问虚拟内存中的一个页面时,如果该页面当前不在物理内存中,就会触发一个称为"page fault"(页异常)的异常。操作系统需要处理这个异常,并将所需页面从磁盘加载到内存中。实现虚存管理的一个关键是page…...
LORA 中的 梯度外积是什么意思; 方差和协方差的实际含义:衡量变量的离散程度和变量间的线性相关性
LORA 中的 梯度外积是什么意思 目录 LORA 中的 梯度外积是什么意思**一、梯度外积的定义****二、示例说明****步骤1:计算单样本梯度****步骤2:计算梯度外积****三、梯度外积的作用****四、总结**方差和协方差的实际含义:衡量变量的离散程度和变量间的线性相关性**一、方差(…...
XSS复现漏洞简单前八关靶场
靶场不需要安装任意环境 链接如下:XSS Game - Learning XSS Made Simple! | Created by PwnFunction 目录 XSS Game 第一关:Ma Spaghet! 第二关:Jefff 第三关:Ugandan Knuckles 第四关:Ricardo Milos 第五关&am…...
3.24-3 接口测试断言
一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…...
《鸿蒙携手AI:解锁智慧出行底层逻辑》
在科技飞速发展的当下,智慧出行成为人们对未来交通的美好期许,而鸿蒙系统与人工智能的深度融合,正为这一愿景的实现提供强大助力。从技术原理角度深入剖析,鸿蒙系统究竟如何支撑人工智能在智慧出行场景中的应用呢?这背…...
【AVRCP】探寻AVRCP控制互操作性:连接、命令与设备交互
目录 一、AVCTP连接管理 1.1 AVCTP连接建立 1.2 AVCTP连接释放 二、AV/C命令的操作流程 2.1 AV/C命令交换流程 2.2 AV/C命令类型 三、AVRCP特定命令 四、AVRCP浏览命令 五、OBEX连接管理 5.1 OBEX连接建立 5.2 OBEX连接释放 六、总结 七、参考资料 AVRCP对于实现设…...
Mybatis-Plus知识点详解
Mybatis-plus(简称MP),基于Mybatis的增强工具,保留了Mybatis的所有功能,同时增加了通用的CRUD,条件构造器,分页插件等等实用工具 特性 即拿即用:通过通用Mapper和Service,无需编写XML既可以完成单表CURE操作 Lambda支持:使用Lambda表达式构建查询条件,避免硬编码字段名,提升代…...
紧凑交叉引用表
嗯,用户问的是“compact xref table”,也就是紧凑型交叉引用表。我之前在回答中提到过交叉引用流(XRef Stream),但可能需要更详细地解释两者的区别和联系。根据搜索结果中的网页1,传统的Xref表以文本形式存…...
CMake 详解:跨平台构建系统的入门与进阶
目录 一、相关知识点 1. 什么是cmake,为什么使用? 2. 构建过程 二、CMake使用流程 1. 创建 CMakeLists.txt 文件 2. 配置构建目录 3. 运行cmake 4. 运行make编译 一、相关知识点 1. 什么是cmake,为什么使用? CMake 是一个开…...