win32-mysql配置
将win32-mysql放到某个目录下
在配置环境变量
C:\mysql\lib;C:\mysql\bin加入环境变量
远程连接ubuntu下mysql:
1、vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1
注释掉这行,如:#bind-address = 127.0.0.1
或者改为: bind-address = 0.0.0.0
允许任意IP访问;
或者自己指定一个IP地址。
重启 MySQL:sudo /etc/init.d/mysql restart
2、要连接远端mysql,需要将端口3306可访问
安装ufw
sudo apt-get install ufw
添加规则
sudo ufw allow 3306/tcp
//设置数据库密码
set password=password('sysheng');
//创建新数据库
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset_name];
//使用数据库
USE db_name;
//删除数据库
DROP DATABASE db_name;
//创建新用户
USE mysql;
GRANT ALL ON db_name.* TO user_name IDENTIFIED BY 'password';
例如
GRANT ALL ON db1.* TO dbuser1 IDENTIFIED BY 'sysheng';
//登录mysql后
SET NAMES utf8;
统一字符集:
1//首先操作系统的字符集为utf8
2//查看操作系统字符集命令 locale
3//创建数据库的时候使用CHARACTER SET utf8;指定字符集为utf8
4//设置mysql_client字符集为utf8
//SET NAMES命令为设置mysql环境的字符集
//常用的字符集有
--gbk,gb2312,big5,utf8,ascii
source script_name.sql //source命令为执行一个sql脚本
例子:
CREATE DATABASE db1 CHARACTER SET utf8;
USE db1;
//sql是面试的重点 //建表语句 CREATE TABLE table2 ( name varchar(20), sex char(10), age INT, class varchar(20), ) //查找表结构 desc tablename; //插入数据 INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜0', '男', 12, '1214'); INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜1', '女', 12, '1214'); INSERT INTO table1 (name, sex, age, class) VALUES ('苏永胜2', '男', 12, '1214'); //查找语句 SELECT name FROM table1; SELECT name FROM table1 LIMIT 0,5; SELECT * FROM table1 WHERE age > 21 AND age < 30; SELECT * FROM table1 WHERE age = 12; SELECT * FROM table1 WHERE name LIKE '苏%'; *mysql查询百万级别的数据速度还行,达到亿级的数据可能有点吃力 对于SELECT语句中的逻辑判断操作符一定要灵活使用,熟练 SELECT * FROM table1 WHERE age in (12, 118); SELECT * FROM table1 WHERE age NOT IN (12, 118); SELECT * FROM table1 WHERE name NOT LIKE '苏%'; //window 访问远程mysql window中加入path环境变量 C:\mysql\lib;C:\mysql\bin mysql端口号3306, 要在linux中将3306添加到防火墙的信任端口列表中 登入远程mysql命令: mysql -h IP -u 用户名 -p 列的别名 SELECT name 姓名, sex 性别, age 年龄 FROM table1; 表别名 SELECT a.name, a.sex FROM table1 a; //聚合函数 //DISTINCT 去掉重复项 SUM([DISTINCT] FILE) //求指定列的和 MAX MIN AVG COUNT SELECT SUM(age) FROM table1; SELECT SUM(DISTINCT age) FROM table1; //去掉重复值 SELECT MAX(age) FROM table1; SELECT name FROM table1 WHERE age = (SELECT MAX(age) FROM table1); SELECT name, MAX(age) FROM table1; SELECT COUNT(*) from table1; SELECT COUNT(DISTINCT *) FROM table1; SELECT * FROM table1 GROUP BY age; //聚合函数往往是和group by子句配合使用的 SELECT COUNT(class), class FROM table1 GROUP BY class; //ORDER BY SELECT * FROM table1 ORDER BY age, name desc; //多表查询 SELECT * FROM table1, table2 WHERE table1.age = table2.age; CREATE TABLE table3( teacher varchar(100), class varchar(100) ); INSERT INTO table3 (teacher, class) VALUE ('aaa', '1214'); //创建索引 在不读取整个表的情况下,索引是数据库应用程序可以更快的查找数据 可以在表中创建索引,以便加快索引速度,数据库会自动用索引 //CREATE INDEX CREATE INDEX index name ON table name (column name) //culumn name规定需要索引的列 //CREATE UNIQUE INDEX语法(唯一索引,保证字段没有重复) CREATE UNIQUE INDEX index name ON table name (column name); //例子 CREATE INDEX table1_age ON table1 (age); //在select语句中where查询用到那个字段,这个字段就必须建立索引 //SQL语句的重点是SELECT WHERE条件和多表查询 对于SELECT后面的WHERE子句中用到的字段,原则是必须建相应的索引,索引不要乱建,精准,不能多 索引可以提高SELECT语句的速度,但代价是降低了INSERT,UPDATE和DELETE语句的速度 //修改数据语句 UPDATE TABLENAME SET CLA1=VAL WHERE CAL =; //删除语句 DELETE FROM table1 where name=' '; //数据库编程 #include <mysql/mysql.h> 数据库clinet与server也是采用TCP协议, 1、初始化client 2、建立连接 3、接收和发送(客户端向server发送SQL,server将执行SQL语句的结果返回给client) 4、断开连接 //数据库编程样例 #include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> //包含mysql头文件 #include <unistd.h> #include <string.h> #include <errno.h> int main(void) { MYSQL mysql; MYSQL *conn; int status; mysql_init(&mysql); //初始化mysql,相当于mysql内部初始化了一个TCP的socket //连接到mysql server conn = mysql_real_connect(&mysql, "127.0.0.1", "dbuser1", "sysheng", "db1", 0, 0, 0); if(conn == NULL) { printf("connect error, %s\n", mysql_error(&mysql)); return -1; } status = mysql_query(conn, "SET NAMES utf8"); if(status != 0) { printf("query error.%s\n", mysql_error(&mysql)); return -1; } char SQL[1024]; char name[1024]; memset(SQL, 0, sizeof(SQL)); sprintf(SQL, "%s", "请输入要干掉的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL)); //这句话是替代printf函数的,这样不许 需要\n也可以向屏幕输出 memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name)); //等待用户输入 memset(SQL, 0, sizeof(SQL)); name[strlen(name)-1] = 0; //将字符串最后一位\n替换为0 //等待用户输入要删除的名字,假设用户输入的 sprintf(SQL, "DELETE FROM table1 WHERE name = '%s';", name); printf("%s\n", SQL); status = mysql_query(conn, SQL); mysql_close(conn);//关闭连接 puts("Hello World!!\n"); return EXIT_SUCCESS; } 命令 stty erase ^H 按退格键不回显 ////////////去掉退格键回显代码//////////////////// void strattr() { struct termios term; //定义一个temions结构 if(tcgetattr(STDIN_FILENO, &term) == -1) { printf("tcgetattr error is %s\n", strerror(errno)); return; } //oldterm = term //保留termios设置,以便程序退出时候可以恢复 /* term.c_lflag &= ~ICANON; //取消ICANON选项(不规范输入) term.c_lflag |= ICANON; //设置ICANON选项(规范输入) term.c_cc //字段为要设置的具体特殊输入字符,如c_cc[VERASE]代表退格键 term.c_cc[VERASE] = '\b';意思为把退格键修改为'\b' VERASE代表向前擦出一个字符,VINTR代表ctrl+C中断信号,ctrl+C的ASII码为3 例如:term_c_cc[VINTR] = '\t';意思为将tab键设置为终端信号 tcsetattr中,第二个参数说明,TCSAFLUSH:发送了所有输出后更改才生效,在更改发生时,未读取的所有输入数据都被删除 TCSANOW:更改立即生效 TCSADRAIN:发送了所有输出后更改才发生,如果更改输出参数则应该使用该选项 */ term.c_cc[VERASE] = '\b'; //'\b'为退格键的ASCII码 if(tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1) { printf("tcsetattr error is %s\n", strerror(errno)); } return ; } //执行SELECT语句得到查询结果,成功返回一个查询结果指针,查询无结果或者错误返回NULL MYSQL_RES result = *mysql_store_result(MYSQL *pmysql); //调用完mysql_store_result,一定要用mysql_free_result释放相关的资源 //查看查询结果 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) //例子 MYSQL_ROW row; while(row = mysql_fetch_row(result) != NULL) { printf("name:%s,sex:%s,age:%s,class:%s\n", row[0], row[1], row[2], row[3]); } //尽管在表中age是数字,但mysql返回的只不过是以NULL结尾的字符串 //查看查询中的字段信息 MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); //例子 while((sqlField = mysql_fetch_field(result)) != NULL) { printf("%s\n", sqlField->name); } mysql_fetch_row 返回的是记录(行) mysql_fetch_field返回的是字段(列) //心得 模块化的时候,如果写一个函数还没有具体思想的时候,函数可以没有返回值,也没有参数,逐步的完善