Python21期 day15 之mysql

一、mysql操作语句

SELECT 语句

select语句用于从数据库中选取数据,结果被存储在一个结果表中,称为结果集

SQL SELECT语法:

SELECT column_name,column_name FROM table_name;
与
SELECT * FROM table_name;

INSERT INTO 语句

insert into 语句用于向表中插入新记录

SQL INSERT INTO 语法:

INSERT INTO table_name VALUES(value1,value2,...);

UPDATE 语句

update 语句用于更新表中存在的记录。切记where语句不可省,否则所有记录都被更新!

SQL UPDATE语法:

UPDATE table_name SET column1=value1 WHERE column=value;

DELETE FROM语句

delete语句用于删除表中记录

SQL DELETE语句:

DELETE FROM table_name WHERE column=value;

ALTER TABLE 语句

alter table语句用来在已有的表中添加、删除或修改列

SQL ALTER TABLE语法:

1、在表中添加列,使用下面语法
ALTER TABLE table_name ADD column_name datatype

2、改变表中列的数据类型,使用下面语法
ALTER TABLE table_name MODIFY COLUMN column_name datatype

二、数据库相关操作

1、创建数据库语法

CREATE DATABASE db_name charset utf8;

2、创建表语法

create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);

#注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的

#复制表结构:create table 新表 like 旧表
#复制表数据:create table 新表 select * from 旧表

3、数据类型

  3.1 字符类型

# char和varchar 括号内的参数指的是字符的长度

#char类型:定长,简单粗暴,浪费空间,存取速度快
    字符长度范围:0-255
#varchar类型:变长,精准,节省空间,存取速度慢
    字符长度方位:0-65535

  3.2 枚举和集合类型

字段的值只能在给定范围中选择,如单选、多选
enum 单选 只能在给定范围内选一个值,如性别sex 男/女
set 多选 在给定范围内可以选择一个或一个以上的值(兴趣1,兴趣2...)

例:
create table consumer(
    id int,
    name varchar(50),
    sex enum('male','female'),
    level enum('vip1','vip2','vip3'),    #指定范围内,多选一
    fav set('play','music','read','study')    #指定范围内,多选多
);

4、完整性约束

约束条件与数据类型的宽度一样,都是可选参数。

作用:用于保证数据的完整性和一致性

分为:
PRIMARY KEY     #主键,唯一的标识记录
FOREIGN KEY    #外键
NOT NULL        #字段不为空
UNIQUE KEY    #该字段的值是唯一的
AUTO_INCREMENT    #该字段值自动增长(整数类型,且为主键)
DEFAULT        #该字段设置默认值

UNSIGNED        #无符号
ZEROFILL        #使用0填充

使用说明:
#1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
#2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'

#必须为正值(无符号) 不允许为空 默认是20
age int unsigned not null default 20

# 3. 是否是key
主键    primary key
外键    foreign key
索引    (index,unique...)

  4.1 UNIQUE

中文翻译:不同的,在mysql中称为 单列唯一

实例:
使用约束条件unique,对公司部门字段进行设置
#第一种创建unique方式
create table department(
    id int,
    name char(10) unique
);

#第二种创建unique方式
create table department(
    id int,
    name char(10),
    unique(id),
    unique(name)
);

  联合唯一:

#创建services 表

create table services(
    id int,
    ip char(15),
    port int,
    unique(id),
    unique(ip,port)
);
# 联合唯一,只要两列记录,有一列不同,即符合联合唯一的约束

  4.2 primary key

一个表中可以:

单列做主键

多列做主键(复合主键)

约束:等价于 not null unique ,字段的值不为空且唯一

存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一个主键

  单列主键

#创建t14表,为id字段设置主键,唯一的不同记录.
#not null + unique = primary key
create table t14(
    id int primary key,
    name char(16)
);

  4.3 foreign key

一个表中的foreign key 指向另一表中的primary key

#下面的sql 在创建表时添加foreign key约束:

CREATE TABLE Person(
    P_Id    nt primary key auto_increment,
    Name    char(20),
    Address    char(50),
    City    char(20)
)

CREATE TABLE Orders(
    O_id int primary key auto_increment,
    OrderNo    int not null,
    P_Id    int,
    FOREIGN KEY(P_Id) REFERENCES Person(P_Id)
)

5、单表查询

一、单表查询语法:
SELECT 字段1,字段2 FROM 表名
                WHERE 条件
                GROUP BY field
                HAVING    筛选
                ORDER BY field
                LIMIT 限制条数

二、关键字的执行优先级(重点)
from
where
group by
having
select
distinct
order by
limit

1 找到表:from
2 拿着where指定的条件,去表中取出记录
3 将取出的记录进行分组group by,如果没有,则整体为一组
4 将分组结果进行having过滤
5 执行select
6 去重
7 将结果按条件排序order by
8 限制结果显示条数

  5.1 where约束

where子句中可以使用
1 比较运算符:> < >= <= <> !=
2 between 80 and 100 :值在80到100之间
3 in(10,20,30) 值是10或20或30
4 like '字符'
5 逻辑运算符:多个条件之间可以使用and or not

  5.2 group by分组查询

#需明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
#分组是:将所有记录按照某个相同字段进行归类,比如员工表的职位分组,性别分组等

#大前提
    可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需借助于聚合函数

  5.3 聚合函数

max()    求最大值
min()    求最小值
avg()    求平均值
sum()     求和
count()   求总个数

#强调:聚合函数聚合的是组的内容,若没有分组,则默认一组
#每个部门有多少个员工
select post,count(id) from employee group by post;
# 每个部门的最高薪水
select post,max(salary)  from employee group by post;
# 每个部门的最低薪水
select post,min(salary) from employee group by post;
# 每个部门的平均薪水
select post,avg(salary) from employee group by post;
# 每个部门的所有薪水
select post,sum(age) from employee group by post;

  5.4 having过滤

having 与 where不一样地方在于

#!!!执行优先级从高到低:where > group by > having

#1. where发生在分组group by之前
#2. having发生在分组group by之后,因而having可以使用分组的字段,可以使用聚合函数

6、多表查询

准备两张表,部门表(department)、员工表(employee)

create table department(
id int,
name varchar(20) 
);

create table employee(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

#插入数据
insert into department values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into employee(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('nvshen','male',18,200),
('xiaomage','female',18,204)
;
多表查询

多表连接查询

外链接语法:

SELECT 字段列表
        FROM  表1  
        INNER|LEFT|RIGHT  JOIN 表2  
        ON  表1.字段=表2.字段

(1)内连接:值连接匹配的行
#department没有204这个部门,因而employee表中关于204这条员工信息没有匹配
select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;


(2)外链接之左连接:优先显示左表全部记录
#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有,右边没有的结果
select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;


(3)外链接之右连接:优先显示右表全部记录
#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有,左边没有的结果
select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;

子查询

#1 子查询是将一个查询语句嵌套在另一个查询语句中
#2 内层查询语句的查询结果,可以为外层查询语句提供查询条件
#3 子查询中可包含:IN、NOT IN、ANY、ALL、EXISTS和NOT EXISTS等关键字
#4 还可包含运算符:=、!=、>、<等

 

posted @ 2018-08-03 11:39  叫你你敢答应么  阅读(85)  评论(0)    收藏  举报