数据库-从入门到跑路 .1 (DDL、DQL)
数据库学习笔记——从入门到跑路
第一节 数据类型
1.整数类型
了解即可,不用背
2. 浮点数类型和定点数类型
注意: M 表示:数据的总长度(不包括小数点);
D 表示:小数位;
例如 decimal(5,2) 123.45
存入数据的时候,按四舍五入计算
3. 日期与时间类型
4.字符串类型
第二节 数据库定义操作DDL
数据库基本操作
show databases; //显示所有数据库
create database 数据库的名称; //创建数据库
drop database 数据库的名称; //删除数据库
**/创建一个表 t_bookType,
id 为 int 主键,自动增加,
booktypename varchar(20)型,
booktypedesc 为varchar(200)型
/
CREATE TABLE t_bookType(
id int primary key auto_increment,
bookTypeName varchar(20),
bookTypeDesc varchar(200)
);
**/创建一个表t_book
id为int主键,自动增加,
bookName 为 varchar(20),
author 为 varchar(10),
price 为 decimal(6,2),
bookTypeId 为 int,
constraint fk
foreign key (bookTypeId
) references t_bookType
(id
)
/
CREATE TABLE t_book(
id int primary key auto_increment,
bookName varchar(20),
author varchar(10),
price decimal(6,2),
bookTypeId int,
constraint fk
foreign key (bookTypeId
) references t_bookType
(id
)
);
查看操作
desc t_bookType; //查看表结构
show create table t_bookType; //查看表详细结构
更改操作
alter table t_book rename t_book2; //更改表名
alter table t_book change bookName bookName2 varchar(20);//更改字段(列名),并更改类型
alter table t_book add testField int first ; //增加字段,在第一个字段增加
alter table t_book add testField int after 字段2; //在字段2前加一个字段
删除操作
alter table t_book drop testField; //删除字段
drop table t_bookType; //删除表
drop table t_book;
第三节.数据库查询语句DQL
1.单表查询
库函数/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
create table `t_student` (
`id` double ,
`stuName` varchar (60),
`age` double ,
`sex` varchar (30),
`gradeName` varchar (60)
);
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('1','张三','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('2','张三丰','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('3','李四','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('4','王五','22','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('5','珍妮','21','女','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('6','李娜','26','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('7','王峰','20','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('8','梦娜','21','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('9','小黑','22','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('10','追风','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('11','小小张三','21',NULL,'二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('12','小张三','23','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('13','张三锋小','24',NULL,'二年级');
常用操作
SELECT id,stuName,age,sex,gradeName FROM t_student ; //查询表中选中的的字段
SELECT stuName,id,age,sex,gradeName FROM t_student ;
SELECT * FROM t_student; //查询表中所有的字段
SELECT stuName,gradeName FROM t_student; //查询表中指定的字段
SELECT * FROM t_student WHERE id=1; //where条件查询
SELECT * FROM t_student WHERE age>22;
/IN关键字查询,()输入元素,查询符合条件的学生信息/
SELECT * FROM t_student WHERE age IN (21,23);
SELECT * FROM t_student WHERE age NOT IN (21,23);
/* BETWEEN AND 范围查询*/
SELECT * FROM t_student WHERE age BETWEEN 21 AND 24;
SELECT * FROM t_student WHERE age NOT BETWEEN 21 AND 24;
/* like 模糊查询 %表示任意多个字符,_表示单个字符*/
SELECT * FROM t_student WHERE stuName LIKE '张三';
SELECT * FROM t_student WHERE stuName LIKE '张三%';
SELECT * FROM t_student WHERE stuName LIKE '张三__';
SELECT * FROM t_student WHERE stuName LIKE '%张三%';
/* 空值查询*/
SELECT * FROM t_student WHERE sex IS NULL;
SELECT * FROM t_student WHERE sex IS NOT NULL;
/* 多条件查询,满足多个条件的查询方式 and表示全部满足,or表示或*/
SELECT * FROM t_student WHERE gradeName='一年级' AND age=23
SELECT * FROM t_student WHERE gradeName='一年级' OR age=23
/* 去重复查询,在需要查询的字段前,加DISTINCT */
SELECT DISTINCT gradeName FROM t_student;
/* 对查询结果排序,在结尾加上 ORDER BY 属性名(以该属性排序) asc|desc */
SELECT * FROM t_student ORDER BY age ASC;
SELECT * FROM t_student ORDER BY age DESC;
/*分组查询
1,单独使用(毫无意义);
2,与GROUP_CONCAT()函数一起使用;
3,与聚合函数一起使用;
4,与HAVING 一起使用(限制输出的结果);
5,与WITH ROLLUP 一起使用(最后加入一个总和行); */
/* 直接使用 /
SELECT * FROM t_student GROUP BY gradeName;
/ */
SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName;
SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName;
SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName HAVING COUNT(stuName)>3;
SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP;
SELECT gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName WITH ROLLUP;
/* LIMIT 分页查询 */
SELECT 字段1,字段2...FROM 表名LIMIT 初始位置,记录数;
SELECT * FROM t_student LIMIT 0,5;
SELECT * FROM t_student LIMIT 5,5;
SELECT * FROM t_student LIMIT 10,5;
2.聚合函数
库函数t_grade
/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
create table `t_grade` (
`id` int ,
`stuName` varchar (60),
`course` varchar (60),
`score` int
);
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('2','张三','数学','90');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('3','张三','英语','87');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('4','李四','语文','79');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('5','李四','数学','95');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('6','李四','英语','80');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('7','王五','语文','77');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('8','王五','数学','81');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('9','王五','英语','89');
/*COUNT()函数
1.COUNT()函数用来统计记录的条数
2.与GOUPE BY 关键字一起使用;
*/
SELECT COUNT(*) FROM t_grade; //计算这个表里的所有行数
SELECT COUNT(*) AS total FROM t_grade;//as 别名,是为计数起一个别名
SELECT stuName,COUNT(*) FROM t_grade GROUP BY stuName;
/SUM()函数
1,SUM()函数是求和函数;
2,与GOUPE BY 关键字一起使用;/
SELECT stuName,SUM(score) FROM t_grade WHERE stuName="张三";
//查找名字是张三的同学的成绩总分,显示为2列
SELECT stuName,SUM(score) FROM t_grade GROUP BY stuName;
/AVG(字段名),求平均值/
SELECT stuName,AVG(score) FROM t_grade WHERE stuName="张三";
SELECT stuName,AVG(score) FROM t_grade GROUP BY stuName;
/MAX(字段名),求最大值最小值/
SELECT stuName,course,MAX(score) FROM t_grade WHERE stuName="张三";
SELECT stuName,MAX(score) FROM t_grade GROUP BY stuName;
SELECT stuName,course,MIN(score) FROM t_grade WHERE stuName="张三";
SELECT stuName,MIN(score) FROM t_grade GROUP BY stuName;
3.多表查询
db_book 库
/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community : Database - db_book
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_book` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `db_book`;
/*Table structure for table `t_book` */
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bookName` varchar(20) DEFAULT NULL,
`price` decimal(6,2) DEFAULT NULL,
`author` varchar(20) DEFAULT NULL,
`bookTypeId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*Data for the table `t_book` */
insert into `t_book`(`id`,`bookName`,`price`,`author`,`bookTypeId`) values (1,'Java编程思想','100.00','埃史尔',1),(2,'Java从入门到精通','80.00','李钟尉',1),(3,'三剑客','70.00','大仲马',2),(4,'生理学(第二版)','24.00','刘先国',4);
/*Table structure for table `t_booktype` */
DROP TABLE IF EXISTS `t_booktype`;
CREATE TABLE `t_booktype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bookTypeName` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/*Data for the table `t_booktype` */
insert into `t_booktype`(`id`,`bookTypeName`) values (1,'计算机类'),(2,'文学类'),(3,'教育类');
/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40111 SET [email protected]_SQL_NOTES */;
多表查询采用连接查询
把多个表的条件连接起来
分为内连接和外连接查询
内连接查询
SELECT * FROM t_book,t_bookType; //把2个表直接外连接,取笛卡尔积
SELECT * FROM t_book,t_bookType WHERE t_book.bookTypeId=t_bookType.id; //where条件查询
SELECT bookName,author,bookTypeName FROM t_book,t_bookType WHERE t_book.bookTypeId=t_bookType.id;
//查询2个表的部分字段
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id;
//注意:该命令中from后面加上了别名,as省略了,在select后的tb和tby都是别名
外连接查询:左连接 和 右连接
外连接可以查出某一张表的所有信息,格式如下
SELECT 属性名列表 FROM 表名1 LEFT|RIGHT JOIN 表名2 ON 表名1.属性名1=表名2.属性名2;
SELECT * FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId = t_bookType.id;
//左连接可以查询出“表名1”的所有记录,而“表名2”中,只能查询出匹配的记录;
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb LEFT JOIN t_bookType tby ON tb.bookTypeId=tby.id;
SELECT * FROM t_book RIGHT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id;
//右连接可以查询出“表名2”的所有记录,而“表名1”中,只能查询出匹配的记录
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb RIGHT JOIN t_bookType tby ON tb.bookTypeId=tby.id;
多条件查询(一般不用)
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id AND tb.price>70;
// 查找了tb.bookName,tb.author,tby.bookTypeName这几个字段中满足tb.bookTypeId=tby.id AND tb.price>70条件的行
3.子查询
库函数t_pricelevel
/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.1.49-community
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
create table `t_pricelevel` (
`id` int ,
`priceLevel` int ,
`price` float ,
`description` varchar (300)
);
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('1','1','80.00','价格贵的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('2','2','60.00','价格适中的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('3','3','40.00','价格便宜的书');
子查询:一个查询语句的条件可能落在另一个SELECT 语句的查询结果中。
/*带in关键字的子查询*/
SELECT * FROM t_book WHERE booktypeId IN (SELECT id FROM t_booktype);
SELECT * FROM t_book WHERE booktypeId NOT IN (SELECT id FROM t_booktype);
//查询了t_booktype表中的id,作为查询t_book表的条件
/*带比较大小运算符的子查询*/
SELECT * FROM t_book WHERE price>=(SELECT price FROM t_pricelevel WHERE priceLevel=1);
//查询t_book表中价格大于()中的数字的行
/*Exists,如果子查询存在,则执行外部查询*/
SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype);
SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_booktype);
/*ANY 关键字表示满足其中任一条件;*/
SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel);
/*ALL 关键字表示满足所有条件;*/
SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel);
4.合并查询
SELECT id FROM t_book;
//查询t_book中所有的ID
SELECT id FROM t_booktype;
//查询t_booktype中所有的ID
SELECT id FROM t_book UNION SELECT id FROM t_booktype;
//查询t_booktype和表t_book中所有不重复的的ID
SELECT id FROM t_book UNION ALL SELECT id FROM t_booktype;
//查询t_booktype和表t_book中的的ID(包括重复)
5.表与字段的别名取法
SELECT * FROM t_book WHERE id=1;
//查询id=1的书籍信息
SELECT * FROM t_book t WHERE t.id=1;
//查询id=1的书籍信息
SELECT t.bookName FROM t_book t WHERE t.id=1;
//查询id=1的书籍name
SELECT t.bookName AS bName FROM t_book t WHERE t.id=1;
SELECT t.bookName bName FROM t_book t WHERE t.id=1;
//查询查询id=1的书籍name,并重命名为bname