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个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。

主键约束
主键是用于唯一标识一条记录的约束,如同身份证。
主键有两个约束:非空且唯一!
时间: 2024-08-04 12:07:27

python_day11 mysql的相关文章

记一次MySQL找回用户数据

事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出结论:本来只需要更新微信号的,结果我们公司的流程系统管理员把用户先删除,再创建了新的用户. 解决过程 1.首先想到的是直接从定时备份数据里面找回原来的用户ID,结果发现系统只备份了十天的记录,而工作流系统上显示销售C只有8月3号以后的流程记录,距今已经40多天,从自动备份的数据里已经无法恢复. 2.

centos7下使用yum安装mysql

CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2. 安装mysql-community-release-el7-5.noarch.rpm包 $ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm 安装这个

EF+mvc+mysql

这个真是一个大坑啊.TM折腾了一下午终于弄好了.赶紧记录下来分享给大家,免得有和我一样一直配置不成功的又折腾半天-.1.安装MySQL for Visual Studio这个直接在mysql官网下载并安装就好了.不过这个必须是vs2013 professional版本以上才可以!!2.安装MySQL Connector/Net这个可以可以通过NuGet工具获得,比较轻松愉快,当然你也可以自己下载,自己引用.3.配置web.config.首先是connectionStrings节点 1 <conn

Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!

问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示:  Query OK, 1 row affected, 1 warning (0.00 sec)    表明出现错误,没有插入成功,然后执行select * from 表名   就会出现如下的问题:显示的表中出现乱码或者问号. 如图: 解决方案: 首先重新打开一个终端窗口(方便操作),进入root用户模式 执行

Centos6.5 zabbix3.2.6监控mysql

  一.     操作环境 我使用的linux系统是centos6.5,数据库是mysql5.6,apache2.4,php5,6 安装目录: /usr/local/apache /usr/local/php /usr/local/mysql /usr/local/zabbix Zabbix服务器插件安装 Zabbix3.2.6自带监控mysql模板监控项不全面,所以重新下载导入到zabbix里面 下载网址:. https://www.percona.com/downloads/percona-

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

Mac配置Mysql遇到的 --secure-file-priv问题

1.安装mysql 在官网上安装,一步步无障碍安装(但根据后来文件入法导入/导出的经验,最好在安装前设置secure-file-priv为empty,5.7.6之后似乎就默认为NULL,而secure-file-prive为NULL的话,就不支持文件导入/出) 2.安装navicat premimum 在网上找到一个破解版,按照破解步骤来安装,很好用 3.遇到的问题:在将选择的记录导出到.csv文件时,出现提示"The MySQL server is running with the --sec

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中