1.分类

关联式资料库是用一个表格(主流存储方式)

2.sql (structured query language)

是一种语言,用来和关联式资料库沟通(用于创建资料库,修改资料,删除,增加..)

SQL是一种数据库语言,可以定义和操作数据库。

MySQL是一个全球流行的数据库,也是一个可以处理数据库的管理系统(RDBMS)有免费的版本而且适用面广

3.用mysql来学习sql语言

打开这个东西

sql_workbench(请自行官网安装)

[1]表格 & 键 tables & keys

主键可以唯一区分每一笔资料

外键的举例(表格之间的关联)

外键一定要对应到主键

外键也可以对应到自己表格的主键

也可以设定两个主键

资料库的表格设计是数据库存储数据的关键(key的对应)

4.sql语法

mysql是资料库管理系统

用sql来描述(管理)

[1]创建

先创建一个

CREATE DATABASE sql_tutorial

用`可以避免和关键词的区分

DROP DATABASE ....

用来删除

用下划线,然后闪电执行即可运行代码||用闪电旁边的可以自动运行光标所在的行

[2]创建资料库的表格

常见的资料形态

m:总共几位数,n是小数点占了几位

(3,2)2.33

字串的n 表示最大长度

eg:

CREATE TABLE `student`(
`student_id` INT PRIMARY KEY,#也有另外的写法
`name` VARCHAR(20),
`major` VARCHAR(20)
);
describe `student`;
dorp table `student`;//删除

另一种主关键词的写法

插入删除一个属性

alter table `student` add gpa decimal(3,2);
alter table `student` drop column gpa;

[3]储存资料 insert

填入资料的顺序要求是根据表格创建时属性的顺序

insert into `student` values(1,'小白','历史');
select * from `student`;#搜寻资料时的写法

*代表全部的意思(搜寻表格的资料)

未知的可以用null来表示

[4]限制、约束 constraint

CREATE TABLE `student`(
`student_id` INT PRIMARY KEY,#也有另外的写法
`name` VARCHAR(20) NOT NULL,
`major` VARCHAR(20) UNIQUE #表示这个值是唯一的
#`major` VARCHAR(20) DEFAULT '历史';
);

自动计数器

CREATE TABLE `student`(
`student_id` INT auto_increment primary KEY,
`name` VARCHAR(20),
`major` VARCHAR(20)
);
insert into `student` (`name`,`major`)values('小拉','英文');

[5]修改&删除资料 update & delete

首先更改设置

set SQL_SAFE_UPDATES=0;

更新的语法

update `student`
set `major`='英语文学'
where `major`='英文';

也可以用逻辑表达式

set后面也可以用多个参数

如果不写where那么所有的数据都会发生改变

数据资料的删除

delete from 'student'
where 'student_id'=1;
delete from 'student';#删除所有的资料

<>是sql中不等于

[6]取得资料 select

select * from student;#搜寻资料时的写法

取得部分属性

select `name` from `student` order by `score`;

分号前加DESC是降序排序

SELECT * FROM Websites
ORDER BY alexa DESC;
#双关键词的排序(有先后顺序)
SELECT * FROM Websites
ORDER BY country,alexa;
limit 2 ;

这个只输出2个结果

也可以加条件判断 :结尾加上where......

select * from `student` where `major`=`英语`

tip:

select * from `student` where `major`  in(`历史`,`英语`)

[7]创建公司资料库

(1)创建与插入

create table `branch`(
`branch_id` int primary key,
`branch_name` varchar(20),
`manager_id` int,
foreighn key (`mananger_id`) references `employee`(`emp_id`) on delete set null)

foreigh key的设定

create table `work_with`(
`emp_id` int,
`client_id` int,
`total_sales` int,
primary key(`emp_id`,`client_key`)
foreign key (`emp_id`) references `employee`(`emp_id`) on delete cascade,
foreign key (`client_id`) references `client`(`client_id`) on delete cascade
);

注意表格数据插入时的关联顺序和逻辑关系——一般而言是要求先创建底层的表格,如果有冲突的话,把数值还没有的东西改成Null

(2)select

order 排序

仅仅获得某一个属性

select `name` from `employee`;
select distinct `sex` from `employee`;#distinct 的用法
​

(3)聚合函数 aggregate function 更方便的取得资料库中的咨询

count函数(用于回传资料的笔数)

获取员工的人数

select count (*) from `employee`;

count 就是聚合函数的意思

select count (`sup_id`) from `employee`;
#寻找有suo_id的资料有几组()除掉null

取得所有出生于1970-01-01之后的女性员工人数

select count(*) from `employee` where `birth_date`>'1970-01-01' and 'sex'='F';

取得所有员工的平均薪水

select avg(`salary`) from `employee`;

取得所有员工的薪水总和

select sum(`salary`) from `employee`;

取得薪水最高的员工

select max(`salary`) from `employee`;

[8]万用字元 wildcard

%代表多个子元,_代表一个字元

取得电话尾号是335的客户

select * from `client` where `phone` like '%335';
select * from `client` where `phone` like '254%';
select * from `client` where `phone` like '%354%';#只要中间出现354就可以

取得姓艾的客户

select * from `client` where `client_id` like '艾%';

取得生日是12月的员工

select * from `employee` where `birth_date` like '_____12%';#前面是五个下划线

[9]联集 union

union的几个表格属性数目要求一致(而且资料形态也要求一致)

员工名字union客户名字

select `name` from `emplyee` union select `client_name` from `client`;

员工id+员工名字 union 客户id +客户名字

select `empl_id` +`name` from `emplyee` union select `client_id`+`client_name` from `client`;#此时显示出来表格的属性名称沿用第一个 即`empl_id` +`name`
​
更改属性的名称
select `empl_id` as `total_id` +`name` as `total_name` from `emplyee` union select `client_id`+`client_name` from `client`;
​

员工薪水union销售金额

select `salary` from `emplyee` union
select `total_sales` from `works_with`;

[10]连接 join

连接两个表格

获得所有部门经理的名字

select `emp_id`,`name`, `brach_name` from `employee` join `branch` on `emp_id`=`manager_id`;
​
​
select `emp_id`,`name`, `brach_name` from `employee` join `branch` on employee.`emp_id`=`manager_id`;#类似类的表达方式(前面加上表格的名称,可以描述的更准确)
​
​
select `emp_id`,`name`, `brach_name` from `employee` left join `branch` on `emp_id`=`manager_id`;#左边的表格无论如何都会回传,而右边的表格只有在条件成立的情况下才会回传

[11]子查询 subquery

在一个语句查询的结果 用于一个新的语句的查询

找出研发部门经理的名字(语句的嵌套)

select `name` from `employee` where `emp_id`=(select `manager_id` from `branch` where `barch_name`='研发');

找出一位客户销售金额超过5000的员工的名字

注意结果如果有多个则用in

select `name` from `employee` where `emp_id` in(
select `emp_id` from `works_with` where `total_sales`>50000);

[12]on delete(用于表格中foreign key被删除之后这个资料变化的形态(按需求设置))

foreighn key (`mananger_id`) references `employee`(`emp_id`) on delete set null

on delete set null

如果删除了emp_id 那么这个manager_id将会设置成null

foreign key (`client_id`) references `client`(`client_id`) on delete cascade

如果删除了client_id 那么这笔交易直接被删除

如果一个属性既是主键又是外键那么它就不可以被设置为

on delete set null

因为主键不能为null

[13]python 连接 MySQL

密码是123456

create.py

import mysql.connector
​
connection = mysql.connector.connect(host='localhost',
                                    port='3306',
                                    user='root',
                                    password='password')
​
cursor = connection.cursor()
​
# 創建資料庫
cursor.execute("CREATE DATABASE `database`;")
​
​
# 取得所有資料庫名稱
# cursor.execute("SHOW DATABASES;")
# records = cursor.fetchall()
# for r in records:
#     print(r)
​
​
# 選擇資料庫
# cursor.execute("USE `sql_tutorial`;")
​
​
# 創建表格
# cursor.execute('CREATE TABLE `qq`(qq INT);')
​
cursor.close()
connection.close()

select.py

import mysql.connector
​
connection = mysql.connector.connect(host='localhost',
                                    port='3306',
                                    user='root',
                                    password='password',
                                    database='sql_tutorial')
​
cursor = connection.cursor()
​
# 取的部門表格所有資料
cursor.execute('SELECT * FROM `branch`;')
​
records = cursor.fetchall()
for r in records:
    print(r)
​
cursor.close()
connection.close()

update.py

​
import mysql.connector
​
connection = mysql.connector.connect(host='localhost',
                                    port='3306',
                                    user='root',
                                    password='password',
                                    database='sql_tutorial')
​
cursor = connection.cursor()
​
# 新增
# cursor.execute("INSERT INTO `branch` VALUES(5, 'qq', NULL)")
​
​
# 修改
# cursor.execute('UPDATE `branch` SET `manager_id` = 206 WHERE `branch_id` = 4;')
​
​
# 刪除
# cursor.execute("DELETE FROM `branch` WHERE `branch_id` = 5;")
​
​
cursor.close()
connectionmit()#!!!!!注意这边特殊要commit一下
connection.close()

更多推荐

sql全新手教程(全站首发)