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

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就可以

【sql|sql全新手教程(全站首发)】取得姓艾的客户
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() connection.commit()#!!!!!注意这边特殊要commit一下 connection.close()


    推荐阅读