MySQL


DB

  • 数据库 (database) : 存储数据的 “仓库”, 它保存了一系列有组织的数据

DBMS

  • 数据库管理系统 (Database Management System) 数据库是通过 DBMS 创建和操作的容器

SQL

  • 结构化查询语言 (Structure Query Language) 专门用来与数据库通信的语言

安装MySQL

  1. http://dev.mysql.com/downloads/mysql

    C:\Users\14456\OneDrive\桌面\文件\MySQL

启动MySQL

  1. CMD 已管理员程序运行
  2. net stop mysqlKOKO 停止 (名字是你取的名字)
  3. net start mysqlKOKO 启动

连接服务器

方式一:通过 MySQL 自带的客户端只限于 root 用户

方式二:通过windows自带的客户端

登录:mysql [ -h主机名-P端口号 ] -u用户名 -p密码 ( 中括号里,如果是本机可以不需要写 )

退出:ctrl+C

操作MySQL

  • 下面有 [] 表示该条件可有可无

基础查询

语法: select 字段 from 表名;

  • 表中有一个或多个列 , 列又称为 “字段”
# 1.查询表中的单个字段
SELECT first_name FROM employees;
/*
first_name   
-------------
Steven       
Neena        
Lex          
Alexander    
Bruce        
David  
*/

# 2.查询表中的多个字段  如果查询条件有一个 name 它会把它变成关键字,所有这时候 `` 就起作用了
SELECT `first_name`,last_name,manager_id FROM employees; 
/*
first_name   last_name    manager_id  
-----------  -----------  ------------
Steven       K_ing              (NULL)
Neena        Kochhar               100
Lex          De Haan               100
Alexander    Hunold                102
Bruce        Ernst                 103
David        Austin                103
*/

# 3.查询所有
SELECT	* FROM employees;


# 4.取别名
SELECT `first_name` asFROM employees;
SELECT `first_name`FROM employees;
/*
姓          
-------------
Steven       
Neena        
Lex          
Alexander    
Bruce        
David 
*/

# 4.1.OUT是关键字
SELECT salary AS `OUT put` FROM employees;
SELECT salary AS 'OUT put' FROM employees;
/*
 OUT put  
----------
  24000.00
  17000.00
  17000.00
  9000.00
  6000.00
  4800.00
  4800.00
  4200.00
  12000.00
*/

条件查询

  • WHERE 条件筛选
!=  <> 不等于 >  <  =  >=  <=
&&  ||   !
and or  not

SELECT employee_id,salary,last_name,email FROM employees WHERE salary>12000;
/*
employee_id    salary  last_name  email     
-----------  --------  ---------  ----------
        100  24000.00  K_ing      SKING     
        101  17000.00  Kochhar    NKOCHHAR  
        102  17000.00  De Haan    LDEHAAN   
        145  14000.00  Russell    JRUSSEL   
        146  13500.00  Partners   KPARTNER  
        201  13000.00  Hartstein  MHARTSTE  
*/

模糊查询

  • LIKE 搭配通配符使用
  • 如果使用 LIKE 操作符时没有使用通配符,那么效果是和等号是一致的
  • % 任何字符出现任意次数(可以是0次)(不区分大小写)
  • _ 表示单个字符
SELECT last_name FROM employees WHERE last_name LIKE '%De'; # de(De)结尾
/* 
last_name  
-----------
Ande   
*/

SELECT last_name FROM employees WHERE last_name LIKE 'de%'; # de(De)开头
/*
last_name  
-----------
De Haan    
Dellinger  
*/

SELECT last_name FROM employees WHERE last_name LIKE '%de%';# 包含de的记录
/*
last_name  
-----------
De Haan    
Ande       
Dellinger  
*/

					    #Pat aba lla
SELECT last_name FROM employees WHERE last_name LIKE '___a_a%';
/*
last_name  
-----------
Pataballa  
*/

# Ozer,Baer    表示长度为4,以er为结尾的条件
SELECT last_name FROM employees WHERE last_name LIKE '__er';
/*
last_name  
-----------
Ozer       
Baer       
*/

# C olmen ares 表示长度为10,以C开头,以ares结尾,忽略中间5个
SELECT last_name FROM employees WHERE last_name LIKE 'C_____ares';
/*
last_name   
------------
Colmenares  
*/

排序查询

语法 SELECT 查询条件 FROM 表 [筛选条件] ORDER BY 排序列表 [ asc || DESC ]

SELECT salary FROM employees ORDER BY salary DESC; # 工资从高到底
/*
  salary  
----------
  24000.00
  17000.00
  17000.00
  14000.00
  13500.00
  13000.00
  12000.00
  12000.00
*/

SELECT salary FROM employees ORDER BY salary ASC;  # 工资从底到高
/*
  salary  
----------
  2100.00
  2200.00
  2200.00
  2400.00
  2400.00
  2500.00
  2500.00
  2500.00
*/

分组查询

语法: select 分组函数,列 from 表 [ 筛选条件 ] group by 分组列表

  • 分组查询 把相同的值,分为一组
# 查询每个工种的最高工资
SELECT MAX(salary),job_id   FROM employees GROUP BY job_id;
/*
MAX(salary)  job_id      
-----------  ------------
    8300.00  AC_ACCOUNT  
   12000.00  AC_MGR      
    4400.00  AD_ASST 
*/

# 查询每个位置上的部门个数
SELECT COUNT(*),location_id FROM departments GROUP BY location_id;
/*
COUNT(*)  location_id  
--------  -------------
       1           1400
       1           1500
      21           1700
       1           1800
*/

# 查询邮箱中包含a的字符,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE "%a%" GROUP BY department_id;
/*
 AVG(salary)  department_id  
------------  ---------------
 7000.000000           (NULL)
 4400.000000               10
 9500.000000               20
 4460.000000               30
 6500.000000               40
 3496.153846               50
*/

# 分组后筛选
SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 2
/*
COUNT(*)  department_id  
--------  ---------------
       6               30
      45               50
       5               60
      34               80
       3               90
       6              100
*/

# 分组以 id 分组是没效果的因为 id 没有重复的
SELECT id,Gname FROM grouping GROUP BY id;
/*
id  Gname        
 1  相同     
 2  相同     
 3  不相同  
 4  相同     
 5  相同     
 6  相同     
 7  不相同  
*/
SELECT id,Gname FROM grouping GROUP BY Gname;
/*
 id  Gname      
 3   不相同  
 1   相同     
*/ 

连接查询

  1. 等值连接
SELECT last_name,department_name  FROM departments,employees  
WHERE employees.department_id = departments.department_id
/*
last_name    department_name  
-----------  -----------------
Whalen       Adm              
Hartstein    Mar              
Fay          Mar              
Raphaely     Pur
*/

# 查找每个城市的部门数
SELECT COUNT(*) 个数,city 
FROM departments d,locations l 
WHERE d.location_id = l.location_id GROUP BY city;
/*
个数  city                 
------  ---------------------
     1  London               
     1  Munich               
     1  Oxford               
    21  Seattle              
     1  South San Francisco  
     1  Southlake            
     1  Toronto              
*/
  1. 非等值连接
SELECT salary,grade_level  FROM employees,job_grades  
WHERE salary >= job_grades.lowest_sal AND job_grades.highest_sal;
/*
  salary  grade_level  
--------  -------------
24000.00  A            
24000.00  B            
24000.00  C            
24000.00  D            
24000.00  E            
24000.00  A            
24000.00  B            
24000.00  C 
*/

内连接,外连接(左外连接,右外连接)

语法: select 列 from 表1 [ 连接类型 ] join 表2 on 连接条件 [ where 筛选条件 ] [ gropu by 分组 ] [ having 筛选条件 ]
[ order by 排序 ]

连接类型: 内连: [ inner ] join
左连: left join [outer]
右连: right join [outer]
全连: full join [outer] MySQL不支持
交叉连接: cross join [outer]

  1. 内连接
# 1.1 等值连接
SELECT last_name,department_name FROM departments JOIN employees 
ON employees.department_id = departments.department_id
/*
last_name    department_name  
-----------  -----------------
Whalen       Adm              
Hartstein    Mar              
Fay          Mar              
Raphaely     Pur
*/

# 1.2 非等值连接
SELECT salary,grade_level 
FROM employees 
INNER JOIN job_grades 
ON salary >= job_grades.lowest_sal AND job_grades.highest_sal;
/*
  salary  grade_level  
--------  -------------
24000.00  A            
24000.00  B            
24000.00  C            
24000.00  D            
24000.00  E            
24000.00  A            
24000.00  B            
24000.00  C 
*/

# 1.3 自连接 查询员工名字和上级名
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m
ON e.manager_id = m.employee_id;
/*
last_name    last_name  
-----------  -----------
Kochhar      K_ing      
De Haan      K_ing      
Hunold       De Haan    
Ernst        Hunold     
Austin       Hunold
*/
  1. 外连接 用于查询一个表中有,另一个表没有的记录
  • 特点:
  • 外连接的查询结果为主表中的所有记录
    如果副表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示 null
  • 左外连接,left join 左边的是主表
  • 右外连接,right join 右边的是主表
/*
CREATE DATABASE 连接查询;

CREATE TABLE person(
  id INT,
 `name` VARCHAR(20),
  cardId INT
);

CREATE TABLE card(
  id INT,
 `name` VARCHAR(20)
);

INSERT INTO card 
VALUES(1,"建设银行卡"), (2,"工商银行卡"), (3,"农业银行卡"), (4,"邮政银行卡"),
(5,"福建银行卡");

INSERT INTO person 
VALUES(1,"张三",1),(2,"张无忌",2),(3,"李四",3),(4,"王老五",666);
*/



# inner join(内连接) 查询相等的数据
SELECT * FROM person INNER JOIN card ON  person.cardId = card.id;
/*
    id    name     cardId   id     name             
     1    张三        1      1   建设银行卡  
     2    张无忌      2      2   工商银行卡  
     3    李四        3      3   农业银行卡   
*/

# left join(左外连接)
# 左外连接,会把左边表里面的所有数据取出来,而右边表中的数据,如果有相等的,就显示出来,如果没有,则显示 null
SELECT * FROM person LEFT JOIN card ON  person.cardId = card.id;
/*
    id   name      cardId    id     name             
     1   张三         1       1   建设银行卡  
     2   张无忌       2       2   工商银行卡  
     3   李四         3       3   农业银行卡  
     4   王老五      666    (NULL)  (NULL)    
*/

# right join(右外连接)
# 右外连接,会把右边表里面的所有数据取出来,而左边表中的数据,如果有相等的,就显示出来,如果没有,则显示 null
SELECT * FROM person RIGHT JOIN card ON  person.cardId = card.id;
/*
    id      name       cardId   id     name             
     1      张三         1       1  建设银行卡  
     2      张无忌       2       2  工商银行卡  
     3      李四         3       3  农业银行卡  
   (NULL)  (NULL)     (NULL)     4  邮政银行卡  
   (NULL)  (NULL)     (NULL)     5  福建银行卡  
*/

子查询

/*
一、 where 或 having后面
 1、标量子查询(单行子查询)
 2、列子查询 (多行子查询)
 3、行子查询

二、特点:
 1、 子查询放在小括号内
 2、子查询一般放在条件的右侧
 3、标量子查询,—般搭配着单行操作符使用
 > < >= <= = <>
 
 列子查询,一般搭配着多行操作符使用工
 IN  ANY  SOME  ALL
 ANY 任意一个
 IN  判断值是否满足 IN 列表中的某一项
 ALL 全满足
*/


# 1.标量子查询(单行子查询) 查询比Abel工资高的员工
SELECT last_name,salary FROM employees WHERE salary >
(SELECT salary 工资 FROM employees WHERE last_name  = "Abel");
/*
last_name    salary  
---------  ----------
K_ing        24000.00
Kochhar      17000.00
De Haan      17000.00
Greenberg    12000.00
Russell      14000.00
Partners     13500.00
Errazuriz    12000.00
Ozer         11500.00
Hartstein    13000.00
Higgins      12000.00
*/
	 
# 2.列子查询(多行子查询)  返回 location_id 是 1400 或 1700 的部门中的所有员工姓名
SELECT last_name  FROM employees  WHERE department_id 
IN( SELECT  department_id FROM departments WHERE location_id IN(1400,1700) );
/*
last_name   
------------
K_ing       
Kochhar     
De Haan     
Hunold      
Ernst       
Austin      
Pataballa   
Lorentz     
Greenberg   
Faviet  
*/

分页查询

语法:

select 查询列表 from 表
[ join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段 ]
limit offset, size;

  • offset 要显示条目的起始索引 (起始索引从0开始)
  • size 要显示的条目个数
# 前五条
SELECT first_name FROM employees LIMIT 0,5;
SELECT first_name FROM employees LIMIT 5;
/*
first_name  
------------
Steven      
Neena       
Lex         
Alexander   
Bruce       
*/

# 11条到25条
SELECT * FROM employees LIMIT 10,15;
/*
first_name   
-------------
John         
Ismael       
Jose Manuel  
Luis         
Den          
Alexander    
Shelli       
Sigal        
Guy          
Karen        
Matthew      
Adam         
Payam        
Shanta       
Kevin
*/

联合查询

  • union:将多条查询语句的结果合并成一个结果

  • union all 不会去重

# 查询部门编号 >90 或邮箱包含a的员工信息

SELECT * FROM employees WHERE email LIKE "%a%"
UNION
SELECT * FROM employees WHERE  department_id > 90

去重

SELECT DISTINCT department_id FROM employees;
/*
原始数据
department_id  
---------------
(NULL)
    10
    20
    20
    30
    30
    30
    30
    30
    30
    40
    50
*/
/*
department_id  
---------------
 (NULL)
     10
     20
     30
     40
     50
     60
     70
     80
     90
    100
    110
*/

拼接

  • 注意: null 与任何东西拼接都为 null
# IFNULL 如果值为 null 就转换为  "哈哈哈"
SELECT IFNULL(commission_pct,"哈哈哈") AS 奖金,commission_pct FROM employees;
/*
奖金     commission_pct  
---------  ----------------
哈哈哈                  (NULL)
哈哈哈                  (NULL)
0.40                   0.40
0.30                   0.30
0.30                   0.30
哈哈哈                  (NULL)
哈哈哈                  (NULL)
哈哈哈                  (NULL)
*/

SELECT CONCAT(first_name,"-",commission_pct) FROM employees;
/*
(NULL)                                 
(NULL)                                 
(NULL)                                 
(NULL)                                 
(NULL)                                 
John-0.40                              
Karen-0.30                             
Alberto-0.30 
*/

运算符

  • 如果字符串能转换就让他们计算 , 转换不了就返回里面数字
SELECT "10" + 50 结果; # 60
SELECT "哈哈哈10" + 81 结果; # 81

转义

SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
/*
last_name  
-----------
K_ing      
K_ing      
*/

SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
/*
last_name  
-----------
K_ing      
K_ing      
*/

in

  • 判断值是否满足 in 列表中的某一项
SELECT last_name,job_id FROM employees WHERE job_id = "IT_PROT" OR job_id = "AD_VP"
/*
last_name  job_id  
---------  --------
Kochhar    AD_VP   
De Haan    AD_VP   
*/

SELECT last_name,job_id FROM employees WHERE job_id IN("IT_PROT","AD_VP","AD_PRES")
/*
last_name  job_id  
---------  --------
Kochhar    AD_VP   
De Haan    AD_VP   
*/

is null

  • = 或 <>,运算符判断不了为 null 的值
  • is null 判断为空的值
SELECT commission_pct FROM employees WHERE commission_pct = NULL; # 判断不了
/*
commission_pct  
----------------
*/
SELECT commission_pct FROM employees WHERE commission_pct IS NULL;
/*
commission_pct  
----------------
 (NULL)
 (NULL)
 (NULL)
 (NULL)
 (NULL)
*/

函数

  1. length 获取参数值的字节个数,汉字占3个字节
SELECT LENGTH("123KOKO"); # 7
  1. concat 拼接字符
SELECT CONCAT(last_name,first_name) FROM employees;
/*
CONCAT(last_name,first_name)  
------------------------------
K_ingSteven                   
KochharNeena                  
De HaanLex                    
HunoldAlexander 
*/
SELECT CONCAT(last_name,"_",first_name) FROM employees;
/*
CONCAT(last_name,"_",first_name)  
----------------------------------
K_ing_Steven                      
Kochhar_Neena                     
De Haan_Lex                       
Hunold_Alexander    
*/
  1. upper,lower 转换大小写
SELECT UPPER("koko"); # KOKO

SELECT LOWER("KOKO"); # koko
  1. substr,substring 索引从 1 开始
SELECT SUBSTR("我爱洗澡,皮肤好",6);# 皮肤好, 从6开始获取后面所有字符

SELECT SUBSTR("我爱洗澡,皮肤好",1,2);# 我爱, 从1开始,长度为2
  1. instr 返回子串第一次出现的索引,如果没有返回 0
SELECT INSTR("我爱洗澡,皮肤好","皮肤好") AS 索引; # 6
  1. trim 清除两边空格
SELECT LENGTH("        啊啊啊        ") AS 结果; # 25

SELECT LENGTH(TRIM("        啊啊啊        ")) AS 结果; # 9

SELECT TRIM("a" FROM "aaaaaaaaaa啊啊啊aaaaaaaa") AS 结果; # 啊啊啊
  1. lpad,rpad 用指定的字符实现左填充指定长度
SELECT LPAD("KOKO",6,"*");# **KOKO  长度6

SELECT RPAD("KOKO",6,"*");# KOKO**  长度6
  1. replace 替换
SELECT REPLACE("你ki你擦,替换我",",替换我","");# 你ki你擦
  1. round 四舍五入
SELECT ROUND(1.5);#2
SELECT ROUND(1.4);#1
SELECT ROUND(1.567,2);# 1.57
  1. ceil 向上取整
SELECT CEIL(1.1);# 2
  1. floor 向下取整
SELECT FLOOR(1.9);# 1 
  1. truncate 截断
SELECT TRUNCATE(1.65895844,1)# 1.6 截断一位 
  1. mod 取模(取余)
SELECT MOD(10,3);# 1
SELECT 10%3;# 1
  1. mow 当前系统时间, curdate 当前日期,不包含时间, curtime 当前时间
SELECT NOW();# 2020-12-16 11:49:23
SELECT CURDATE(); # 2020-12-16
SELECT CURTIME(); # 11:51:21

# 年,月,日,小时,分钟,秒
SELECT YEAR(NOW());  # 2020
SELECT YEAR("1999-1-1");  # 1999
SELECT MONTH(NOW()); # 12
SELECT DAY(NOW());   # 16
SELECT HOUR(NOW());  # 11
SELECT MINUTE(NOW());# 54
SELECT SECOND(NOW());# 42
# 2020-12-16 11:54:42
  • 格式符 (功能)

%Y (4位年份) , %y(2位年份)
%m (月份,01,02,…11,12) , %c(月份,1,2,…,11,12) 补0和不补0
%d (日,01,02)
%H (24小时制)
%h (12小时制)
%i (分钟,00,01,02,…,59)
%s (秒, 00,01,02,…,59)

# str_to_date 转换为指定的日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS dete; # 1998-03-02

# date_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS dete;  # 20年12月16日

# datediff 相差天数,值为日期形式, 格式最大,最小
SELECT DATEDIFF("1998-1-1","1997-1-1"); # 365

分组函数

  • sum 求和,avg平均值,max最大值,min最小值,count计算个数
  • max,min,count 可以处理任意类型,分组函数都忽略 null 值
SELECT SUM(salary) FROM employees; # 691400.00
SELECT AVG(salary) FROM employees; # 6461.682243
SELECT MAX(salary) FROM employees; # 24000.00
SELECT MIN(salary) FROM employees; # 2100.00
SELECT COUNT(salary) FROM employees; # 107
  • count详细
SELECT COUNT(*) FROM employees; # 性能更高
SELECT COUNT(1) FROM employees;
# 这两个比 COUNT(salary) 性能更高,因为 COUNT(salary)里面会有筛选条

流程控制函数

  • if函数: 相当于 if else
SELECT IF(10>6,"大","小"); # 大       

SELECT commission_pct, IF(commission_pct IS NULL,"没奖金","有奖金,哈哈哈") AS 奖金 FROM employees;
/*
commission_pct  奖金               
--------------  ---------------------
        (NULL)  没奖金            
        (NULL)  没奖金            
        (NULL)  没奖金  
        0.40  有奖金,哈哈哈  
        0.30  有奖金,哈哈哈  
        0.30  有奖金,哈哈哈  
        0.30  有奖金,哈哈哈  
*/
  • case
SELECT salary,department_id,
 CASE  department_id
 WHEN 30 THEN salary *1.1
 WHEN 40 THEN salary *1.2
 WHEN 20 THEN salary *1.3
 ELSE salary
 END AS 新工资
FROM employees;
/*
  salary  department_id  新工资  
--------  -------------  -----------
24000.00             90     24000.00
17000.00             90     17000.00
17000.00             90     17000.00
 9000.00             60      9000.00
 6000.00             60      6000.00
 4800.00             60      4800.00
 4800.00             60      4800.00
*/

case 使用2
SELECT salary,
 CASE  
 WHEN salary>20000 THEN "A"
 WHEN salary>15000 THEN "B"
 WHEN salary>10000 THEN "C"
 ELSE "D"
 END AS 工资级别
FROM employees;
/*
  salary  工资级别  
--------  --------------
24000.00  A             
17000.00  B             
17000.00  B             
 9000.00  D             
 6000.00  D             
 4800.00  D             
 4800.00  D             
 4200.00  D             
12000.00  C  
*/

插入

语法: insert into 表名 (列名) values (值)

  1. 类型必须一致
  2. 你有两列就必须有两个值
  3. 可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
SELECT * FROM beauty;

INSERT INTO 
beauty(id,`name`,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,"KOKO","女","2000-1-26","10086",NULL,2)

INSERT INTO beauty 
VALUES(18,"KOKE","男","2020-1-26","520",NULL,8)

INSERT INTO beauty 
VALUES(20,"KO","男","2020-1-26","520",NULL,8),
	  (21,"KOK","女","2020-1-26","520",NULL,9);

修改

语法: update 表名 set 列 = 新值,列 = 新值,…
不加筛选条件改的是所有列

UPDATE beauty SET phone = "修改了" WHERE NAME LIKE "KO%"

删除

# 1.单表的删除
# 语法: delete from 表 where 筛选条件 不加筛选条件 "删除所有"
 
# 2.多表的删除
语法: delete(1)的别名,[(2)的别名 ] 
 from(1) 别名 
 right join(2) 别名 
 on 连接条件
 where 筛选条件
 
# 方式二: truncate table 表名 删除表中所有数据,自增id从1开始

# 1.单表的删除
DELETE FROM beauty # 删除 beauty 表中所有数据

DELETE FROM beauty WHERE NAME LIKE "Ko"

# 2.多表的删除
DELETE b
FROM beauty AS b
INNER JOIN boys AS bo 
ON b.boyfriend_id = bo.id
WHERE bo.boyName = "张无忌";

建库,删库

CREATE DATABASE book; # 建库
  DROP DATABASE book; # 删库

建表

/*
create table 表名(
 列名 列的类型 [ (长度) 约束 ],
 列名 列的类型 [ (长度) 约束 ],
)
*/
CREATE TABLE book(
  id INT, 	         # 编号     数值类型
 `name` VARCHAR(20), # 书名     字符串类型
  price DOUBLE,      # 价格     小数点类型
  authorID INT,      # 作者ID   字数值类型
  `date` DATETIME    # 出版日期  时间类型
);

# 修改表
ALTER TABLE 修改表 RENAME TO UP_biao;

# 新增列
ALTER TABLE book ADD COLUMN xinzeng DOUBLE;

# 删除列
ALTER TABLE book DROP COLUMN xinzeng;

# 修改列
ALTER TABLE book CHANGE COLUMN `date` `newDate` DATETIME;

# 修改列的类型
ALTER TABLE book MODIFY COLUMN newDate TIME;

# 删除表
DROP TABLE copy;

# 表赋值
# 只复制表结构
CREATE TABLE copy LIKE book;

# 复制结构与数据
CREATE TABLE copy2 SELECT * FROM book;

约束

  • 一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
  • NOT NULL:非空, 用于保证该字段的值不能为空
  • DEFAULT: 默认, 用于保证该字段有默认值
  • PRIMARY KEY: 主键,用于保证该字段的值具有唯一性,并且不能为空
  • UNIQUE::唯—,用于保证该字段的值具有唯一性,可以为空
  • AUTO_INCREMENT: 自增
# 标识列
CREATE TABLE books(
  id INT PRIMARY KEY AUTO_INCREMENT,
  aName VARCHAR(20)
);
INSERT INTO books VALUES(NULL,"josh");
SELECT * FROM books;

# 联合主键 只要联合的主键值加起来不重复就可以
CREATE TABLE user2(
 id INT,
 NAME VARCHAR(20),
 PASSWORD VARCHAR(20),
 PRIMARY KEY (id,NAME) # 联合主键
);
INSERT INTO user2 VALUES (1,'张三', '123');
INSERT INTO user2 VALUES (2,'张三', '123');
INSERT INTO user2 VALUES (1,'李四', '123');


# 班级表
CREATE TABLE Class_table(
  id INT PRIMARY KEY,
  `name` VARCHAR(20)
);

# 学生表
CREATE TABLE Student_list(
  id INT PRIMARY KEY,
  `name` VARCHAR(20),
   class_id INT,
   FOREIGN KEY(class_id) REFERENCES Class_table(id)
);
INSERT INTO Class_table VALUES (1,'一班');
INSERT INTO Class_table VALUES (2,'二班');
INSERT INTO Class_table VALUES (3,'三班');


INSERT INTO Student_list VALUES (1,'张飒',1);
INSERT INTO Student_list VALUES (2,'张飞',2);
INSERT INTO Student_list VALUES (3,'张无忌',3);
INSERT INTO Student_list VALUES (4,'关羽',4); # 主表没有ID为4的,所以才会报错

/*
1.主表 Class_table 中没有的数据值,在副表中是不可以使用的
  FOREIGN KEY(class_id) REFERENCES Class_table(id)
 简单来说: class_id 要一一对应 Class_table 里的ID
 
2.主表中的记录被副表引用,是不可以被删除的
*/

SELECT * FROM Class_table;
SELECT * FROM Student_list;

类型

# 类型:
# 时间戳     默认值    当前时间戳
# TIMESTAMP DEFAULT  CURRENT_TIMESTAMP 
# UPDATE CURRENT_TIMESTAMP  更新当前时间戳

事务

/*
事务的特性: ACID
原子性: 一个事务不可再分割,要么都执行要么都不执行
一致性: 一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性: 一个事务的执行不受其他事务的干扰
持久性: 一个事务一旦提交,则会永久的改变数据库的数据.
*/


CREATE TABLE  Affair(
  id INT PRIMARY KEY,
  `name` VARCHAR(20),
   money INT
);

/*
事务开启:
1. 修改默认提交 set autocommit=0;
2. begin;
3. start transaction;
*/
 

# 关闭 mysql 的自动提交(commit)
SET autocommit=0;

# 新增一条数据
INSERT INTO Affair VALUES(2,"詹姆斯",8888);

SELECT * FROM Affair;
/*
 id  name    money  
 1   科比    8124
 2   詹姆斯  8888
*/

ROLLBACK;# 撤销刚刚的 sql 语句

SELECT * FROM Affair;
/*
 你刚刚看到的是虚拟的数据,并没有插入到数据库里面
 id  name    money  
 1   科比    8124
*/

COMMIT;  # 一旦提交,数据就会插入到数据库里
/*
 id  name    money  
 1   科比    8124
 2   詹姆斯  8888
*/



# 手动开启事务 begin; 或者 start transaction;
BEGIN;
INSERT INTO Affair VALUES(3,"詹姆斯丶哈登",7785);


START TRANSACTION;
INSERT INTO Affair VALUES(3,"詹姆斯丶哈登",7785);

SELECT * FROM Affair;
/*
 id  name          money  
 1   科比          8124
 2   詹姆斯        8888
 3   詹姆斯丶哈登  7785
*/

ROLLBACK;


SELECT * FROM Affair;
/*
 id  name        money  
 1   科比        8124
 2   詹姆斯      8888
*/



/*
修改隔离级别:
set global transaction isolation level repeatable read;
# mysql 8.0使用方法
select @global.transaction_isolation;

# mysql 5.0使用方法
select @global.tx_isolation;

事务的隔离性:
1、read uncommitted; 读未提交的
 - 脏读:一个事务读到了另外一个事务没有提交的数据,就叫做脏读
2、read committed;   读已经提交的
 - 不可重复读: 可以读到最新的数据,但不能读到之前的数据
3、repeatable read;  可以重复读;
 - 事务A和事务B 同时操作一张表,事务A提交的数据,也不能被事务B读到,就可以造成幻读。
4、serializable;     串行化
 - 事务A操作数据库时,其他人会等着事务A操作完,才能继续操作数据库;
*/

视图

语法: create view 视图名 as 查询语句(一般放复杂查询语句)

# 查询姓名中包含a字符的员工名、部门名和工种信息

# 1.创建
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees AS e
JOIN departments AS d ON e.department_id = d.department_id
JOIN jobs AS j ON j.job_id = e.job_id;

# 2.使用
SELECT * FROM myv1 WHERE last_name LIKE "%a%";

# 修改视图
CREATE OR REPLACE VIEW myv1 AS #查询条件

# 删除视图
DROP VIEW myv1;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值