MySQL之DDL(数据定义语言)与DQL(数据查询语言)

1.DDL(数据定义语言)

1.1库和表的管理

/*

数据定义语言
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除
创建: create
修改: alter
删除: drop
*/
#一、库的管理
#1、库的创建
/*
语法:
create database  [if not exists]库名;
*/
#案例:创建库Books
CREATE DATABASE IF NOT EXISTS books ;
#2、库的修改(一般不用)
RENAME DATABASE books TO 新库名;
#更改库的字符集(一般不用)
ALTER DATABASE books CHARACTER SET gbk;
#3、库的删除
DROP DATABASE IF EXISTS books;
#二、表的管理
#1.表的创建 ★
/*
语法:
create table 表名(
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	列名 列的类型【(长度) 约束】,
	...
	列名 列的类型【(长度) 约束】
)
*/
#案例:创建表Book
CREATE TABLE book(
	id INT,#编号
	bName VARCHAR(20),#图书名
	price DOUBLE,#价格
	authorId  INT,#作者编号
	publishDate DATETIME#出版日期
);
DESC book;
#案例:创建表author
CREATE TABLE IF NOT EXISTS author(
	id INT,
	au_name VARCHAR(20),
	nation VARCHAR(10)
)
DESC author;
#2.表的修改
/*
语法
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
*/
#①修改列名
ALTER TABLE book CHANGE COLUMN publishdate pubDate DATETIME;
#②修改列的类型或约束
ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP;
#③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE; 
#④删除列
ALTER TABLE book_author DROP COLUMN  annual;
#⑤修改表名
ALTER TABLE author RENAME TO book_author;
DESC book;
#3.表的删除
DROP TABLE IF EXISTS book_author;
SHOW TABLES;
#通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;
DROP TABLE IF EXISTS 旧表名;
CREATE TABLE  表名();
#4.表的复制
INSERT INTO author VALUES
(1,'村上春树','日本'),
(2,'莫言','中国'),
(3,'冯唐','中国'),
(4,'金庸','中国');
SELECT * FROM Author;
SELECT * FROM copy2;

#1.仅仅复制表的结构
CREATE TABLE copy LIKE author;

#2.复制表的结构+数据
CREATE TABLE copy2 
SELECT * FROM author;

#只复制部分数据
CREATE TABLE copy3
SELECT id,au_name
FROM author 
WHERE nation='中国';


#仅仅复制某些字段
CREATE TABLE copy4 
SELECT id,au_name
FROM author
WHERE 0;

1.2代码演练

#1.	创建表dept1
NAME	NULL?	TYPE
id		INT(7)
NAME		VARCHAR(25)


USE test;

CREATE TABLE dept1(
	id INT(7),
	NAME VARCHAR(25)
	

);

#2.	将表departments中的数据插入新表dept2中
CREATE TABLE dept2
SELECT department_id,department_name
FROM myemployees.departments;


#3.	创建表emp5
NAME	NULL?	TYPE
id		INT(7)
First_name	VARCHAR (25)
Last_name	VARCHAR(25)
Dept_id		INT(7)

CREATE TABLE emp5(
id INT(7),
first_name VARCHAR(25),
last_name VARCHAR(25),
dept_id INT(7)

);


#4.	将列Last_name的长度增加到50
ALTER TABLE emp5 MODIFY COLUMN last_name VARCHAR(50);

#5.	根据表employees创建employees2
CREATE TABLE employees2 LIKE myemployees.employees;

#6.	删除表emp5
DROP TABLE IF EXISTS emp5;

#7.	将表employees2重命名为emp5
ALTER TABLE employees2 RENAME TO emp5;

#8.在表dept和emp5中添加新列test_column,并检查所作的操作
ALTER TABLE emp5 ADD COLUMN test_column INT;

#9.直接删除表emp5中的列 dept_id
DESC emp5;
ALTER TABLE emp5 DROP COLUMN test_column;

1.3常见的六大约束

名称 解释
NOT NULL 非空,用于保证该字段的值不能为空
DEFAULT 默认,用于保证该字段有默认值 比如性别
PRIMARY KEY 主键,用于保证该字段的值具有唯一性,并且非空,比如学号,员工编号
UNIQUE 唯一,用于保证该字段的值具有唯一性,可以为空比如座位号
CHECK 检查约束 (MySQL中不支持) 比如年龄或性别
FOREIGN KEY 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值

1.3.1脚本样式

//创建表约束
CREATE TABLE TIEDAN(
	ID INT PRIMARY KEY,//主键
	NAME VARCHAR(20) NOT NULL UNIQUE,//非空约束
	SEX CHAR(1) CHECK(SEX='男' OR SEX='女'),//检查约束
	SEAT INT UNIQUE,//唯一约束
	AGE INT DEFAULT 18,//默认约束
	MAJ INT REFERENCES MAJO(ID) //外键
)
//修改表时删除约束
#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

#2.删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT ;

#3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

SHOW INDEX FROM stuinfo;

1.3.2代码演练

#1.向表emp2的id列中添加PRIMARY KEY约束(my_emp_id_pk)

ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY;
ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);

#2.	向表dept2的id列中添加PRIMARY KEY约束(my_dept_id_pk)

#3.	向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
ALTER TABLE emp2 ADD COLUMN dept_id INT;
ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_dept2 FOREIGN KEY(dept_id) REFERENCES dept2(id);

1.4表格的标识列

1.4.1概念与特点

概念:
可以不用手动插入的值,系统提供默认的序列值

特点:

  1. 标识列不需要和主键搭配,只要求是个key
  2. 一个表只能有一个标识列
  3. 标识猎德类型只能是数值型
  4. 标识列可以通SETAUTO_INCREMENT_INCREMENT=3设置步长,也可以通过手动插入值,设置起始值

2.DQL(数据查询语言)

2.1基本的SELECT语句

  1. 查询所有列
  2. 查询特定的列
  3. 列的别名(重命名一个列。便于计算。紧跟列名,也可以在列名和别名之间加入关键字‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。)
  4. 字符串(字符串可以是 SELECT 列表中的一个字符,数字,日期。日期和字符只能在单引号中出现。 • 每当返回一行时,字符串被输出一次。)
  5. 显示表结构

注意

  1. SQL 语言大小写不敏感。 • SQL 可以写在一行或者多行
  2. 关键字不能被缩写也不能分行
  3. 各子句一般要分行写。
  4. 使用缩进提高语句的可读性。

2.1.1查询代码演练

1.语法

select 查询列表 from 表名;

2.特点

  1. 查询列表可以是:表中的字段、常量值、表达式、函数
  2. 查询的结果是一个虚拟的表格

3.查询表中的单个字段

SELECT 字段名 FROM (表名);

4.查询表中的多个字段(用逗号隔开)

SELECT 字段名,字段名 FROM (表名);

5.查询表中的所有字段(两种方式)
第一种(像上面那种查询单个字段一样,将所有字段写上去进行查询)

SELECT 
    字段名,
    字段名,
    字段名,
    字段名,
    字段名,
    字段名,
FROM
   表名 ;

第二种(*号代表所有)

 SELECT * FROM 表名;

6.查询常量

SELECT 100;
SELECT 'john';

7.查询表达式

SELECT 100%98;

8.查询函数

SELECT VERSION();

9.起别名

  1. 便于理解
  2. 如果要查询的字段有重名的情况,使用别名可以区分开来
方式一:使用as(例子)
SELECT 100%98 AS 结果;
SELECT 列名 AS,列名 ASFROM 表名;

方式二:使用空格
SELECT 列名 姓,列名 名 FROM 表名;

10.+号的作用
java中的+号:

  1. 运算符,两个操作数都为数值型
  2. 连接符,只要有一个操作数为字符串

mysql中的+号:

  • 仅仅只有一个功能:运算符
select 100+90; 两个操作数都为数值型,则做加法运算
select '123'+90;只要其中一方为字符型,试图将字符型数值转换成数值型。
select 'john'+90;如果转换成功,则继续做加法运算,如果转换失败,则将字符型数值转换成0
select null+10; 只要其中一方为null,则结果肯定为null

2.2过滤和排序数据

2.2.1过滤

使用WHERE 子句,将不满足条件的行过滤掉。
WHERE 子句紧随 FROM 子句。

2.2.2过滤查询代码块

语法:
	select 
		查询列表
	from
		表名
	where
		筛选条件;
		
分类:
	一、按条件表达式筛选
	
	简单条件运算符:> < = != <> >= <=
	
	二、按逻辑表达式筛选
	逻辑运算符:
	作用:用于连接条件表达式
		&& || !
		and or not
&&and:两个条件都为true,结果为true,反之为false
||or: 只要有一个条件为true,结果为true,反之为false
!not: 如果连接的条件本身为false,结果为true,反之为false	
	三、模糊查询
		like
		between and
		in
		is null

2.3分组查询

概念:
分组函数作用于一组数据,并对一组数据返回一个值。

2.3.1分组函数概解

功能:用作统计使用,又称为聚合函数或统计函数或组函数

分类:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数

特点:
1、sum、avg一般用于处理数值型
   max、min、count可以处理任何类型
2、以上分组函数都忽略null值

3、可以和distinct搭配实现去重的运算

4、count函数的单独介绍
一般使用count(*)用作统计行数

5、和分组函数一同查询的字段要求是group by后的字段

2.4多表查询

2.4.1笛卡尔集

语法:`select name,boyName from beauty,boys
笛卡尔集会在下面条件下产生:

– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接
• 为了避免笛卡尔集, 可以在 WHERE 加入有 效的连接条件。

2.4.2等值/连接连接

2.4.2.1使用连接在多个表中查询数据

• 在 WHERE 子句中写入连接条件。
• 在表中有相同列时,在列名之前加上表名前缀

2.4.2.2区分重复的列名

• 在不同表中具有相同列名的列可以用表的别名
加以区分。
• 如果使用了表别名,则在select语句中需要使
用表别名代替表名
• 表别名最多支持32个字符长度,但建议越少越
好

2.4.2.3表的别名

• 使用别名可以简化查询。
• 使用表名前缀可以提高执行效率。

2.4.2.4连接多个表

• 连接 n个表,至少需要 n-1个连接条件。 例如:连接
三个表,至少需要两个连接条件。。

2.4.3join链接

2.4.3.1分类

– 内连接 [inner] join on
– 外连接
	• 左外连接 left [outer] join on
	• 右外连接 right [outer] join on

2.4.3.2使用ON 子句创建连接

• 自然连接中是以具有相同名字的列为连接条件的。
• 可以使用 ON 子句指定额外的连接条件。
• 这个连接条件是与其它条件分开的。
• ON 子句使语句具有更高的易读性。

2.4.3.3join语法概括

语法:
	select 查询列表
	from 表1 别名 【连接类型】
	join 表2 别名 
	on 连接条件
	【where 筛选条件】
	【group by 分组】
	【having 筛选条件】
	【order by 排序列表】
	

分类:
内连接(★):inner
外连接
	左外(★):left 【outer】
	右外(★):right 【outer】
	全外:full【outer】
交叉连接:cross 

内连接:
语法:
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;

分类:
等值
非等值
自连接

特点:
①添加排序、分组、筛选
②inner可以省略
③ 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

外连接:
应用场景:用于查询一个表中有,另一个表没有的记录
 
 特点:
 1、外连接的查询结果为主表中的所有记录
	如果从表中有和它匹配的,则显示匹配的值
	如果从表中没有和它匹配的,则显示null
	外连接查询结果=内连接结果+主表中有而从表没有的记录
 2、左外连接,left join左边的是主表
    右外连接,right join右边的是主表
 3、左外和右外交换两个表的顺序,可以实现同样的效果 
 4、全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的

2.5常见函数

2.5.1字符函数

作用 函数 结果
转小写 LOWER(‘SQL Course’) sql course
转大写 UPPER(‘SQL Course’) SQL COURSE
拼接 CONCAT(‘Hello’, ‘World’) HelloWorld
截取 SUBSTR(‘HelloWorld’,1,5) Hello
长度 LENGTH(‘HelloWorld’) 10
字符出现索引值 INSTR(‘HelloWorld’, ‘W’) 6
字符截取后半段 TRIM(‘H’ FROM ‘HelloWorld’) elloWorld
字符替换 REPLACE(‘abcd’,‘b’,‘m’) amcd

2.5.2字符函数

作用 函数 结果
四舍五入 ROUND(45.926, 2) 45.93
截断 TRUNC(45.926, 2) 45.92
求余 MOD(1600, 300) 100

2.5.3日期函数

作用 函数 结果
获取当前日期 now()
将日期格式的字符转换成指定格式的日期 STR_TO_DATE(‘9-13-1999’,’%m-%d-%Y’) 1999-09-13
将日期转换成字符 DATE_FORMAT(‘2018/6/6’,‘%Y年%m月%d日’) 2018年06月06日

在这里插入图片描述

2.5.4常见函数概括

常见函数:
概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1、隐藏了实现细节  2、提高代码的重用性
调用:select 函数名(实参列表) 【from 表】;
特点:
	①叫什么(函数名)
	②干什么(函数功能)

分类:
	1、单行函数
	如 concat、length、ifnull等
	2、分组函数
	
	功能:做统计使用,又称为统计函数、聚合函数、组函数
	
常见函数:
	一、单行函数
	字符函数:
	length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
	concat
	substr
	instr
	trim
	upper
	lower
	lpad
	rpad
	replace
	
	数学函数:
	round
	ceil
	floor
	truncate
	mod
	
	日期函数:
	now
	curdate
	curtime
	year
	month
	monthname
	day
	hour
	minute
	second
	str_to_date
	date_format
	其他函数:
	version
	database
	user
	控制函数
	if
	case

2.6子查询

2.6.1子查询含义与分类

含义:
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

分类:
	按子查询出现的位置:
		select后面:
			仅仅支持标量子查询
		
		from后面:
			支持表子查询
		where或having后面:★
			标量子查询(单行) √
			列子查询  (多行) √
			
			行子查询
			
		exists后面(相关子查询)
			表子查询
	    按结果集的行列数不同:
		标量子查询(结果集只有一行一列)
		列子查询(结果集只有一列多行)
		行子查询(结果集有一行多列)
		表子查询(结果集一般为多行多列)

2.7分页查询

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:
	select 查询列表
	from 表
	【join type join 表2
	on 连接条件
	where 筛选条件
	group by 分组字段
	having 分组后的筛选
	order by 排序的字段】
	limit 【offset,】size;
	
	offset要显示条目的起始索引(起始索引从0开始)
	size 要显示的条目个数
特点:
	①limit语句放在查询语句的最后
	②公式
	要显示的页数 page,每页的条目数size

3.总结

  1. 对于数据库里面的数据进行增删改查的时候要注意列字段跟语句不能写错
  2. 明确自己写sql语句时用哪些代码
  3. 有什么不对的地方欢迎指正!谢谢观看!

猜你喜欢

转载自blog.csdn.net/Smootht/article/details/106806432