python_day11 mysql

计划安排:
1. mysql
2. 前端(html/css)
3. css
4. js
5. jquery
6,7,8. django基础
应用:Web、爬虫
知识点:
    sql语句规范
    数据类型
    数据库操作
    数据表操作
    表记录操作
    查询表记录(select)
    多表查询
    完整性约束
sql语句规范:
<1> 在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。建议命令大写,表名库名小写;
<2> SQL语句可单行或多行书写,以“;”结尾。关键词不能跨多行或简写。
<3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。
SELECT * FROM tb_table
            WHERE NAME="YUAN";
<4> 注释:单行注释:--
               多行注释:/*......*/
<5>sql语句可以折行操作

数据库系统:
数据库:文件夹
数据表:文件      
表记录:一条数据
数据库管理软件
mysql  : 开源 
oracle 
sqlserver
mysql : 
服务端: mysqld
客户端: cmd  php  python

数据库操作:
-- 1.创建数据库(在磁盘上创建一个对应的文件夹)
    create database [if not exists] db_name [character set xxx] 
-- 2.查看数据库
    show databases;查看所有数据库
    show create database db_name; 查看数据库的创建方式
-- 3.修改数据库
    alter database db_name [character set xxx] 
-- 4.删除数据库
    drop database [if exists] db_name;    
-- 5.使用数据库
    切换数据库 use db_name; -- 注意:进入到某个数据库后没办法再退回之前状态,但可以通过use进行切换
    查看当前使用的数据库 select database();

数据表操作:
-- 语法
CREATE TABLE tab_name(
            field1 type[完整性约束条件],
            field2 type,
            ...
            fieldn type
        )[character set xxx];
CREATE TABLE employee(
            id int primary key auto_increment ,
            name varchar(20),
            gender bit default 1,
            birthday date,
            department varchar(20),
            salary double(8,2) unsigned,
            resume text
          );
查看表信息:
    desc tab_name              查看表结构
    show columns from tab_name      查看表结构
    show tables             查看当前数据库中的所有的表
    show create table tab_name      查看当前数据库表建表语句 
修改表结构:
 -- (1)增加列(字段)
      alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名];      
      #添加多个字段
      alter table users2 
            add addr varchar(20),
            add age  int first,
            add birth varchar(20) after name;
   -- (2)修改一列类型
      alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名];
      -- (3)修改列名
      alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];
     -- (4)删除一列
      alter table tab_name drop [column] 列名;-- (5)修改表名
      rename table 表名 to 新表名;
   -- (6)修该表所用的字符集    
      alter table student character set utf8;
删除表:
drop table tab_name;

表记录操作:
增加表记录:
<1>插入一条记录:
  insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
<2>插入多条记录:
  insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......),                                       (value1,value2,.......), 
        ...                               ;
<3>set插入:
  insert [into] tab_name set 字段名=值  
INSERT employee (name,gender,birthday,salary,department) VALUES
                      ("alex",1,"1985-12-12",8000,"保洁部"),
                      ("egon",1,"1987-08-08",5000,"保安部"),
                      ("yuan",1,"1990-06-06",20000,"教学部");
INSERT employee VALUES (8,"女神",0,"1992-02-12","教学部",7000,"");
INSERT employee SET name="wusir",birthday="1990-11-11";   
修改表记录:
update tab_name set field1=value1,field2=value2,......[where 语句]
update employee_new set birthday="1989-10-24" WHERE id=1;
--- 将yuan的薪水在原有基础上增加1000元。
update employee_new set salary=salary+4000 where name='yuan';
删除表记录:
方式1:
delete from tab_name [where ....]
方式2:
truncate table emp_new;
            /*    
            如果不跟where语句则删除整张表中的数据
            delete只能用来删除一行记录
            delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
            TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在
            事务中恢复。
            */
-- 删除表中名称为’alex’的记录。
   delete from employee_new where name='alex';
-- 删除表中所有记录。
   delete from employee_new;
-- 注意auto_increment没有被重置:alter table employee auto_increment=1;
查询表记录:
-- 查询语法:
   SELECT *|field1,filed2 ...   FROM tab_name
                  WHERE 条件
                  GROUP BY field
                  HAVING 筛选
                  ORDER BY field
                  LIMIT 限制条数
-- Mysql在执行sql语句时的执行顺序:
                -- from  where  select  group by  having order by
CREATE TABLE emp(
    id       INT PRIMARY KEY AUTO_INCREMENT,
    name     VARCHAR(20),
    gender   ENUM("male","female","other"),
    age      TINYINT,
    dep      VARCHAR(20),
    city     VARCHAR(20),
   salary    DOUBLE(7,2)
);


INSERT INTO emp (name,gender,age,dep,city,salary) VALUES
                ("yuan","male",24,"教学部","河北省",8000),
                ("egon","male",34,"保安部","山东省",8000),
                ("alex","male",28,"保洁部","山东省",10000),
                ("景丽阳","female",22,"教学部","北京",9000),
                ("张三", "male",24,"教学部","河北省",6000),
                ("李四", "male",32,"保安部","北京",12000),
                ("王五", "male",38,"教学部","河北省",7000),
                ("赵六", "male",19,"保安部","河北省",9000),
                ("猪七", "female",24,"保洁部","北京",9000);

SELECT  * FROM emp;
准备表和数据
where子句:过滤查询
-- where字句中可以使用:
         -- 比较运算符:
                        > < >= <= <> !=
                        between 80 and 100 值在10到20之间
                        in(80,90,100) 值是10或20或30
                        like 'yuan%'
                        /*
                        pattern可以是%或者_,
                        如果是%则表示任意多字符,此例如唐僧,唐国强
                        如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__
                        */
         -- 逻辑运算符
                        在多个条件直接可以使用逻辑运算符 and or not
-- 查询年纪大于24的员工
SELECT * FROM emp WHERE age>24;
-- 查询教学部的男老师信息
SELECT * FROM emp WHERE dep="教学部" AND gender="male";

order:排序
按指定的列进行,排序的列即可是表中的列名,也可以是select语句后指定的别名。
-- 语法:
select *|field1,field2... from tab_name order by field [Asc|Desc]
         -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
-- 按年龄从高到低进行排序
SELECT * FROM emp ORDER BY age DESC ;
-- 按工资从低到高进行排序
SELECT * FROM emp ORDER BY salary;

group by:分组查询(*****)
GROUP BY 语句根据某个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG等函数进行相关查询。
-- 语法:
  SELECT column_name, function(column_name)
        FROM table_name
        WHERE column_name operator value
        GROUP BY column_name;
-- 查询男女员工各有多少人
SELECT gender 性别,count(*) 人数 FROM emp5 GROUP BY gender;
 -- 查询各个部门的人数
 SELECT dep 部门,count(*) 人数 FROM emp5 GROUP BY dep;
 -- 查询每个部门最大的年龄
 SELECT dep 部门,max(age) 最大年纪 FROM emp5 GROUP BY dep;
 -- 查询每个部门年龄最大的员工姓名
 SELECT * FROM emp5 WHERE age in (SELECT max(age) FROM emp5 GROUP BY dep);
 -- 查询每个部门的平均工资
 SELECT dep 部门,avg(salary) 最大年纪 FROM emp GROUP BY dep;
 --  查询教学部的员工最高工资:
 SELECT dep,max(salary) FROM emp11 GROUP BY dep HAVING dep="教学部";
 -- 查询平均薪水超过8000的部门
 SELECT dep,AVG(salary) FROM  emp GROUP BY dep HAVING avg(salary)>8000;
 --  查询每个组的员工姓名
SELECT dep,group_concat(name) FROM emp GROUP BY dep;
 -- 查询公司一共有多少员工(可以将所有记录看成一个组)
 SELECT COUNT(*) 员工总人数 FROM emp;
                   -- KEY: 查询条件中的每个后的词就是分组的字段

limit记录条数限制
SELECT * from ExamResult limit 1;
SELECT * from ExamResult limit 2,5;        --  跳过前两条显示接下来的五条纪录
SELECT * from ExamResult limit 2,2;

正则表达式
SELECT * FROM employee WHERE emp_name REGEXP '^yu';
SELECT * FROM employee WHERE emp_name REGEXP 'yun$';
SELECT * FROM employee WHERE emp_name REGEXP 'm{2}';
CREATE TABLE emp(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    salary DOUBLE(7,2),
    dep_id INT
);

INSERT INTO emp (name,salary,dep_id) VALUES ("张三",8000,2),
                                            ("李四",12000,1),
                                            ("王五",5000,2),
                                            ("赵六",8000,3),
                                            ("猪七",9000,1),
                                            ("周八",7000,4),
                                            ("蔡九",7000,2);

CREATE TABLE dep(
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(20)
);


INSERT INTO dep (name) VALUES ("教学部"),
                              ("销售部"),
                              ("人事部");
多表查询-表创建
1.笛卡尔积查询    
select * from emp,dep;
2、内连接
查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。    
SELECT * FROM emp,dep WHERE emp.dep_id=dep.id;
OR
SELECT * FROM emp INNER JOIN dep ON emp.dep_id=dep.id;
-- 查询李四所在的部门名称
SELECT emp.name,dep.name FROM  emp INNER JOIN dep ON emp.dep_id=dep.id WHERE emp.name="李四";
-- 查询销售部所有员工姓名以及部门名称
-- SELECT name FROM  emp WHERE dep_id in (SELECT id FROM dep WHERE name="销售部");
SELECT emp.name,dep.name FROM  emp INNER JOIN dep ON emp.dep_id=dep.id WHERE dep.name="销售部";
3、外连接
--(1)左外连接:在内连接的基础上增加左边有右边没有的结果 
 SELECT * FROM emp LEFT JOIN dep ON dep.id=emp.dep_id;
--(1)外右连接:在内连接的基础上增加右边有左边没有的结果
    SELECT * FROM emp RIGHT JOIN dep ON dep.id=emp.dep_id;

完整性约束
完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 。直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作
唯一约束
唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值。
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE。
CREATE TABLE t5(
  id   INT AUTO_INCREMENT,
  name VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY UK_t5_name (name)
);
-- 建表后添加约束:
alter table t5 add constraint UK_t5_name unique (name);
-- 如果不需要唯一约束,则可以这样删除
ALTER TABLE t5 DROP INDEX UK_t5_name;
添加约束和删除约束
-- 创建唯一约束:
create unique index UK_t5_name on t5 (name);
 -- 建表后添加约束:
 alter table t5 add constraint UK_t5_name unique (name);
 -- 如果不需要唯一约束,则可以这样删除
 ALTER TABLE t5 DROP INDEX UK_t5_name;

自增约束
MySQL 每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。

主键约束
主键是用于唯一标识一条记录的约束,如同身份证。
主键有两个约束:非空且唯一!
创建主键
-- 方式1
CREATE TABLE t1(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20)
);
-- 方式2
CREATE TABLE t2(
  id INT NOT NULL,
  name VARCHAR(20)
);
注意:
1、一张表中最多只能有一个主键
2、表中如果没有设置主键,默认设置NOT NULL的字段为主键;此外,表中如果有多个NOT NULL的字段,则按顺序将第一个设置NOT NULL的字段设为主键。
结论:主键一定是非空且唯一,但非空且唯一的字段不一定是主键。
3、主键类型不一定必须是整型

添加主键和删除主键
-- 添加主键<br>alter table tab_name add primary key(字段名称,...) <br>
-- 删除主键<br>alter table users drop primary key;
 注意,如果主键是AUTO_INCREMENT,需要先取消AUTO_INCREMENT,因为AUTO_INCREMENT只能加在KEY上。
CREATE TABLE test(num INT PRIMARY KEY AUTO_INCREMENT);<br>
 -- 思考,如何删除主键?
    ALTER TABLE test modify id int;   -- auto_increment没了,但这样写主键依然存在,所以还要加上下面这句
    ALTER TABLE test drop primary key;-- 仅仅用这句也无法直接删除主键

复合主键
所谓的复合主键 就是指你表的主键含有一个以上的字段。
如果一列不能唯一区分一个表里的记录时,可以考虑多个列组合起来达到区分表记录的唯一性,形式
①创建时:
create table sc (
    studentid int,
    courseid int,
    score int,
primary key (studentno,courseid)
);        
②修改时:
alter table tb_name add primary key (字段1,字段2,字段3);

外键约束
外键语法
外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
                    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
 该语法 可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

ALTER TABLE emp ADD CONSTRAINT dep_fk_emp
                    FOREIGN KEY (dep_id)
                    REFERENCES  dep(id);
原文地址:https://www.cnblogs.com/liweijing/p/7508296.html