资讯详情

MySQL单表与多表

基本介绍

X64是指CPU是64位版;

X86是指CPU32位版;

数据在内存:

优点:读写速度快;

缺点:程序结束后数据丢失

保存到文件:

优点:数据可以永久保存

缺点:(1)频繁IO操作效率低

(2)数据管理非常不方便,需要整体读取所有数据才能操作

数据库:

1.永久保存数据

2.数据管理非常方便


数据库以表为组织单位存储数据。

在这里插入图片描述


PRIMARY KEY 主键,不能重复,只确定一个记录(unique not null)

AUTO_INCREMENT 自动增长

varchar(10)、char(10)区别:

相同点:最大可以放10个字符

不同点:

  • char(10)无论输入多少,都会占用10个字符。比如输入名张三只有两个字符,但是使用char(10)数据库中仍有10个字符的空间。

  • 使用varchar(10)最大支持是10个字符,但实际长度是输入字符的长度,比如输入名张三只有两个字符varchar(10)只占两个字符。


-- 列出所有数据库 SHOW DATABASES;  -- 创建数据库 CREATE DATABASE java2207 DEFAULT CHARACTER SET utf8;  -- 删除数据库 DROP DATABASE java2207;  ---------------------------------------- -- 数据库表的操作 -- 切换数据库 USE DATABASE java2207;  -- 创建表 CREATE TABLE student(  id INT,     `name` CHAR(10),     age INT,     gender CHAR(1) );  -- 查看所有表 SHOW TABLES;  -- 检查表的结构 description 描述 DESC student;  -- 删除表 DROP TABLE student;  -- 改变表的结构 -- 添加字段 ALTER TABLE student ADD COLUMN address CHAR(10); -- 删除字段 ALTER TABLE student DROP COLUMN address; -- 修改表的字段 ALTER TABLE student CHANGE address addr CHAR(20); -- 修改表的名称 ALTER TABLE student RENAME TO stu;  -- 创建表CREATE TABLE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
    `name` CHAR(10),
    age INT,
    gender CHAR(1)
);
-- *代表查询所有的列
SELECT * FROM student;

-- 插入数据
INSERT INTO student(id,`name`,age,gender) VALUES(1,'wangwu',23,'男');
INSERT INTO student(id,`name`,age,gender) VALUES(3,'赵六',23,'男');
INSERT INTO student(id,`name`,age,gender) VALUES(4,'赵六22',33,'男');
-- 插入部分字段(必须把前面的字段名都写上)
INSERT INTO student(`name`,age,gender) VALUES('小张11',23,'男');
-- 一次插入多条数据
INSERT INTO student(`name`,age,gender) VALUES('小张77',23,'男'),('小王',22,'男');

-- 修改数据
UPDATE student SET age=age+1;
UPDATE student SET age=age+1 WHERE id=7;

-- 删除数据
DELETE FROM student; -- 删除表中所有数据(很少使用,非常危险)
DELETE FROM student WHERE age=24; -- 所有age是24的数据都被删除了,可能有很多条数据都是age=24
DELETE FROM student WHERE id=12; -- 因为id是主键是唯一的,所以根据id删除只能删除唯一的一条数据
-- TRUNCATE删除表里面所有数据,自增的id会重新初始化为初始值1
TRUNCATE TABLE student;


-- 查询数据
-- 显示所有列(字段)数据
SELECT * FROM student; -- 学习的时候可以写*,但是在企业开发中需要什么字段就写什么字段
SELECT id,`name`,age FROM student;
-- 查询指定列
SELECT `name`,age FROM student;
-- 查询的时候添加常量列,通过as可以起别名
SELECT id,`name`,age AS '年龄','java2207' AS '班级' FROM student;

-- 查询的时候可以合并列,字段可以当成java里面的变量来运算
SELECT id,`name`,(php+java) AS '总成绩' FROM student;
-- 查询的时候去掉重复的记录
SELECT DISTINCT address FROM student;

-- 条件查询where
SELECT * FROM student WHERE `name`='小王';

-- 逻辑条件:and(同时成立) or(只要一个成立)
SELECT * FROM student WHERE `name`='小王' AND address='青岛';
SELECT * FROM student WHERE `name`='小王' OR address='北京';

-- 比较运算:> < >= <= !=
SELECT * FROM student WHERE java>=70 AND java<=80;
--between and (等价于>= and <=)
SELECT * FROM student WHERE java BETWEEN 70 AND 80;
-- 查询地址不是青岛的学生信息
SELECT * FROM student WHERE address!='青岛';

--聚合查询
--聚合查询函数:sum(),avg(),max(),min(),count()
--统计学生php总成绩(sum求和)
SELECT SUM(php) AS 'php总成绩' FROM studnet;
--统计学生php平均成绩
SELECT AVG(php) AS 'php平均成绩' FROM student;
--统计学生php的最大值
SELECT MAX(php) AS 'php最大值' FROM student;
--统计学生表里面一共有多少学生
SELECT COUNT(*) AS '总人数' FROM student;
SELECT COUNT(id) AS '总人数' FROM student;
SELECT COUNT(address) AS '总人数' FROM student;
-- 注意:count()函数统计的是指定列不包含NULL的数据个数

-- 查询排序
-- 语法:order by 字段 asc/desc 默认是升序,可以不写
SELECT * FROM student ORDER BY php;
SELECT * FROM student ORDER BY php ASC;
SELECT * FROM student ORDER BY php DESC;
-- 多个条件排序
-- 需求:先按照php降序,java升序(整体是按照php降序,如果php相同的数据再按照java升序)
SELECT * FROM student ORDER BY php DESC,java ASC;


-- 分组查询(group by)
-- 需求:查询男女分别有多少人
-- 分组查询后筛选
-- 需求:address大于1
-- group by 之后的条件查询用having
SELECT address AS '地址',COUNT(id) AS '人数' FROM student GROUP BY address HAVING COUNT(id) 


字段属性设置:

  1. not null:不为空,表示该字段不能放"null" 这个值。不写,则默认是可以为空
  2. auto_increment:设定int类型字段值可以“自增长”,即其值无需“写入”,而会自动获得并增加此属性必须随同primary key 或unique key一起使用。 primary key = unique key + not null
  3. [primary] key:设定为主键。是唯一键“加强”:不能重复并且不能使用null,并且可以作为确定任意一行数据的“关键值”,最常见的类似:where id = 8;或where user_name = ‘zhangsan’;通常,每个表都应该有一个主键,而且大多数表,喜换使用一个id并自增长类型作为主键。但是,一个表只能设定一个主键。
  4. unique [key] :设定唯一键:表示该字段的所有行的值不可以重复(唯一性)。

Duplicate entry ’zhangsan‘ for key ‘name’

  1. default’默认值‘:设定一个字段在没有插入数据的时候自动使用的值。
  2. comment ’字段注释‘
CREATE TABLE teacher(
	id INT PRIMARY KEY AUTO_INCREMENT,
    'name' char(10) NOT NULL,
    age INT COMMENT '年龄',
    address CHAR(10) DEFAULT '中国',--插入数据的时候如果不赋值,默认是“中国”
    UNIQUE KEY('name') -- 唯一键,代表这个字段不能重复
);

-- Duplicate entry 'zhangsan' for key 'name'
INSERT INTO teacher('name') values('zhangsan');

多表查询:

学生表、班级表、课程表、班级课程表


-- 多对多
-- 班级表
CREATE TABLE banji(
	id INT PRIMARY KEY AUTO_INCREMENT,
    'name' varchar(10) NOT NULL
);
INSERT INTO banji('name') VALUES('java2207'),('java2208');
SELECT * FROM banji;

-- 学生表 reference :参考、引用
CREATE TALBE student(
	id INT PRIMARY KEY AUTO_INCREMENT,
    'name' VARCHAR(10) NOT NULL,
    age INT,
    gender CHAR(1),
    banji_id INT,
    FOREIGN KEY(banji_id) REFERENCE banji(id)
);
INSERT INTO student('name',age,gender,banji_id) VALUES('张三',20,'男',1),('李四',21,'男',2),('王五',20,'女',1);
-- Cannot add or update a child row: a foreign key constraint fails ('java2208')
INSERT INTO student('name',age,gender,banji_id) VALUES('张三',20,'男',3);--因为不存在id为3的班级


-- 课程表
CREATE TABLE course(
	id INT PRIMARY KEY AUTO_INCREMENT,
    'name' VARCHAR(10) NOT NULL,
    credit INT COMMENT '学分'
);
INSERT INTO course('name',credit) VALUES('java',5),('UI',4),('H5',4);

-- 班级课程表
CREATE TABLE banji_course(
	-- id int PRIMARY KEY AUTO_INCREMENT,
    banji_id INT,
    course_id INT,
    PRIMARY KEY(banji_id,course_id),--联合主键
    FOREIGN KEY(banji_id) REFERENCE banji(id),--banji_id既是联合主键又是外键
    FOREIGN KEY(course_id) REFERENCE course(id),--course_id既是联合主键又是外键
);

INSERT INTO banji_course(banji_id,course_id) VALUES(1,1),(1,3),(2,1),(2,2),(2,3);

--子查询:嵌套查询,一个查询语句是另一个查询语句的条件
-- 查询班级是java2207班所有学生信息
SELECT * FROM student where banji_id=2;
SELECT id FROM baji WHERE 'name'='java2207';
SELECT * FROM student WHERE banji_id=(SELECT id FROM baji WHERE 'name'='java2207');

-- 班级是java2207班或者java2208班所有学生信息
SELECT * FROM student WHERE banji_id=1 OR banji_id=2;
SELECT * FROM student WHERE banji_id IN(1,2);
SELECT id FROM course WHERE name='java2207' OR 'name'='java2208';--1,2
SELECT * FROM student WHERE banji_id IN(SELECT id FROM course WHERE name='java2207' OR 'name'='java2208');
-- "=":要求子查询只有一个结果。 "in":子查询可以有多个结果

关联查询:inner join

-- 列出所有学生学习的课程名称
-- 学生姓名 班级名称 课程名称 学分

---inner join on 只有左右两个表有关联的才查询出来
--left join on 左表中都显示出来,右表没有显示空
--right join on 右表都显示,左表没有显示空

SELECT * FROM student AS s RIGHT JOIN banji AS b ON s.banji_id=b.id;

总结:多表查询主要是注意下面两点:

  1. 整个查询涉及到几张表,涉及到几张表就连接这几张表。
  2. 如果涉及到这几张表的关系搞不清楚,画一下ER图,弄清楚表和表之间的关系(就是根据外键建立的关系)
-- 统计每个班有多少学生
-- 学生数量
SELECT COUNT(*) AS '学生数量' FROM student GROUP BY banji_id;

-- 班级名称 学生数量
SELECT * FROM student AS s INNER JOIN banji AS b ON s.banji_id = b.id;

把inner join之后查询的结果当成一张表来使用,在这个结果集里面根据班级id统计每个班级下面学生数量。

-- 班级名称 学生数量
SELECT b.name AS '班级名称', COUNT(*) AS '学生数量' FROM student AS s INNER JOIN banji AS b ON s.banji_id=b.id GROUP BY b.id;


模糊查询:like

语法形式:字段like‘要查找字符’

说明:

  1. like模糊查找用于对字符类型的字段进行字符匹配查找。
  2. 要查找的字符中,有两个特殊含义的字符:%,_:
    • 2.1:%含义是:代表0或多个的任意字符
    • 2.2:_代表1个任意字符
    • 2.3:这里的字符都是指现实中可见的一个“符号”,而不是字节。
  3. 语法:like %关键字%
SELECT * FROM student WHERE 'name' LIKE '张%',--以张开头
SELECT * FROM student WHERE 'name' LIKE '张_',--以张开头,而且名字是两个字
SELECT * FROM student WHERE 'name' LIKE '%张%' --名字里面只要有张就可以

如果要查找的字符中包含"%“,”_":

如果要查找的字符中包含"%" 或者"_“,”`",则只要对他们进行转义就可以:

like '%ab\%cd%' --这里要找的是:包含ab%cd字符的字符
like '\_ab%' -- 这里要找的是:_ab开头的字符
like '%ab\'cd%' --这里要找的是:包含ab'cd的字符

数据库中以表为组织单位存储数据。

表类似我们java的类,每个字段对应类里面的属性。

那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。

类----------表

类中属性----------表中字段(列)

对象------记录(行)

字段(列)可以当成变量(类中属性是变量)

变量是可以计算(操作)



create table goods (
  goods_id mediumint(8) unsigned primary key auto_increment,
  goods_name varchar(120) not null default '',
  cat_id smallint(5) unsigned not null default '0',
  brand_id smallint(5) unsigned not null default '0',
  goods_sn char(15) not null default '',
  goods_number smallint(5) unsigned not null default '0',
  shop_price decimal(10,2) unsigned not null default '0.00',
  market_price decimal(10,2) unsigned not null default '0.00',
  click_count int(10) unsigned not null default '0'
) ;
insert into `goods` values (1,'kd876',4,8,'ecs000000',1,1388.00,1665.60,9),
(4,'诺基亚n85原装充电器',8,1,'ecs000004',17,58.00,69.60,0),
(3,'诺基亚原装5800耳机',8,1,'ecs000002',24,68.00,81.60,3),
(5,'索爱原装m2卡读卡器',11,7,'ecs000005',8,20.00,24.00,3),
(6,'胜创kingmax内存卡',11,0,'ecs000006',15,42.00,50.40,0),  
(7,'诺基亚n85原装立体声耳机hs-82',8,1,'ecs000007',20,100.00,120.00,0),
(8,'飞利浦9@9v',3,4,'ecs000008',1,399.00,478.79,10),
(9,'诺基亚e66',3,1,'ecs000009',4,2298.00,2757.60,20),
(10,'索爱c702c',3,7,'ecs000010',7,1328.00,1593.60,11),
(11,'索爱c702c',3,7,'ecs000011',1,1300.00,0.00,0),
(12,'摩托罗拉a810',3,2,'ecs000012',8,983.00,1179.60,13),
(13,'诺基亚5320 xpressmusic',3,1,'ecs000013',8,1311.00,1573.20,13),
(14,'诺基亚5800xm',4,1,'ecs000014',1,2625.00,3150.00,6),
(15,'摩托罗拉a810',3,2,'ecs000015',3,788.00,945.60,8),
(16,'恒基伟业g101',2,11,'ecs000016',0,823.33,988.00,3),
(17,'夏新n7',3,5,'ecs000017',1,2300.00,2760.00,2),
(18,'夏新t5',4,5,'ecs000018',1,2878.00,3453.60,0),
(19,'三星sgh-

标签: g101cb光电传感器g101p光纤传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台