当前位置: 首页 > news >正文

MySQL复习

1基本操作复习

 1.1数据库创建

创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据库指定字符集和排序方式create database 数据库名 character set 字符集 collate 排序方式;查询数据库的字符集和排序方式mysql8: 默认 utf8mb4 utf8mb4_0900_ai_cishow variables like 'character_set_database';show variables like 'collation_database';

1.2数据库查看

查看所有库show databases;查看当前使用库select database();查看库下所有表show tables from 数据库名;查看创建库的信息和语句show create database 数据库名;选中和切换库;use 数据库名;

 1.3数据库修改

修改字符集alter database 数据库名 character set 字符集;修改排序方式alter database 数据库名 collate 排序方式;修改字符集和排序方式alter database 数据库名 character set 字符集 collate 排序方式;

 1.4数据库删除

直接删除drop database 数据库名;判断删除drop database if exists 数据库名;

 1.5表相关语法

建表语法总结create table [if not exist] 表名(# 列的信息列名 类型 [列的约束] [列的注释],列名 类型 [列的约束] [列的注释],...列名 类型 [列的约束] [列的注释])[描述][注释]建表事项1. 表名 列名 列类型必须填写的2. 推荐使用if not exists 3. 注释不是必须得,但是是很有必要的!4. 列之间使用,隔开,最后一列没有,
修改和删除表修改表中列添加列alter table 表名 add 列名 类型 [first|alter 列名] ;修改列名alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;修改列类型alter table 表名 modify 列名 新类型 [first|alter 列名] ;删除列alter table 表名 drop 列名;修改表名alter table rename [to] 新表名;删除表drop table [if exists ] 表名;清空表数据truncate  table 表名;
 数据操作语言[插入]语法全列插入[不推荐]insert into 表名 values | value (值,值,值...) 值的数量要等于表的所有列的数量值的类型和顺序要和表的类的类型和顺序一一对应指定列插入[推荐]insert into 表名 (列名,列名...) values | value (值,值,值...) 值的数量要等于表的指定的列的数量值的类型和顺序要和[指定列的]顺序一一对应多行插入insert into 表名 (列名,列名...) values | value (值,值,值...) ,(值,值,值...),(值,值,值...)insert into 表名 values | value (值,值,值...) ,(值,值,值...),(值,值,值...)注意1. values 或者 value 推荐使用values2. 插入的是字符串或者时间类型 ''3. 值的顺序和类型要和表的列名或者指定的列名一一对应     
数据操作语言[修改]语法全表修改(全行修改)update 表名 set 列名 = 新值 , 列名 = 值 , 列名 = 值 ...条件修改(条件筛选行) update 表名 set 列名 = 新值 , 列名 = 值 , 列名 = 值 ... where 条件注意1. 不添加where,代表修改一个表中的所有行的数据,反之,只修改符合where条件的2. 如果修改多个列 set 列名 = 值 , 列名 = 值 
数据操作语言[删除]语法全表删除 delete from  表名;条件行删除 delete from  表名 where 条件;注意1. 开发中很少使用全表删除2. delete删除和清空表truncate 删除,都会删除表中的全部数据,truncate 不仅删除表数据,会删除数据库id的最大记录值!

 1.6建表类型

  整数类型(类型,占有空间,范围)


  标准sql:
     int / integer   4字节  无符号 0 - 2/32-1  有符号 -2 31 / 2 / 31 -1 
     smallint        2字节  无符号 0 - 2/16-1  有符号 -2 17 / 2 / 17 -1
  
  mysql方言:
  
     tinyint         1字节  无符号 0 - 2/8 -1  有符号 -2 7 / 2/7-1
     mediumint       3字节  无符号 0 - 2/24 -1  有符号 -2 23 / 2/23-1
     bigint          8字节  无符号 0 - 2/64 -1  有符号 -2 63 / 2/63-1
     
  有符号: 列名 整数类型 -> 有符号| 有符号 有负值和正值
          列名 整数类型 unsigned -> 无符号|无符号 没有负值,都是正值,将负值部分,绝对值后,加入正值部分!
          
  注意: 选合适范围,范围合适先占有空间最小的!   

浮点类型(类型,M,D)


     float(m,d)   4字节   m 24   d 8
     double(m,d)  8字节   m 53   d 30
  定值类型(类型,M,D)
     decimal(m,d) 动态占有 m 65   d 30
  使用对比:
     精度要求不高,例如:身高,体重 float / double 
     精度要求特别高,钱 工资,价格 decimal 

字符串类型


     char 固定长度类型 一旦声明固定占有对应的空间 M 最大255 [性能较好]
     varchar 可变长度类型 一旦声明,可以插入小于的长度,自动进行伸缩 M 占有的空间不能超过一行的最大显示65535字节 [性能一般]
     text 大文本类型,声明不要指定长度,有固定的大小限制, text [65535] , 不占有一行的最大限制空间
  细节理解
     1. char声明的时候可以不写m char = char(1)
     2. char声明了最大长度限制,输入的文本小于长度限制,会在右侧补全空格 char(5) -> 'abc' -> 'abc  '
     3. char类型在读取的时候,会自动去掉右侧的空格 'abc  ' -> 'abc'
     4. varchar声明的时候,必须添加m限制 varchar(m)
     5. mysql4.0以下版本 varchar(20) -> 20字节限制  mb3 -> 6
     6. mysql5.0以上版本 varchar(20) -> 20字符限制
     7. varchar类型中识别空格,插入空格 读取也是有空格
  演示varchar最大限制
     前提: mysql中一行数据最大的占有空间是65535字节,除了TEXT or BLOBs类型的列(不占有65535限制 法外狂徒)
           一行-> name1列 -> name1列占有的最大空间65535字节
           varchar类型默认会使用1字节标识是否为null -> 65535-1 = 65534字节
           字符集utf8mb4 1个字符 = 4个字节   65534 / 4 = 16383
  解决方案 :
     1. 缩小字符大小限制 m变小 [不合理]
     2. 可以修改字符集 [不合理]
     3. 可以将字符串类型变成TEXT,不占有一行的限制

时间类型 


     year    1 yyyy | yy   '1910' | 1910
     time    3 HH:MM:SS    '10:10:10' 
     date    3 YYYY-MM-DD  '1910-10-10'
     datetime 8 YYYY-MM-DD HH:MM:SS '1910-10-10 10:10:10'
     timestamp 4 YYYY-MM-DD HH:MM:SS '1970-10-10 10:10:10'
  注意情况
     1. year可以写两位年 00 - 99  00-69 =2000 - 2069 70 - 99 = 1970 - 1999 推荐四位的年
     2. 时间类型,要遵循他们的格式插入,插入的时候就是按字符插入,时间默认不会自动赋值
  扩展自动填写时间:
     1.插入默认添加时间
        datatime | timestamp default current_timestamp 
     2.修改默认更改时间
        datatime | timestamp default current_timestamp on update current_timestamp 

1.7总结

CREATE DATABASE IF NOT EXISTS blog_platform CHARACTER SET utf8mb4;USE  blog_platform;SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';ALTER DATABASE blog_platform COLLATE utf8mb4_0900_as_cs;DROP DATABASE IF EXISTS  blog_platform ;SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS book_libs CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;USE book_libs;CREATE TABLE IF NOT EXISTS books (book_name VARCHAR(20) COMMENT '图书名',book_price DOUBLE COMMENT '图书价格',book_num INT COMMENT '图书数量'
) CHARSET=utf8mb4 COMMENT='图书表';SHOW TABLES;
DROP DATABASE IF EXISTS   book_libs ;

2约束复习

MySQL中的约束(Constraints)是一种数据完整性规则,用于限制进入表中的数据类型,保证数据的准确性和可靠性。

2.1约束类型

约束类型分为以下几种:

非空约束:NOT NULL - 指示某列不能存储 NULL 值
唯一约束:UNIQUE - 保证某列的每行必须有唯一的值
默认约束:DEFAULT - 规定没有给列赋值时的默认值
主键约束:PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
外键约束:FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性
检查约束:CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略 CHECK子句

引用自:MySQL:约束

2.2非空约束 

确保列不能有NULL值。

指定非空约束,创建表时在对应的字段后加上not null即可。

示例:email VARCHAR(100) NOT NULL;

 应用:如注册登录信息的数据表时候,不可以没有密码和账户

2.3唯一约束

保证表中所有数据在某一列或列组合上是唯一的。可以有多个唯一约束。

指定唯一约束,创建表时在对应的字段后加上unique即可。

示例:username VARCHAR(50) NOT NULL UNIQUE;

应用:如注册登录信息的数据表时候,每个人的账户都是不同的

          (再如每个人的学号和身份证号)

2.4默认约束

为列提供一个默认值,当插入记录时如果没有指定该列的值,则使用默认值。

指定默认,创建表时在对应的字段后加上default即可。

示例:age INT;(为null)

   name varchar(20) default 'myname';   (为myname)

只有当列没有给出指定值时,当前列才会用默认约束的默认值来填充,但是一旦我们对列手动给出指定值后,列的值就为用户指定的值(即使手动指定的值为null,列的值也会为null) 

2.5主键约束

在MySQL中,主键约束(PRIMARY KEY)用于确保表中每一行的唯一性。主键可以是单个列或多个列的组合,这些列的值组合在表中必须是唯一的,并且不允许包含NULL值。每个表只能有一个主键,通常主键列会有自动增长(AUTO_INCREMENT)属性,以便自动为新行生成唯一的序列号。

(确保表中每行数据的唯一性。一个表只能有一个主键。主键列不能包含NULL值。)

主键约束即primary key,是not null和unique的结合,也就是说被主键约束指定的列既是非空的也是唯一的。

注意:primary key(主键约束)效果和not null unique约束相同,但是本质不同,主键约束除了可以做到not null unique之外,还会默认添加"索引——index"。

引用自:https://blog.csdn.net/2401_83595513/article/details/140967539  

示例:id INT AUTO_INCREMENT PRIMARY KEY,

创建主键约束

创建主键约束通常在创建表时进行,可以直接在列定义中指定PRIMARY KEY,或者在CREATE TABLE语句的末尾单独指定。例如:

CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(40),password VARCHAR(255),email VARCHAR(255));

如果主键由多个列组成,称为复合主键,应在CREATE TABLE语句的末尾指定:

CREATE TABLE user_roles (user_id INT NOT NULL,role_id INT NOT NULL,PRIMARY KEY(user_id, role_id),FOREIGN KEY(user_id) REFERENCES users(user_id),FOREIGN KEY(role_id) REFERENCES roles(role_id));

修改表添加主键约束

对于已存在的表,如果需要添加主键约束,可以使用ALTER TABLE语句:

ALTER TABLE t1 ADD PRIMARY KEY(id);

主键与其他键的区别

主键(PRIMARY KEY)与唯一键(UNIQUE KEY)和索引键(KEY)有所不同。UNIQUE KEY确保列上的值唯一,但允许NULL值,一个表可以有多个UNIQUE KEY。而KEYINDEX的同义词,用于创建非主键和非唯一索引的列或列组合。

删除主键约束

如果需要删除表的主键约束,可以使用以下语句:

ALTER TABLE table_name DROP PRIMARY KEY;

主键约束是数据库设计中的一个重要概念,它确保了数据的完整性和一致性。在实际应用中,合理使用主键约束可以提高数据库操作的效率和准确性。

在一个表中只能用一个主键,不允许有两个或多个主键

2.6外键约束

用于在两个表之间建立链接。确保一个表中的数据值在另一个表中存在。

一张表(子表)中某个列(外键)的值,必须是另一张表(主表)中的主键列或唯一约束列的值,也就是子表中的值在主表中必须存在,且满足主键或唯一约束。

子表中的这个列就称为外键,与主表中的主键或唯一键就建立起了主外键关系。

引用自:https://blog.csdn.net/2401_83595513/article/details/140967539  

示例:username VARCHAR(50) NOT NULL UNIQUE,

ALTER TABLE 从表名 ADD [外键名字] FOREIGN KEY(外键字段名);
REFERENCES 主表名(主键字段名);

 完整版

ALTER TABLE 从表名 
ADD CONSTRAINT 外键名字 
FOREIGN KEY (外键字段名) 
REFERENCES 主表名 (主键字段名)
[ON DELETE 引用操作]
[ON UPDATE 引用操作];
ALTER TABLE orders 
ADD CONSTRAINT fk_customer 
FOREIGN KEY (customer_id) 
REFERENCES customers (id)
ON DELETE CASCADE
ON UPDATE RESTRICT;
  1. 从表名 - 包含外键的表

  2. 外键名字 - 给外键约束命名的标识符(可选但推荐)

  3. 外键字段名 - 从表中引用主表的字段

  4. 主表名 - 被引用的主表

  5. 主键字段名 - 主表中被引用的主键或唯一键

可选部分:

  • ON DELETE - 指定当主表记录被删除时的操作(CASCADE, SET NULL, RESTRICT等)

  • ON UPDATE - 指定当主表键值更新时的操作

2.7检查约束

限制列中的值必须满足一定的条件。在MySQL 8.0.16及更高版本中,CHECK约束被实现为表达式索引。

创建表时设置检查约束的语法规则如下:

CHECK(<检查约束>)

修改表时设置检查约束的语法规则如下:

ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)

修改表时删除检查约束的语法规则如下:

ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

引用自:MySQL检查约束(CHECK)

2.8总结

CREATE DATABASE bms CHARACTER SET utf8mb4;USE bms;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE book(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,price DECIMAL(6,2) NOT NULL,upload_time DATETIME NOT NULL,borrower_id INT,borrower_time DATETIME ,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE record(id INT PRIMARY KEY AUTO_INCREMENT,book_id INT NOT NULL,borrower_id INT NOT NULL,borrower_time DATETIME NOT NULL,remand_time DATETIME NOT NULL);DESC book;DROP DATABASE bms;

 3单表查询与多表操作

CREATE DATABASE bms CHARACTER SET utf8mb4;USE bms;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE book(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,price DECIMAL(6,2) NOT NULL,upload_time DATETIME NOT NULL,borrower_id INT,borrower_time DATETIME ,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE record(id INT PRIMARY KEY AUTO_INCREMENT,book_id INT NOT NULL,borrower_id INT NOT NULL,borrower_time DATETIME NOT NULL,remand_time DATETIME NOT NULL);DESC book;INSERT INTO book(NAME,price,upload_time,state)VALUE ('Java基础入门(第三版)',59.00,CURRENT_TIMESTAMP,0);INSERT INTO USER(NAME,state) VALUES('张三',0),('李四',0);INSERT INTO book(NAME,price,upload_time,state)VALUES('三国演义',69.00,CURRENT_TIMESTAMP,2),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,0),('Java Web 程序开发入门',40.00,CURRENT_TIMESTAMP,0),('西游记',59.00,CURRENT_TIMESTAMP,2),('水浒传',33.00,CURRENT_TIMESTAMP,2),('红楼梦',66.66,CURRENT_TIMESTAMP,2);UPDATE book SET state=0 WHERE NAME='西游记';UPDATE book SET price=66.00 WHERE NAME='水浒传';UPDATE book SET price=price*0.9;DELETE FROM book WHERE NAME='红楼梦';UPDATE book SET borrower_id=1,borrow_time=CURRENT_TIMESTAMP,state=1WHERE NAME='MySQL数据库入门';DROP DATABASE bms;

  4索引与视图

普通索引:基础索引类型,允许重复值和 NULL。

唯一索引:确保数据唯一,允许 NULL,表中可以有多个唯一索引。

主键索引:唯一标识一行数据,不允许 NULL 和重复。
全文索引:适合文本内容搜索,通过分词技术实现。

空间索引:专门用于加速地理空间数据的查询速度。

复合索引:在多个列上同时创建的索引,也被称作联合索引。


原文链接:MySQL数据库——索引介绍

CREATE DATABASE bms CHARACTER SET utf8mb4;USE bms;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE book(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,price DECIMAL(6,2) NOT NULL,upload_time DATETIME NOT NULL,borrower_id INT,borrower_time DATETIME ,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE record(id INT PRIMARY KEY AUTO_INCREMENT,book_id INT NOT NULL,borrower_id INT NOT NULL,borrower_time DATETIME NOT NULL,remand_time DATETIME NOT NULL);DESC book;INSERT INTO book(NAME,price,upload_time,state)VALUE ('Java基础入门(第三版)',59.00,CURRENT_TIMESTAMP,0);INSERT INTO USER(NAME,state) VALUES('张三',0),('李四',0);INSERT INTO book(NAME,price,upload_time,state)VALUES('三国演义',69.00,CURRENT_TIMESTAMP,2),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,0),('Java Web 程序开发入门',40.00,CURRENT_TIMESTAMP,0),('西游记',59.00,CURRENT_TIMESTAMP,2),('水浒传',33.00,CURRENT_TIMESTAMP,2),('红楼梦',66.66,CURRENT_TIMESTAMP,2);UPDATE book SET state=0 WHERE NAME='西游记';UPDATE book SET price=66.00 WHERE NAME='水浒传';UPDATE book SET price=price*0.9;DELETE FROM book WHERE NAME='红楼梦';UPDATE book SET borrower_id=1,borrow_time=CURRENT_TIMESTAMP,state=1WHERE NAME='MySQL数据库入门';DROP DATABASE bms;

 5事务

事务的隔离级别

READ UNCOMMITTED(未提交读):

在这个级别下,事务可以读取到其他事务未提交的修改。这可能会导致“脏读”(Dirty Read)、“不可重复读”(Non-repeatable Read)和“幻读”(Phantom Read)的问题。

READ COMMITTED(提交读):

事务只能读取到已经提交的数据。这避免了“脏读”,但仍然可能发生“不可重复读”和“幻读”。

REPEATABLE READ(可重复读):

这是MySQL的默认事务隔离级别。在该级别下,确保在同一个事务中多次读取同样记录的结果是一致的,避免了“不可重复读”。但是,仍然可能发生“幻读”。

SERIALIZABLE(可串行化):

这是最高的隔离级别,通过完全串行化事务的执行来避免并发事务带来的问题,从而防止脏读、不可重复读和幻读。这种方式通过锁定读取的行来实现,可能会严重影响性能和并发性。

CREATE DATABASE bms CHARACTER SET utf8mb4;USE bms;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE book(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,price DECIMAL(6,2) NOT NULL,upload_time DATETIME NOT NULL,borrower_id INT,borrower_time DATETIME ,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE record(id INT PRIMARY KEY AUTO_INCREMENT,book_id INT NOT NULL,borrower_id INT NOT NULL,borrower_time DATETIME NOT NULL,remand_time DATETIME NOT NULL);DESC book;INSERT INTO book(NAME,price,upload_time,state)VALUE ('Java基础入门(第三版)',59.00,CURRENT_TIMESTAMP,0);INSERT INTO USER(NAME,state) VALUES('张三',0),('李四',0);INSERT INTO book(NAME,price,upload_time,state)VALUES('三国演义',69.00,CURRENT_TIMESTAMP,2),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,0),('Java Web 程序开发入门',40.00,CURRENT_TIMESTAMP,0),('西游记',59.00,CURRENT_TIMESTAMP,2),('水浒传',33.00,CURRENT_TIMESTAMP,2),('红楼梦',66.66,CURRENT_TIMESTAMP,2);UPDATE book SET state=0 WHERE NAME='西游记';UPDATE book SET price=66.00 WHERE NAME='水浒传';UPDATE book SET price=price*0.9;DELETE FROM book WHERE NAME='红楼梦';UPDATE book SET borrower_id=1,borrower_time=CURRENT_TIMESTAMP,state=1WHERE NAME='MySQL数据库入门';SELECT u.id,u.name borrower,b.name bookname,b.borrower_time FROM book b,USER u;SELECT NAME,price FROM book WHERE price>(SELECT price FROM book WHERE NAME='西游记');SELECT NAME,price FROM book WHERE price<(SELECT AVG(price) FROM book);SELECT NAME,price,state FROM bookWHERE state=(SELECT state FROM book WHERE NAME='三国演义');SELECT NAME,price,state FROM bookWHERE state=1 AND price<ANY(SELECT price FROM book WHERE state=0);SELECT NAME,price,state FROM bookWHERE price>=ALL(SELECT price FROM book WHERE state=1);ALTER TABLE book ADD CONSTRAINT fk_id FOREIGN KEY(borrower_id) REFERENCES USER(id);ALTER TABLE book ADD INDEX index_bookname(NAME);ALTER TABLE book ADD INDEX index_bookname_state(NAME(20),state(1));ALTER TABLE book DROP INDEX index_bookname_state;CREATE VIEW view_book_state(图书名字,上架时间,状态)ASSELECT NAME,upload_time,state FROM book;CREATE VIEW view_book_borrower(图书名字,借阅者,借阅时间)AS SELECT b.name,u.name,borrower_time FROM book b,USER u WHERE b.borrower_id=u.id;DROP VIEW view_book_borrower;#开启事务
START TRANSACTION;
#删除数据
DELETE FROM book;
INSERT INTO book (NAME,price,upload_time,borrower_id,borrower_time,state)VALUE('Java基础入门',59.00,CURRENT_TIMESTAMP,NULL,NULL,0),('三国演义',69.00,CURRENT_TIMESTAMP,NULL,NULL,0),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,1,'2021-08-06 11:16:05',1),('Java Web 程序开发入门',49.00,CURRENT_TIMESTAMP,NULL,NULL,0),('西游记',59.00,CURRENT_TIMESTAMP,NULL,NULL,0),('水浒传',66.66,CURRENT_TIMESTAMP,NULL,NULL,0),('唐诗三百首',39.00,CURRENT_TIMESTAMP,NULL,NULL,0),('Python数据可视化',49.80,CURRENT_TIMESTAMP,NULL,NULL,0);SELECT *FROM book;DROP DATABASE bms;

6数据库编程(储存)

CREATE DATABASE bms CHARACTER SET utf8mb4;USE bms;CREATE TABLE USER(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE book(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20) NOT NULL UNIQUE,price DECIMAL(6,2) NOT NULL,upload_time DATETIME NOT NULL,borrower_id INT,borrower_time DATETIME ,state CHAR(1) NOT NULL DEFAULT 0
);CREATE TABLE record(id INT PRIMARY KEY AUTO_INCREMENT,book_id INT NOT NULL,borrower_id INT NOT NULL,borrower_time DATETIME NOT NULL,remand_time DATETIME NOT NULL);DESC book;INSERT INTO book(NAME,price,upload_time,state)VALUE ('Java基础入门(第三版)',59.00,CURRENT_TIMESTAMP,0);INSERT INTO USER(NAME,state) VALUES('张三',0),('李四',0);INSERT INTO book(NAME,price,upload_time,state)VALUES('三国演义',69.00,CURRENT_TIMESTAMP,2),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,0),('Java Web 程序开发入门',40.00,CURRENT_TIMESTAMP,0),('西游记',59.00,CURRENT_TIMESTAMP,2),('水浒传',33.00,CURRENT_TIMESTAMP,2),('红楼梦',66.66,CURRENT_TIMESTAMP,2);UPDATE book SET state=0 WHERE NAME='西游记';UPDATE book SET price=66.00 WHERE NAME='水浒传';UPDATE book SET price=price*0.9;DELETE FROM book WHERE NAME='红楼梦';UPDATE book SET borrower_id=1,borrower_time=CURRENT_TIMESTAMP,state=1WHERE NAME='MySQL数据库入门';SELECT u.id,u.name borrower,b.name bookname,b.borrower_time FROM book b,USER u;SELECT NAME,price FROM book WHERE price>(SELECT price FROM book WHERE NAME='西游记');SELECT NAME,price FROM book WHERE price<(SELECT AVG(price) FROM book);SELECT NAME,price,state FROM bookWHERE state=(SELECT state FROM book WHERE NAME='三国演义');SELECT NAME,price,state FROM bookWHERE state=1 AND price<ANY(SELECT price FROM book WHERE state=0);SELECT NAME,price,state FROM bookWHERE price>=ALL(SELECT price FROM book WHERE state=1);ALTER TABLE book ADD CONSTRAINT fk_id FOREIGN KEY(borrower_id) REFERENCES USER(id);ALTER TABLE book ADD INDEX index_bookname(NAME);ALTER TABLE book ADD INDEX index_bookname_state(NAME(20),state(1));ALTER TABLE book DROP INDEX index_bookname_state;CREATE VIEW view_book_state(图书名字,上架时间,状态)ASSELECT NAME,upload_time,state FROM book;CREATE VIEW view_book_borrower(图书名字,借阅者,借阅时间)AS SELECT b.name,u.name,borrower_time FROM book b,USER u WHERE b.borrower_id=u.id;DROP VIEW view_book_borrower;#开启事务
START TRANSACTION;
#删除数据
DELETE FROM book;
INSERT INTO book (NAME,price,upload_time,borrower_id,borrower_time,state)VALUE('Java基础入门',59.00,CURRENT_TIMESTAMP,NULL,NULL,0),('三国演义',69.00,CURRENT_TIMESTAMP,NULL,NULL,0),('MySQL数据库入门',40.00,CURRENT_TIMESTAMP,1,'2021-08-06 11:16:05',1),('Java Web 程序开发入门',49.00,CURRENT_TIMESTAMP,NULL,NULL,0),('西游记',59.00,CURRENT_TIMESTAMP,NULL,NULL,0),('水浒传',66.66,CURRENT_TIMESTAMP,NULL,NULL,0),('唐诗三百首',39.00,CURRENT_TIMESTAMP,NULL,NULL,0),('Python数据可视化',49.80,CURRENT_TIMESTAMP,NULL,NULL,0);SELECT *FROM book;DELIMITER //
#创建储存过程proc_1CREATE PROCEDURE proc_1()
BEGIN
SELECT b.name,b.price,IF(borrower_id IS NULL,'未借阅',u.name)
FROM book b LEFT JOIN USER u ON b.borrower_id=u.id;
END //DELIMITER ;
CALL proc_1();DELIMITER //
#创建存储过程proc_2;CREATE PROCEDURE proc_2()
BEGIN
SELECT NAME,price,upload_time FROM book WHERE state=0;
END //DELIMITER ;
CALL proc_2();DELIMITER //
#创建存储函数func_1;
CREATE FUNCTION func_1(uname VARCHAR(20))RETURNS VARCHAR(20)DETERMINISTIC READS SQL DATABEGINRETURN (SELECT b.name FROM USER u,book b WHERE u.id=b.borrower_id AND u.name=uname);END //DELIMITER;
SELECT func_1('张三');DELIMITER //
#创建存储函数func_2;
CREATE FUNCTION func_2(bname VARCHAR(255))RETURNS VARCHAR(20)READS SQL DATABEGIN DECLARE blevel VARCHAR(20);DECLARE bprice DECIMAL(6,2);SELECT price INTO bprice FROM book WHERE NAME = bname;IF bprice>60THEN SET blevel='高价格';ELSEIF bprice<=60 AND bprice>40THEN SET blevel='主流价格';ELSEIF empsal<=40THEN SET blevel='平民价格';END IF;RETURN blevel;END //DELIMITER ;SELECT func_2('西游记');SHOW PROCEDURE STATUS LIKE 'proc_1' 
SHOW FUNCTION  STATUS LIKE 'func_1'DROP PROCEDURE IF EXISTS proc_1 ;
DROP FUNCTION IF EXISTS func_1 ;CREATE TRIGGER trig_bookAFTER INSERT ON record FOR EACH ROWUPDATE book SET borrower_id=NULL,borrow_time=NULL,state=0WHERE book.id=new.book_id;SELECT * FROM  information_schema.triggers WHERE trigger_name='trig_book'DROP DATABASE bms;

相关文章:

MySQL复习

1基本操作复习 1.1数据库创建 创建数据库create database 数据库名;判断再创建数据库create database if not exists 数据库名;创建数据库指定字符集create database 数据库名 character set 字符集;创建数据库指定排序方式create database 数据库名 collate 排序方式;创建数据…...

【嵌入式学习2】c语言重点整理

目录 ## 重点掌握 1、数组 2、指针 3、结构体 4、函数 回调函数的常见用途 ## 如何区分数组指针&#xff0c;指针数组&#xff0c;函数指针&#xff0c;结构体指针&#xff0c;指针偏移量 ## 重点掌握 1、数组 https://blog.csdn.net/weixin_60546365/article/details…...

java项目之基于ssm的个人博客网站(源码+文档)

项目简介 个人博客网站实现了以下功能&#xff1a; 个人博客网站在Eclipse环境中&#xff0c;使用Java语言进行编码&#xff0c;使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务&#xff0c;其管理员审核博客文章和相册分享信息&#xff0c;管理文…...

C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤

目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件&#xff0c;赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程&#xff0c;从…...

deploy myEclipse j2ee project to server没反应

解决办法 1.如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了。 这个文件在Myeclipse工作区(workspace) .metadata\.plugins\org.eclipse.core.runtime\.settings目录...

react项目中当组件渲染的时候如何执行接口

最近遇到一个场景&#xff0c;就是组件渲染的时候去调用接口进行数据回填。这个在vue中很简单&#xff0c;在created生命周期函数中&#xff0c;直接调用接口即可。但是react没有created生命周期&#xff0c;所以在react中我们需要用到useEffect钩子函数。 在 React 函数组件中…...

python虚拟环境安装opus(windows)

python -m venv venv 创建虚拟环境后,并且安装软件包后,运行项目报错,提示如下: Could not find Opus library. Make sure it is installed 原因是缺少opus.dll, (先把项目内所有使用的第三方库都安装完成) 从以下页面下载.dll文件之后,放入venv\Scripts目录下即可 https://…...

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…...

小程序内表格合并功能实现—行合并

功能介绍&#xff1a;支付宝小程序手写表格实现行内合并&#xff0c;依据动态数据自动计算每次需求合并的值&#xff0c;本次记录行内合并&#xff0c;如果列内合并&#xff0c;同理即可实现 前端技术&#xff1a;grid布局 display&#xff1a;grid 先看实现效果: axml&…...

基于Flask的通用登录注册模块,并代理跳转到目标网址

实现了用户密码的加密&#xff0c;代理跳转到目标网址&#xff0c;不会暴露目标路径&#xff0c;未登录的情况下访问proxy则自动跳转到登录页&#xff0c;使用时需要修改配置项config&#xff0c;登录注册页面背景快速修改&#xff0c;可以实现登录注册模块的快速复用。 1.app…...

nlohmann::json教程

nlohmann::json 核心函数和方法 1. 基础构造与初始化 函数/方法描述示例json j;创建一个空的 JSON 对象&#xff08;默认是 object 类型&#xff09;json j;json::object()显式创建一个空的 JSON 对象json j json::object();json::array()显式创建一个空的 JSON 数组json ar…...

多层感知机从0开始实现

《动手学深度学习》-4.2-笔记 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层&#xff0c;并通过激活函数转换隐藏层的输出。 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。 import torch from torch import nn from d2l import torch as d2lbatch_size …...

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…...

Python中数据结构元组详解

在Python中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的序列类型&#xff0c;常用于存储一组有序的数据。与列表&#xff08;List&#xff09;不同&#xff0c;元组一旦创建&#xff0c;其内容无法修改。本文将详细介绍元组的基本操作、常见运算、内置函数以及…...

23种设计模式-命令(Command)设计模式

命令设计模式 &#x1f6a9;什么是命令设计模式&#xff1f;&#x1f6a9;命令设计模式的特点&#x1f6a9;命令设计模式的结构&#x1f6a9;命令设计模式的优缺点&#x1f6a9;命令设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是命令设计模式…...

计算机网络——数据链路层的功能

目录 物理链路 逻辑链路 封装成帧&#xff08;组帧&#xff09; 帧定界 透明传输 SDU 差错控制 可靠传输 流量控制 介质访问控制 主机需要实现第一层到第五层的功能&#xff0c;而路由器这种节点只需要实现第一层到第三层的这些功能 假设左边用户需要给右边用户发送…...

Axure项目实战:智慧城市APP(一)首页(动态面板、拖动效果)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;智慧城市APP 主要内容&#xff1a;首页、政务公告、公交查询页面设计 应用场景&#xff1a;各类政务型、B端APP均可参考 案例展示&#xff1a;&am…...

Unity网络开发快速回顾

知识点来源&#xff1a;总结人间自有韬哥在&#xff0c; 唐老狮&#xff0c;豆包 目录 1.网络通信-通信必备知识-IP地址和端口类2.网络通信中序列化和反序列化2进制数据3.Socket类4.TCP同步服务端和客户端基础实现4.1.服务端基本实现4.2.客户端实现&#xff1a; 5.区分消息类型…...

鸿蒙学习笔记(1)-文件解读、编写程序、生命周期

一、文件解读 .hvigor:装有一些编译过程中的依赖缓存。 .idea:工具自动生成的&#xff0c;标记我们的工具是基于idea。 AppScope:代表着整个APP的配置&#xff0c;最后打包使用。之中的resources目录下是应用的名称和图片存放路径&#xff0c;其中app.json5&#xff1a; bund…...

多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...

C++ 多线程简要讲解

std::thread是 C11 标准库中用于多线程编程的核心类&#xff0c;提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下&#xff1a; 1.默认构造函数和线程创建 thread() noexcept; 作用&#xff1a;创建一个 std::thread 对象&#xff0c;但…...

乐仓VUE常用点

页面跳转 发送 router.push({ name: config.editRouteName, query: { type: create, from: route.name as string, }, }); router.push({ name: MbdCalScheme }); 接收 const route useRoute(); const type compu…...

单一主数据系统 vs. 统一主数据中心,哪种更优?

在企业中&#xff0c;主数据管理&#xff08;MDM&#xff09;已成为确保数据一致性和高效运营的关键。企业通常使用多个系统来处理业务数据&#xff0c;如ERP、CRM、SRM等。在这种多系统环境下&#xff0c;如何统一管理企业数据、避免数据孤岛&#xff0c;成为了一项重大挑战。…...

数据结构—树(java实现)

目录 一、树的基本概念1.树的术语2.常见的树结构 二、节点的定义三、有关树结构的操作1.按照数组构造平衡 二叉搜索树2.层序遍历树3.前、中、后序遍历树(1).前序遍历树(2).中序遍历树(3).后序遍历树(4).各种遍历的情况的效果对比 4.元素添加5.元素删除1.删除叶子节点2.删除单一…...

Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现、协议转换器

文章目录 Modbus RTU到Modbus TCP透传技术实现1. 透传技术概述1.1 透传基本原理- 协议帧格式转换- 地址映射与管理- 通信时序适配- 错误检测与处理 2. 透传网关硬件架构2.1 典型硬件结构- 微控制器/处理器(ARM、STM32等)- RS-485/RS-232收发器- 以太网控制器(如W5500)- 电源管理…...

Flask(三)路由与视图函数

在 Flask 中&#xff0c;路由 (Route) 是将 URL 地址映射到特定的视图函数 (View Function) 的机制。视图函数处理用户请求&#xff0c;并返回 HTTP 响应。理解路由和视图函数是构建 Flask 应用的基础。 3.1 路由的基本概念 Flask 使用 app.route() 装饰器来定义路由。以下是…...

mysql 磐维(opengauss)tidb误删数据之高级恢复

Mysql参考&#xff1a; Mysql 8.0 XtraBackupMysqlbinlog 完全恢复 - 墨天轮 Mysql 8.0 XtraBackupMysqlbinlog 完全恢复[TOC]# 一、安装mysql 8.0.19## 1.1https://www.modb.pro/db/509223MySQL 的全量备份、增量备份与 Binlog 时间点恢复_mysqlbinlog自动备份吗-CSDN博客文章…...

常见框架漏洞(一)----Thinkphp(TP)

Thinkphp框架介绍&#xff1a; ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的&#xff0c;是⼀个快速、兼容⽽ 且简单的轻量级国产PHP开发框架&#xff0c;诞⽣于2006年初&#xff0c;原名FCS&#xff0c;2007年元旦正式更名为 ThinkPHP&#xff0c;遵循Apache…...

Git 使用指南:从设置用户信息到项目提交的全流程教程(持续更新)

一、设置 Git 用户信息 1.全局设置&#xff08;适用于所有 Git 仓库&#xff09;&#xff1a; git config --global user.name "Your Name" git config --global user.email youexample.com 2.仅针对当前仓库设置&#xff08;如果您只想为当前项目设置&#xff0…...

Json在扩展属性xdata中的应用实例——cad 二次开发c#

以下是一个使用AutoCAD C#.NET API实现你需求的示例代码&#xff0c;代码实现了提示用户选择一个实体&#xff0c;将一些字符串变量及其对应的值组成JSON格式数据存储到实体的扩展数据&#xff08;XData&#xff09;中&#xff0c;并在弹出窗口中显示该实体的所有扩展数据信息。…...

Unity Animation的其中一种运用方式

Animation是Unity的旧的动画系统&#xff0c;先说目的&#xff0c;其使用是为了在UI中播放动效&#xff0c;并且在动效播放结束后接自定义事件而设计的 设计的关键点在于&#xff0c;这个脚本不是通过Animation直接播放动画片段&#xff0c;而是通过修改AnimationState的nor…...

C++ 的基本内置类型(十二)

C 作为一门强大的编程语言&#xff0c;其内置类型是开发者必须掌握的基础。本文将详细介绍 C 的基本内置类型&#xff0c;包括算术类型和空类型&#xff0c;探讨它们的特性、尺寸以及在机器上的实现方式。 一、 基本内置类型概述 C 定义了一套基本数据类型&#xff0c;主要包…...

Android设计模式之单例模式

一、定义&#xff1a;确保一个类只有一个实例&#xff0c;并且自动实例化&#xff0c;并向整个系统提供这个实例。 二、使用场景&#xff1a;避免重复创建对象&#xff0c;过多消耗系统资源。 三、使用方式 3.1饿汉式&#xff1a;类加载时立即初始化&#xff0c;线程安全&…...

随笔(1)

1、解除切屏限制命令 document.body.onblur null2、vue3 getCurrentInstance import { getCurrentInstance } from vue const {proxy} getCurrentInstance() proxy.mittBus.emit(message,xxxx)3、 自定义双向绑定&#xff0c;modelValue 就是对应输入框的值 emit(update:mo…...

系统与网络安全------网络应用基础(3)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 路由器 认识路由器 负责在不同网络之间转发数据的设备 路由器决定到达目标的路径 路由器也为直连网络的主机充当”网关“角色 路由器是实现网络互连的最核心设备 工作原理 每台路由器维护一份路由表&…...

Java 基于微信小程序的开放实验室预约管理系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…...

Linux内核NIC网卡驱动实战案例分析

以下Linux 内核模块实现了一个虚拟网络设备驱动程序&#xff0c;其作用和意义如下&#xff1a; 1. 作用 &#xff08;1&#xff09;创建虚拟网络设备对 驱动程序动态创建了两个虚拟网络设备&#xff08;nic_dev[0]和nic_dev[1]&#xff09;&#xff0c;模拟物理网卡的功能。这两…...

R 基础语法

R 基础语法 引言 R 是一种针对统计计算和图形表示而设计的编程语言和环境。它广泛应用于统计学、生物信息学、数据挖掘等领域。本文将为您介绍 R 语言的基础语法,帮助您快速上手。 R 的基本结构 R 语言的基本结构包括:变量、数据类型、运算符、控制结构、函数等。 变量 …...

JDK 24 发布,新特性解读!

一、版本演进与技术格局新动向 北京时间3月20日&#xff0c;Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本&#xff0c;其技术革新力度远超预期——共集成24项JEP提案&#xff0c;相当于Java 22&#xff08;12项&#xff09;与Java 23&#xff08;12项&#…...

在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败

在 Qt 中&#xff0c;不带参数或整形的参选的信号能够从 std::thread 发送成功&#xff0c;而带枚举离线的信号却发送失败 当信号和槽在不同线程时&#xff0c;默认使用 队列连接&#xff08;Qt::QueuedConnection&#xff09;&#xff0c;信号会被放入接收线程的事件队列&…...

慧通测控汽车智能座舱测试技术

一、引言 随着科技的飞速发展&#xff0c;汽车正从单纯的交通工具向智能化移动空间转变。智能座舱作为这一转变的核心体现&#xff0c;融合了多种先进技术&#xff0c;为用户带来前所未有的驾驶体验。从简单的信息娱乐系统到高度集成的人机交互、智能驾驶辅助以及车辆状态监测…...

【CSS】CSS 使用全教程

CSS 使用全教程 介绍 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种样式表语言&#xff0c;用于描述 HTML 或 XML 文档的布局和外观&#xff0c;它允许开发者将文档的内容结构与样式表现分离&#xff0c;通过定义一系列的样式规则来控制网页…...

【Linux知识】RPM软件包安装命令行详细说明

文章目录 概述安装软件包升级软件包卸载软件包查询软件包信息验证软件包从软件包中提取文件注意事项 概述 rpm&#xff08;Red Hat Package Manager&#xff09;是红帽系 Linux 发行版&#xff08;如 Red Hat、CentOS、Fedora 等&#xff09;用于管理软件包的工具&#xff0c;…...

SpringBoot3.0不建议使用spring.factories,使用AutoConfiguration.imports新的自动配置方案

文章目录 一、写在前面二、使用imports文件1、使用2、示例比对3、完整示例 参考资料 一、写在前面 spring.factories是一个位于META-INF/目录下的配置文件&#xff0c;它基于Java的SPI(Service Provider Interface)机制的变种实现。 这个文件的主要功能是允许开发者声明接口的…...

c++项目-KV存储-模仿redis实现kv键值对存储的基本功能。

KV存储引擎的技术解析&#xff1a;数组、哈希与红黑树实现及其在网络I/O中的应用。 内容概要&#xff1a;本文档深入介绍了基于数组、哈希表和红黑树的键值存储引擎的设计与实现。文档首先阐述了系统的总体架构与类图关系&#xff0c;之后分别对底层存储结构进行了详细解释&am…...

docker ssh远程连接

目录 操作命令&#xff1a; 确保 SSH 配置允许 root 登录&#xff1a; docker提交&#xff1a; 操作命令&#xff1a; # 进入容器 docker exec -ti lbg04 /bin/bash# 更新包管理并安装 SSH 服务&#xff08;Ubuntu/Debian 示例&#xff09; apt-get update apt-get install…...

边缘计算场景下的分布式推理系统架构设计

一、边缘节点推理优化 1.1 模型轻量化技术矩阵 1.2 TensorRT加速配置示例 # 使用TensorRT优化YOLOv8builder trt.Builder(TRT_LOGGER)network builder.create_network()parser trt.OnnxParser(network, TRT_LOGGER)with open("yolov8s.onnx", "rb") a…...

css基础-浮动

一、浮动是什么&#xff1f; 比喻&#xff1a;就像泳池里的救生圈 原始用途&#xff1a;让文字环绕图片&#xff08;像杂志排版&#xff09;意外发展&#xff1a;被用来做页面布局&#xff08;像用救生圈搭浮桥&#xff09; 二、浮动怎么产生的&#xff1f; 场景还原&#…...

Linux TTY设备汇总

目录 1. ‌tty(终端设备统称) 2. ‌ptm(伪终端主设备)与pts(伪终端从设备) 3. ‌ttys(串行端口终端) 4. ‌ttyACM(USB CDC ACM设备) 5. ‌ttyGS(USB Gadget Serial设备) 主要联系‌ ‌典型应用场景‌ TTY_CORE: drivers/tty/tty_io.c:tty_register_driver…...

Android studio组合教程--做出一个类似于QQ的登录页面

之前我们学过了html与Android的开发&#xff0c;以及各种组件的学习&#xff0c;这次我们做一个完整向的登录页面&#xff0c;作为一次大作业。 注意 里面的一图片可以自由发挥&#xff0c;但要注意文件路径保持准确&#xff0c;这里给出参考路径&#xff1a; 背景路径&…...