MySQL_多表查询
MySQL多表查询与事务的操作
sql准备123456789101112131415161718192021# 创建部门表CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20));INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');# 创建员工表CREATE TABLE emp ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender CHAR(1), -- 性别 salary DOUBLE, -- 工资 join_date DATE, -- 入职日期 dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键));INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VA ...
MySQL_数据库设计
表间关系
MySQL约束与设计
关系分类
一对一(了解):
如:人和身份证
分析:一个人只有一个身份证,一个身份证只能对应一个人
实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键
一对多(多对一):
如:部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
实现方式:在多的一方建立外键,指向一的一方的主键
多对多:
如:学生和课程
分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
案例
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758>-- 创建旅游线路分类表 tab_category>-- cid 旅游线路分类主键,自动增长>-- cname 旅游线路分类名称非空,唯一,字符串 100>CREA ...
MySQL_约束
MySQL约束与设计
约束
概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
主键约束:primary key
非空约束:not null
唯一约束:unique
外键约束:foreign key
非空约束:not null,值不能为null
12345678910-- 创建表时添加约束CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name为非空);-- 创建表完后,添加非空约束ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;-- 删除name的非空约束ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一约束:unique
值不能重复
123456789101112>-- 创建表时,添加唯一约束>CREATE TABLE stu(id INT,phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束>);>-- 注意mysql中 ...
多线程_JUC原子类
JUC原子类根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类。
基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;对象的属性修改类型: AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, AtomicReferenceFieldUpdater 。
这些类存在的目的是对相应的数据进行原子操作。所谓原子操作,是指操作过程不会被中断,保证数据操作是以原子方式进行的。
AtomicLong介绍和函数列表AtomicLong是作用是对长整形进行原子操作。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持 ...
多线程_锁
锁概念锁的分类
如何理解互斥锁、条件锁、读写锁以及自旋锁?
5000字 | 24张图带你彻底理解21种并发锁
互斥锁和自旋锁互斥锁和自旋锁是最底层的两种锁,其他的很多锁都是基于他们的实现。
当线程A获取到锁后,线程B再去获取锁,有两种处理方式:
线程B循环的去尝试获取锁,直到获取成功为止即自旋锁
线程B放弃获取锁,在锁空闲时,等待被唤醒,即互斥锁
互斥锁
互斥锁会释放当前线程的cpu,导致加锁的代码阻塞,直到线程再次被唤醒。互斥锁加锁失败时,会从用户态陷入到内核态,让内核帮我们切换线程,存在一定的性能开销
1while (抢锁(lock) == 没抢到) {睡眠直到锁状态改变再唤醒(lock)}
当线程加锁失败,内核会把线程的状态由“运行”设置为“睡眠”,让出cpu
当锁空闲时,内核唤醒线程,状态设置为“就绪”,获取cpu执行
自旋锁
自旋锁会自用户态由应用程序完成,不涉及用户态到内核态的转化,没有线程上下文切换,性能相对较好,自旋锁加锁过程:
1while (抢锁(lock) == 没抢到) {}
查看锁的状态
锁空闲, ...
枚举类Enum
枚举类Enum枚举类有哪些好处
枚举类可以方便地表示星期,月份等常数类型,如果你不用枚举类,那么你只能用数字或者字符串。如果你使用数字,用1-7来表示星期数,但一个数字在程序中不仅可以表示星期数,可能还有其他许多含义,这样你在写程序时就必须时刻记住这些数字的含义,这降低了程序的可读性,也导致容易出错。而当你使用字符串时,虽然没有明显的缺点,但在内存中字符串所占内存要比数字多,这就降低了程序的效率。
枚举类正好弥补了这两方面的缺点,你可以在代码中使用枚举类,但在内存中存放时使用的是数字,既提高了可读性,又提高了程序效率。更重要的是,Python中的枚举类型是不可变类型,又可以进行迭代,这就意味着你可以随时使用枚举类型而不用担心改变了枚举类型的值。
两种枚举类定义方式
程序有两种方式来定义枚举类:
直接使用 Enum 列出多个枚举值来创建枚举类。
通过继承 Enum 基类来派生枚举类。
案例简单枚举类定义12345678# 由于枚举类的“new”方法,将会保证内存中只会存在一个枚举类的实例# -*- coding: utf-8 -*from enum import Enum# 这 ...
pandas小记
pandas学习
numpy小记
numpy小记
70个NumPy分级练习题:用Python一举搞定机器学习矩阵运算
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556import numpy as np# 1. 替换满足条件的元素而不影响原始数组arr = np.arange(10)out = np.where(arr%2==1, -1, arr)arrOut[4]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])outOut[5]: array([ 0, -1, 2, -1, 4, -1, 6, -1, 8, -1])# 7. 获取两个数组元素匹配的索引号a = np.array([1,2,3,2,3,4,3,4,5,6])b = np.array([7,2,10,2,7,4,9,4,9,8])np.where(a==b)Out[33]: (array([1, 3, 5, 7], dtype=int64),) # 9. 将处 ...